按照上一篇文章中我们将代码放到远程主机是通过拷贝或者git的方式,但是如果考虑到我们又多台远程主机的情况,这种方式就比较麻烦,那有没有好用的方法呢?这里其实可以通过scrapyd,下面是这个scrapyd的github地址:https://github.com/scrapy/scrapyd
当在远程主机上安装了scrapyd并启动之后,就会再远程主机上启动一个web服务,默认是6800端口,这样我们就可以通过http请求的方式,通过接口的方式管理我们scrapy项目,这样就不需要在一个一个电脑连接拷贝过着通过git,关于scrapyd官方文档地址:http://scrapyd.readthedocs.io/en/stable/
安装scrapyd
安装scrapyd:pip install scrapyd
这里我在另外一台ubuntu linux虚拟机中同样安装scrapy以及scrapyd等包,保证所要运行的爬虫需要的包都完成安装,这样我们就有了两台linux,包括上篇文章中我们已经有的linux环境
在这里有个小问题需要注意,默认scrapyd启动是通过scrapyd就可以直接启动,这里bind绑定的ip地址是127.0.0.1端口是:6800,这里为了其他虚拟机访问讲ip地址设置为0.0.0.0
scrapyd的配置文件:/usr/local/lib/python3.5/dist-packages/scrapyd/default_scrapyd.conf
这样我们就可以通过浏览器访问:
关于部署
如何通过scrapyd部署项目,这里官方文档提供一个地址:https://github.com/scrapy/scrapyd-client,即通过scrapyd-client进行操作
这里的scrapyd-client主要实现以下内容:
- 把我们本地代码打包生成egg文件
- 根据我们配置的url上传到远程服务器上
我们将我们本地的scrapy项目中scrapy.cfg配置文件进行配置:
我们其实还可以设置用户名和密码,不过这里没什么必要,只设置了url
这里设置url一定要注意:url = http://192.168.1.9:6800/addversion.json
最后的addversion.json不能少
我们在本地安装pip install scrapy_client,安装完成后执行:scrapyd-deploy
看到status:200表示已经成功
关于常用操作API
listprojects.json列出上传的项目列表
listversions.json列出有某个上传项目的版本
schedule.json远程任务的启动
下面我们启动的三次就表示我们启动了三个任务,也就是三个调度任务来运行zhihu这个爬虫
同时当启动完成后,我们可以通过页面查看jobs,这里因为我远端服务器并没有安装scrapy_redis,所以显示任务是完成了,我点开日志并能看到详细的日志情况:
这里出错的原因就是我上面忘记在ubuntu虚拟机安装scrapy_redis以及pymongo模块,进行
pip install scrapy_redis pymongo安装后重新启动,就可以看到已经在运行的任务,同时点开Log日志也能看到爬取到的内容:
listjobs.json列出所有的jobs任务
上面是通过页面显示所有的任务,这里是通过命令获取结果
cancel.json取消所有运行的任务
这里可以将上面启动的所有jobs都可以取消:
这样当我们再次通过页面查看,就可以看到所有的任务都是finshed状态:
我相信看了上面这几个方法你一定会觉得真不方便还需要输入那么长,所以有人替你干了件好事把这些API进行的再次封装:https://github.com/djm/python-scrapyd-api
关于python-scrapyd-api
该模块可以让我们直接在python代码中进行上述那些api的操作
首先先安装该模块:pip install python-scrapyd-api
使用方法如下,这里只演示了简单的例子,其他方法其实使用很简单按照规则写就行:
from scrapyd_api import ScrapydAPI scrapyd = ScrapydAPI('http://192.168.1.9:6800') res = scrapyd.list_projects() res2 = scrapyd.list_jobs('zhihu_user') print(res) print(res2)
做什么事情都需要不断地坚持下去,编程也一样。现在python语言十分火热,职场对python的需求也很高,薪资待遇都很棒。所以希望大家能够坚持学习,‘剩’者为王,坚持下来的人才有资格称王。如果你觉得本文对你的学习有帮助的话,不妨点个关注,我会持续更新。