引用摘自《Python绝技 虫术》第三章
一、三大环境
开发环境、测试环境与生产环境,其关系如下图所示:
开发环境的侧重点是增加开发效率,Scrapy命令行工具就是一套针对爬虫开发与维护的工具。只要细细研读每个指令的作用,就会发现它们只不过是将一系列的人工操作指令通过一个指令一次性地完成罢了,其本质上并没有什么很炫酷的功能。
就Scrapy框架而言,要做到三大环境分离并不复杂,只需要在原有的Scrapy框架中结合Scrapyd与Scrapyd-Client工具就可以轻松地构建开发、测试与生产一体化的环境。具体实现逻辑如下:
开发与测试环境都基于Scrapy,开发环境中以scrapyd-client作为自动化部署工具,而生产环境中将以Scrapyd工具为宿主,向外部提供生产环境的管理接口。
二、Scrapyd
官方文档介绍:
Scrapyd is an application for deploying and running Scrapy spiders. It enables you to deploy (upload) your projects and control their spiders using a JSON API.
Scrapyd是用于部署和运行Scrapy spider的应用程序。它使你能够使用JSON API部署(上传)项目并控制项目的spide。官方文档
1. 使用scrapyd与直接运行爬虫scrapy crawl myspider
的区别:
Scrapyd同样是通过上面的命令启动运行爬虫的,不同的是它提供一个JSON Web Service监听请求,我们可以从任何一台能连接到服务器的PC发送请求来运行爬虫,或者停止正在运行的爬虫。甚至,我们可以使用它提供的API上传新的爬虫而不必登录到服务器上进行操作。
可以将Scrapyd看作Scrapy的一个Web包装,通过Scrapyd公布的Restful API可以让Scrapy项目变得具有更好的兼容性,我们就可以使用任何一种语言或者工具像Scrapyd提供的Web地址发起请求,从而控制Scrapy中爬虫的行为。有了Scrapyd作为Web的宿主,Scrapy被部署在网络的任何地方,都可以方便地通过一个HTTP的客户端对其进行控制。
除此之外,Scrapyd具有一项特性,十分适用于创建Scrapy的生产环境,那就是发行版本控制。Scrapyd的版本控制功能也是通过Restful API提供的,这样使得爬虫的迭代与代码的交付变得非常容易。
2. 使用Scrapyd
安装Scrapyd
pip install scrapyd
运行Scrapyd服务
因为Scrapyd本质上就是一个Web,所以我们需要通过指令将它加载运行,直接运行命令Scrapyd即可。
(venv) F:\Crawl\chinanews_crawler>scrapyd 2020-01-11T15:17:48+0800 [-] Loading f:\crawl\venv\lib\site-packages\scrapyd\txapp.py... 2020-01-11T15:17:50+0800 [-] Scrapyd web console available at http://127.0.0.1:6800/ 2020-01-11T15:17:50+0800 [-] Loaded. 2020-01-11T15:17:50+0800 [twisted.application.app.AppLogger#info] twistd 19.10.0 (f:\crawl\venv\scripts\python.exe 3.7.3) starting up. 2020-01-11T15:17:50+0800 [twisted.application.app.AppLogger#info] reactor class: twisted.internet.selectreactor.SelectReactor. 2020-01-11T15:17:50+0800 [-] Site starting on 6800 2020-01-11T15:17:50+0800 [twisted.web.server.Site#info] Starting factory <twisted.web.server.Site object at 0x000001C61B4AD7F0> 2020-01-11T15:17:50+0800 [Launcher] Scrapyd 1.2.1 started: max_proc=32, runner='scrapyd.runner'
出现上图即为运行成功,默认情况下Scrapyd监听0.0.0.0:6800端口。运行Scrapyd成功之后,在浏览器中输入http://localhost:6800/即可查看当前可以运行的项目。
Scrapyd Available projects: default Jobs Logs Documentation How to schedule a spider? To schedule a spider you need to use the API (this web UI is only for monitoring) Example using curl: curl http://localhost:6800/schedule.json -d project=default -d spider=somespider For more information about the API, see the Scrapyd documentation
现在Scrapyd已经启用,因为它是作为一个Master端存在的,所以使用时不要退出Scrapyd的命令窗口。当然,如果将Scrapyd作为生产环境的Web宿主,我们还得将Scrapyd配置为系统服务,在机器启动时就自动加载运行。如果要在外部网络访问,则还得通过Nginx将Scrapyd的监听端口进行映射。
工程的部署
要完整地将项目部署到服务器上,需要通过Scrapyd的addversion.json服务将Python编译器生成egg文件(也就是Python独有的包描述信息)并上传到服务器。我们可以以手工方式将文件上传到服务器,但是最简单的方法是通过scrapyd-deploy软件工具包中附带的scrapyd-client客户端来完成这一项工作。
RESTful API
Scrapyd的Web界面比较简单,主要用于监控,所有的调度工作全部依靠Web接口实现。也就是说,通过任意可以发出HTTP请求的工具(如urllib)向Scrapyd服务器指定的地址发出请求以获得具体的服务。如果在命令行中调用Scrapyd上的功能,可以通过curl工具来实现。
Scrapyd提供的RESTful API一览表
URI | HTTP方法 | 说明 |
---|---|---|
daemonstatus.json | GET | 检查Scrapyd的运行状态 |
addversion.json | POST | 向Scrapyd增加一个项目版本,如果项目不存在,则自动创建一个新的项目 |
schedule.json | POST | 加载运行指定的蜘蛛 |
cancel.json | POST | 终止蜘蛛的作业 |
listprojects.json | GET | 获取当前的Scrapyd服务器中所有的已上传项目列表 |
listversions.json | GET | 获取项目中可用的版本列表。版本会按顺序排列,最后一个为当前正在使用的版本 |
listspiders.json | GET | 获取当前版本中可用的蜘蛛列表 |
listjobs.json | GET | 获取项目中待定、正在运行或者已完成的作业列表 |
delversion.json | POST | 删除项目中指定的版本 |
delproject.json | POST | 删除指定项目及其所有已上传的版本 |