tableau调用python脚本3--爬虫
前言:
之前写了个查价的爬虫,每天定时运行的,这时候业务又有新需求来了:要求能够自己随时运行爬虫,并查看抓取结果
想了想,最省事的方法是把爬虫的源代码给到业务让他们什么时候想运行的时候就什么时候运行,但是他们不懂技术,也不懂怎么运行,还得安装解释器,这些对他们来说都是比较有难度的事情,所以决定给他们做一款产品。
首先分析一下该需求:
- 需要有一个调用爬虫的地方
- 需要有一个展示结果的地方
- 需要有一个运行爬虫的地方
其实首先想到的是如果没有现有的产品可用,那就做个网页吧,但是网页需要前端后端完全做好非常耗时间,短则3、5天,长则超过一星期才能做好
这时候想到了tableau,tableau有几个重要的优点
- tableau展示数据非常强大
- tableau可以调用python
- 现成的产品,使用简单,开发效率高
既然tableau可以调用python,python又可以运行爬虫,那就说明tableau是有办法做成爬虫的启动器和数据展示的地方.
正式开始
一、 包装爬虫并部署到linux服务器 1.1 包装爬虫 1.2 部署 二、 tableau调用部署好后的爬虫 2.1 打开tableau 2.2 新建一个参数:服务日期,这个日期是要传递给爬虫的日期 2.3 新建一个计算字段:启动爬虫 写下如下内容 2.4 把这个计算字段拖到文本标签上 2.5 给这个工作簿明个名:启动爬虫 2.6 新建一个工作簿:数据展示 用来展示数据用 三、 数据展示 3.1 把相应的字段拖到工作薄里展示 3.2 回到启动爬虫工作薄修改服务日期,这时候爬虫就开始启动 3.3 回到数据展示工作薄,看到数据已经刷新好了 附:tableau调用爬虫工作流程图
一、包装爬虫并部署到linux服务器
linux服务器已运行tabpy-server,不懂怎么部署和运行的可以参照之前文章
1.1 包装爬虫
我的爬虫是一个爬虫类叫Ydj,随便起的名字,这个爬虫是一个查询某网站接机价格的爬虫,输入一个日期date参数(比如2020-03-15),传递给爬虫类Ydj,运行access-ydj()方法后爬虫便开始抓取这个站点3月15号的接机价格数据,运行后没有返回值,爬虫类自动把数据储存到数据库,最终返回给tableau的是最后一句,中间的是日期校验,如果日期选择的不对,爬虫就不运行了,直接给tableau返回错误信息
def spider_jsj(number, date):
length = len(number)
print(date)
date = date[0]
if date<=arrow.now().format('YYYY-MM-DD'):
err_msg=random.choice(date_err_msg)
return [err_msg for i in number]
print('number:', length, 'days', date)
ydj= Ydj(date)
ydj.access_ydj()
return [f'数据抓取完毕,点击查看 {date} 接送机数据' for a in number]
err_msg是一个列表,我自己定义了一些错误的提示信息,比如:
date_err_msg = [
'你给的日期有问题啊,大妹子,你确定你不是故意的?',
'换个日期再试试',
'注意日期,严肃严谨!!',
r"""
_-~~~-_ _-~~~-_
/~ ~ : ,
' ~ , |: :
{ /~~ :--~~~~~.: :
(... : /^ /^ ;
~_____ | | | |:~
/ |__O|_|O|;
( / O I`m Squidward
( `_______/) This is my toy
` / Then it will belong to you
) ~-------~'
/
: ||
| | ||
| |.======[]==+'|
(~~~~) | |~)
/ | |
~ ___/)______/^__|_/
` // | | | |
`__//' | | | |
~~ (~~~~) (~~~)
/ =..' =_
|__________)________)"""
]
1.2 部署
if __name__ == '__main__':
client = tabpy_client.Client('http://localhost:9004')
client.deploy('spider_jsj_ydj_old', spider_jsj, override=True)
然后把文件上传到服务器上,随便放哪都行,然后在服务器上执行py:
[root@hotel-query-6-38 data]# python ydj_jsj.py
[root@hotel-query-6-38 data]#
如果不报错就说明部署成功,部署失败要么是语法问题,要么是tabpy-server没启动,要么是没有加上参数override=True
二、tableau调用部署好后的爬虫
2.1 打开tableau
2.2 新建一个参数:服务日期,这个日期是要传递给爬虫的日期
2.3 新建一个计算字段:启动爬虫 写下如下内容
SCRIPT_str("
import arrow
print('='*40)
print(f'当前时间:{arrow.now()}')
return tabpy.query('spider_jsj_ydj_old',_arg1,_arg2)['response']
"
,attr([序号]),attr([服务日期]))
传递给这个计算字段两个参数,服务日期和序号
spider_jsj)只留一个date参数即可,这个参数现在基本没什么作用,我留着以后用来控制抓取的数据量用的
2.4 把这个计算字段拖到文本标签上
这个时候应该只有一个单元格单元格,日期可以先调整为2020-02-26(今天),这样爬虫不会启动,不需要等待,服务器会直接返回之前配置的错误信息(之前爬虫里配置的date_err_msg列表)
把这个单元格调大点,字体也调大点,看起来美观就好
2.5 给这个工作簿明个名:启动爬虫
2.6 新建一个工作簿:数据展示 用来展示数据用
新建一个数据源,连接到爬虫保存的数据库,从库里读取文件
连接方式:实时
Ps:前提是已经建好对应的库表,爬虫已经可以自动往库里写数据
三、数据展示
3.1 把相应的字段拖到工作薄里展示
3.2 回到启动爬虫工作薄修改服务日期,这时候爬虫就开始启动
出现这个提示说明tableau已经调用爬虫,爬虫正在抓取中,抓取完毕,这个对话框就会消失
3.3 回到数据展示工作薄,看到数据已经刷新好了
如果数据没有刷新,可以手动点击刷新按钮,数据就会刷新
也可以创建一个仪表板,把启动爬虫工作薄放进去,调整个美观的格式,还可以添加操作,点击启动爬虫仪表板跳转到数据展示工作薄(工作表>操作>添加操作>转到工作表),当爬虫运行完毕点击当前仪表板就可以自动跳转到数据展示工作薄
好了,现在我把这个仪表板上传到服务器上,业务人员就可以随时访问爬虫并查看数据了,整个过程不到1天时间,效率非常高,老铁,感兴趣就试试把~!
错误反馈(胖了)
正确反馈
其实还有一种方法是不经过数据库中转,把爬虫抓取的数据直接返回给tableau,tableau直接展示,这样可以少去数据写入在读出的过程,但有一个致命的问题格式很难调,如下图:
这个方法效率虽然高了点,但调格式用了一天,还有些小BUG 0.0. 只是为了实现功能可用这个方法
附:tableau调用爬虫工作流程图