部署前准备工作
一:说明:
-
scrapy
框架相关爬虫代码不提供说明, 对于scrapyd
的配置会有说明。 - 对于
scrapyd
是对分布式的爬虫进行管控的插件,有web
页面展示,不过只能通过api
对其执行启动暂停等操作,建议使用Qt
或者web
来操控爬虫。 - 虽然说是分布式的爬虫,建议对
scrapy
框架的爬虫都进行部署, 因为可能会涉及到后期的增量等抓取, 总是去服务器找爬虫文件也不是很方便。 - 我这边用到服务器说明, A和B对服务器进行编号:
- A1:redis和mongo的服务器一台(redis用于分布式的master,mongo用于存储抓取的源数据,这台大内存大硬盘没办法, 有合适的服务器的话可以将mongo迁出去),
- B1,B2:2台爬虫服务器(主要执行爬虫,两台上均需要安装scrapyd)
二:环境说明
python3.7
centos7
python开发与部署建议使用虚拟环境
B1
和B2
服务器要正常安装scrapy框架所需的模块
部署相关操作说明
一:scrapyd
服务相关
-
安装
scarpyd
, 在集群slave(B1和B2服务器) 执行,记得激活虚拟环境pip install scrapyd
-
启动
scrapy
scrapyd
-
配置scrapyd参数
此时仅能本机访问改web页面, 如需局域网或者外网打开配置文件,在虚拟环境的安装目录下。具体路径自行修改
vim /usr/local/pyvenv/scrapy_env/lib64/python3.7/site-packages/scrapyd/default_scrapyd.conf
配置文件相关说明:当前仅需修改第12行说明处
[scrapyd] eggs_dir = eggs logs_dir = logs items_dir = jobs_to_keep = 5 dbs_dir = dbs max_proc = 0 max_proc_per_cpu = 4 finished_to_keep = 100 poll_interval = 5.0 # 修改监听端口为0.0.0.0 初始为127.0.0.1 # bind_address = 127.0.0.1 bind_address = 0.0.0.0 http_port = 6800 debug = off runner = scrapyd.runner application = scrapyd.app.application launcher = scrapyd.launcher.Launcher webroot = scrapyd.website.Root [services] schedule.json = scrapyd.webservice.Schedule cancel.json = scrapyd.webservice.Cancel addversion.json = scrapyd.webservice.AddVersion listprojects.json = scrapyd.webservice.ListProjects listversions.json = scrapyd.webservice.ListVersions listspiders.json = scrapyd.webservice.ListSpiders delproject.json = scrapyd.webservice.DeleteProject delversion.json = scrapyd.webservice.DeleteVersion listjobs.json = scrapyd.webservice.ListJobs daemonstatus.json = scrapyd.webservice.DaemonStatus
-
重启启动scrapyd服务, 并让其在后台运行
scrapyd &
二:将本地开发的爬虫程序推送到服务中
- 这里使用的组建是
scrapyd-client
- 这个组件安装在你本地的开发机器上不需要安装到服务器中
-
安装
scrapyd-client
pip install scrapyd-client
-
修改
scrapy
爬虫项目中的scrapy.cfg
配置文件中(在爬虫项目的根目录下)[deploy:recipe_spiders] project = YourProjectName url = http://***.***.***.***:6800/ version = r1 [deploy:recipe_spiders] project = YourProjectName url = http://***.***.***.***:6800/ version = r1 # url的参数值为安装scrapyd的服务器B1和B2的IP地址 # project和version的参数值建议一致
-
将本地代码部署至
scrapyd
服务器- 该操作是在本地测试调试代码的时候执行的,我这边是win的开发环境
# 使用cmd进入爬虫项目的文件根目录下 # 执行查询可提供部署的项目信息 scrapyd-deploy -l # 返回信息格式 ProjectName ScrapydServerUrl, 如下 # ProjectName http://***.***.***.***:6800/ # 将爬虫项目数据部署到B1,B2服务器中 scrapyd-deploy ProjectName -p SpiderName # SpiderName是爬虫项目的spiders文件夹下自定义的py文件中 定义的蜘蛛名称,请自行替换 # 返回信息示例: #Packing version 1586314118 #Deploying to project "xiachufang_recipe_redis" in http://192.168.2.227:6800/addversion.json #Server response (200): #{"node_name": "localhost.localdomain", "status": "ok", "project": "SpiderName", "version": "1586314118", "spiders": 1}
三:启动爬虫
- scrapyd的web界面比较简单,主要用于监控,所以需要控制爬虫的话,可以通过qt或者web开发
- 所有的调度工作全部依靠接口实现.
-
http
接口启动此处参考文档: https://www.cnblogs.com/yijian001/p/9051124.html
官方文档:https://scrapyd.readthedocs.io/en/latest/api.html
常用接口
-
启动爬虫
$ curl http://YourScrapydServer:8600/schedule.json -d project=ProjectName -d spider=SpiderName # 带上参数 $ curl http://YourScrapydServer:8600/schedule.json -d project=ProjectName -d spider=SpiderName -d setting=DOWNLOAD_DELAY=2 -d arg1=val1
-
取消
$ curl http://YourScrapydServer:8600/cancel.json -d project=ProjectName -d job=6487ec79947edab326d6db28a2d86511e8247444
-
列出项目
$ curl http://YourScrapydServer:8600/listprojects.json
-
列出版本
$ curl http://YourScrapydServer:8600/listversions.json?project=ProjectName
-
列出爬虫
$ curl http://YourScrapydServer:8600/listspiders.json?project=ProjectName
-
列出job
$ curl http://YourScrapydServer:8600/listjobs.json?project=ProjectName
-
删除版本
$ curl http://YourScrapydServer:8600/delversion.json -d project=ProjectName -d version=r99
-
删除项目
$ curl http://YourScrapydServer:8600/delproject.json -d project=ProjectName
-
-
scrapydApi
启动此处参考文档: https://zhuanlan.zhihu.com/p/44564597
-
安装
pip install python-scrapyd-api
-
实例化
from scrapyd_api import ScrapydAPI scrapyd = ScrapydAPI('http://localhost:6800')
-
启动远程爬虫机器的scrapy
scrapyd.schedule(project, spider, settings=None, **kwargs) """ project: scrapy工程名称 spider:爬虫名称 settings:dict重新scrapy中settings _version: 指定版本号 kwargs:自定义额外参数传递给scrapy的init函数 return: 启动爬虫后的job_id """
-
查看爬虫的运行状态
scrapyd.job_status(project, job_id) """ project: scrapy工程名称 job_id: 启动爬虫后的job_id return: 'running':正在运行 'pending':准备运行 'finished':完成运行 '':若不能找到job_id,返回空 """
-
取消(停止)正在或准备运行的爬虫
scrapyd.cancel(project, job, signal=None) """ project:scrapy工程名称 job:爬虫的job_id signal:终止的信号,一般为None return: 返回爬虫停止前的状态 """ """ 有时运行中的爬虫不管用API还是命令行都无法停止,这里提供一种解决方案: 直接杀死进程 """
-
删除爬虫项目
scrapyd.delete_project(project) """ project:scrapy工程名 return: 成功返回 True 否则返回 False """
-
删除指定的版本的scrapy的项目
scrapyd.delete_version(project, version) """ project:scrapy项目名称 version:版本名称 return: 成功返回 True 否则返回 False """
-
显示当前可用的scrapy项目
scrapyd.list_projects() """ return:list 所有scrapy工程名 """
-
显示指定scrapy项目的所有爬虫
scrapyd.list_spiders(project) """ project:scrapy项目名称 return: list 所有爬虫名称 """
-
显示指定scrapy项目的所有版本号
scrapyd.list_versions(project) """ project: scrapy项目名称 return: list 所有可用版本 """
-
显示指定scrapy项目的所有准备、正在、完成运行的job_id
scrapyd.list_jobs(project) """ project:scrapy项目名称 return: dict 所有 pending running finished 的job_id """
-
-
最后
- 剩下的就是通过web或者qt进行爬虫的管理操作了。