Python爬虫从入门到放弃(二十一)之 Scrapy分布式部署

按照上一篇文章中我们将代码放到远程主机是通过拷贝或者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主要实现以下内容:

  1. 把我们本地代码打包生成egg文件
  2. 根据我们配置的url上传到远程服务器上

我们将我们本地的scrapy项目中scrapy.cfg配置文件进行配置:

我们其实还可以设置用户名和密码,不过这里没什么必要,只设置了url 这里设置url一定要注意:url = http://192.168.1.9:6800/addversion.json 最后的addversion.json不能少

我们在本地安装pip install scrapy_client,安装完成后执行:scrapyd-deploy

zhaofandeMBP:zhihu_user zhaofan$ scrapyd-deploy
Packing version 1502177138
Deploying to project "zhihu_user" in http://192.168.1.9:6800/addversion.json
Server response (200):
{"node_name": "fan-VirtualBox", "status": "ok", "version": "1502177138", "spiders": 1, "project": "zhihu_user"}

zhaofandeMBP:zhihu_user zhaofan$ 

看到status:200表示已经成功

关于常用操作API

listprojects.json列出上传的项目列表

zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/listprojects.json
{"node_name": "fan-VirtualBox", "status": "ok", "projects": ["zhihu_user"]}
zhaofandeMBP:zhihu_user zhaofan$ 

listversions.json列出有某个上传项目的版本

zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/listversions.json\?project\=zhihu_user
{"node_name": "fan-VirtualBox", "status": "ok", "versions": ["1502177138"]}
zhaofandeMBP:zhihu_user zhaofan$ 

schedule.json远程任务的启动

下面我们启动的三次就表示我们启动了三个任务,也就是三个调度任务来运行zhihu这个爬虫

zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/schedule.json -d project=zhihu_user -d spider=zhihu
{"node_name": "fan-VirtualBox", "status": "ok", "jobid": "97f1b5027c0e11e7b07a080027bbde73"}
zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/schedule.json -d project=zhihu_user -d spider=zhihu
{"node_name": "fan-VirtualBox", "status": "ok", "jobid": "99595aa87c0e11e7b07a080027bbde73"}
zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/schedule.json -d project=zhihu_user -d spider=zhihu
{"node_name": "fan-VirtualBox", "status": "ok", "jobid": "9abb1ba27c0e11e7b07a080027bbde73"}
zhaofandeMBP:zhihu_user zhaofan$

同时当启动完成后,我们可以通过页面查看jobs,这里因为我远端服务器并没有安装scrapy_redis,所以显示任务是完成了,我点开日志并能看到详细的日志情况:

这里出错的原因就是我上面忘记在ubuntu虚拟机安装scrapy_redis以及pymongo模块,进行 pip install scrapy_redis pymongo安装后重新启动,就可以看到已经在运行的任务,同时点开Log日志也能看到爬取到的内容:

listjobs.json列出所有的jobs任务 上面是通过页面显示所有的任务,这里是通过命令获取结果

zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/listjobs.json\?project\=zhihu_user
{"node_name": "fan-VirtualBox", "status": "ok", "running": [], "pending": [], "finished": [{"start_time": "2017-08-08 15:53:00.510050", "spider": "zhihu", "id": "97f1b5027c0e11e7b07a080027bbde73", "end_time": "2017-08-08 15:53:01.416139"}, {"start_time": "2017-08-08 15:53:05.509337", "spider": "zhihu", "id": "99595aa87c0e11e7b07a080027bbde73", "end_time": "2017-08-08 15:53:06.627125"}, {"start_time": "2017-08-08 15:53:10.509978", "spider": "zhihu", "id": "9abb1ba27c0e11e7b07a080027bbde73", "end_time": "2017-08-08 15:53:11.542001"}]}
zhaofandeMBP:zhihu_user zhaofan$ 

cancel.json取消所有运行的任务 这里可以将上面启动的所有jobs都可以取消:

zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/cancel.json -d project=zhihu_user -d job=0f5cdabc7c1011e7b07a080027bbde73
{"node_name": "fan-VirtualBox", "status": "ok", "prevstate": "running"}
zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/cancel.json -d project=zhihu_user -d job=63f8e12e7c1011e7b07a080027bbde73
{"node_name": "fan-VirtualBox", "status": "ok", "prevstate": "running"}
zhaofandeMBP:zhihu_user zhaofan$ curl http://192.168.1.9:6800/cancel.json -d project=zhihu_user -d job=63f8e12f7c1011e7b07a080027bbde73
{"node_name": "fan-VirtualBox", "status": "ok", "prevstate": "running"}

这样当我们再次通过页面查看,就可以看到所有的任务都是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)

Cancel a scheduled job scrapyd.cancel('project_name', '14a6599ef67111e38a0e080027880ca6')

Delete a project and all sibling versions scrapyd.delete_project('project_name')

Delete a version of a project scrapyd.delete_version('project_name', 'version_name')

Request status of a job scrapyd.job_status('project_name', '14a6599ef67111e38a0e080027880ca6')

List all jobs registered scrapyd.list_jobs('project_name')

List all projects registered scrapyd.list_projects()

List all spiders available to a given project scrapyd.list_spiders('project_name')

List all versions registered to a given project scrapyd.list_versions('project_name')

Schedule a job to run with a specific spider scrapyd.schedule('project_name', 'spider_name')

Schedule a job to run while passing override settings settings = {'DOWNLOAD_DELAY': 2}

Schedule a job to run while passing extra attributes to spider initialisation scrapyd.schedule('project_name', 'spider_name', extra_attribute='value')

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏DT乱“码”

TortoiseSVN 菜单详解

TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具。通过使用它,我们可以可视化的管理我们的版本库。不过由于它只是一个客户端,所以它不能对...

2278
来自专栏Java后端技术

分模块的maven项目调试时报Source not found的解决办法

  通常在开发中,我们经常会拆分我们的项目为一个个maven子工程,然后用一个父项目进行集成,并且子项目还会继承自父项目。当我们对这些项目进行debug调试的时...

805
来自专栏IT杂记

Tomcat源码分析一:源码导入

下载tomcat源码包 从tomcat官网tomcat.apache.org上下载tomcat8.x的源码包apache-tomcat-8.0.32-src.z...

17410
来自专栏深度学习之tensorflow实战篇

下载和安装R、RStudio !~~~

现如今,R语言是统计领域广泛使用的工具,是属于GNU系统的一个自由、免费、源代码开放的软件,是用于统计计算和统计绘图的优秀工具。而RStudio是R的集成开发环...

3235
来自专栏网络

局域网联机教程

本期推送介绍局域网中如何联机玩游戏: 文章以Windows 7系统演示,其他系统大同小异。 首先要确定联机的电脑在一个局域网内,且连接的路由器/交换机没有开启I...

2656
来自专栏前端之心

dig 命令洞察 DNS 解析过程

在上一篇文章,我们介绍了域名解析的过程,本章我们将介绍一个实用的工具---dig命令,通过dig命令我们可以查看 DNS 解析的过程,以便我们更好的理解 DNS...

2197
来自专栏云计算教程系列

如何在服务器上安装LAMP

在本教程中,我们将在Ubuntu上安装LAMP。Ubuntu将满足我们的第一个要求:Linux操作系统。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免...

1381
来自专栏一个爱瞎折腾的程序猿

初次尝试Linux并记录一二

若出现 服务器拒绝了SETP连接,但它监听FTP链接。。。没有安装sshd 解决方案

641
来自专栏IT笔记

安利一款接口文档在线管理系统-MinDoc

项目简介 MinDoc 是一款针对IT团队开发的简单好用的文档管理系统。 MinDoc 的前身是 SmartWiki 文档系统。SmartWiki 是基于 PH...

3488
来自专栏乐沙弥的世界

VmWare6.5.2下安装RHEL 5.4(配置Oracle安装环境)

如转载,请注明出处:http://blog.csdn.net/robinson_0612/archive/2009/10/04/4632312.aspx

872

扫码关注云+社区