Scrapy 分布式部署(包括scrapyd部署)

1.在爬虫文件中的settings中添加如下字段

# scrapy-redis配置信息
# 调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 不要清理redis队列,允许暂停/恢复抓取
SCHEDULER_PERSIST = True
# 每次爬取的时候会将指纹和request清空
# SCHEDULER_FLUSH_ON_START=True
# 配置redis服务
REDIS_URL = "redis://qxx2094.cn:6379"
# 如果redis有用户名和密码,如下设置
# REDIS_URL = "redis://用户名:密码@qxx2094.cn:6379"
# REDIS_HOST = "你的ip"
# REDIS_PORT = "6379"

2.将爬虫代码拷贝到其他机器上面,连接到同一服务器redis上面

在redis中会生成指纹文件,例如:"db_zf:dupefilter" 和 "db_zf:requests",然后其他从机就会拿到调度器分配的request请求,同时有指纹文件,请求到的文件不会有重复。

3.服务器上面将redis服务开放出来,外网可以访问

  • 首先修改配置文件redis.conf
sudo vim /etc/redis/redis.conf
  • 将bind 127.0.0.1注释掉,如果只想自己本机访问就在后面加上bind + 本机ip
# bind 127.0.0.1
  • 重启redis服务!
sudo /etc/init.d/redis-server restart
  • 登录redis
 执行命令 redis-cli -h IP地址 -p 端口号 -a 密码

利用scrapyd部署分布式

1.安装scrapyd和scrapyd-client
pip install scrapyd
pip install scrapyd-client
2.修改scrapyd默认配置(配置文件位置视自己服务器为准)
sudo vim /virtualenvs/py3.5/lib/python3.5/site-packages/scrapyd/default_scrapyd.conf
  • 将bind address 127.0.0.1注释掉,改为0.0.0.0

  • 修改该启动配置文件的目的是可以远程访问,scrapyd框架分为server端和client端,两个的ip地址必须对的上才能通信;
    1.client端需要将代码上传到server端
    2.可以浏览器访问server端的管理界面,世界各地没毛病,前提是具有公网ip

3.具体操作
  • 进入带有scrapy.cfg文件的目录,执行scrapyd-deploy,测试scrapyd-deploy是否可以运行。
  • 打开scrapy.cfg文件,将url改成自己ip
[settings]
default = dbzf.settings

# 部署名称,可不写
[deploy:db]
#url = http://localhost:6800/
url = http://193.112.128.44:6800/addversion.json
# 工程名
project = dbzf
  • 输入scrapyd-deploy -| 可以看到设置
db              http://193.112.128.44:6800/
  • 开始打包前,执行一个命令:scrapy list ,这个命令执行成功说明可以打包了,如果没执行成功说明还有工作没完成。
(py3.5) ubuntu@VM-0-9-ubuntu:~/workspace/reptile_codes/dbzf$ scrapy list
db_zf
  • 执行打包命令完成远程部署: scrapyd-deploy 部署名称 -p 项目名称
(py3.5) ubuntu@VM-0-9-ubuntu:~/workspace/reptile_codes/dbzf$ scrapyd-deploy db -p dbzf
Packing version 1562896041
Deploying to project "dbzf" in http://193.112.128.44:6800/addversion.json
Server response (200):
{"status": "ok", "version": "1562896041", "spiders": 1, "node_name": "VM-0-9-ubuntu", "project": "dbzf"}

"ststus": "ok"说明远程部署成功

  • 启动远程部署的scrapy
curl http://193.112.128.44:6800/schedule.json  -d project=dbzf -d spider=db_zf
  • 停止爬虫
curl http://193.112.128.44:6800/cancel.json  -d project=项目名称 -d job=运行ID
  • 删除scrapy项目(注意:一般删除scrapy项目,需要先执行命令停止项目下已在运行的爬虫)
curl http://localhost:6800/delproject.json -d project=scrapy项目名称
  • 查看指定的scrapy项目中有多少个爬虫
curl http://193.112.128.44:6800/listspiders.json?project=项目名称
4. 利用Scrapyd-API 实现 Scrapy 项目的监控和运行
pip install scrapyd-api

GitHub:https://github.com/djm/python-scrapyd-api

from scrapyd_api import ScrapydAPI
scrapyd = ScrapydAPI('http://localhost:6800')
scrapyd.list_jobs('project_name')

部分命令

Add a project egg as a new version:

>>> egg = open('some_egg.egg', 'rb')
>>> scrapyd.add_version('project_name', 'version_name', egg)
# 返回项目中爬虫的数量
3
>>> egg.close()

Cancel a scheduled job:(取消预定的工作)
>>> scrapyd.cancel('project_name', '14a6599ef67111e38a0e080027880ca6')
# 返回工程被取消前的“先前状态”:“正在运行”或“挂起”。

Delete a project and all sibling versions:(删除一个项目和所有兄弟版本)
>>> scrapyd.delete_project('project_name')
# 如果请求得到OK响应,则返回True
True

Delete a version of a project:(删除项目的版本)
>>> scrapyd.delete_version('project_name', 'version_name')
# 如果请求得到OK响应,则返回True.
True

Request status of a job:(请求作业的状态)
>>> scrapyd.job_status('project_name', '14a6599ef67111e38a0e080027880ca6')
# 对于未知状态,返回“正在运行”、“挂起”、“完成”或“未知状态码”.
'running'

List all jobs registered:(列出所有注册的工作)
>>> scrapyd.list_jobs('project_name')
# Returns a dict of running, finished and pending job lists.
{
    'pending': [
        {
            u'id': u'24c35...f12ae',
            u'spider': u'spider_name'
        },
    ],
    'running': [
        {
            u'id': u'14a65...b27ce',
            u'spider': u'spider_name',
            u'start_time': u'2014-06-17 22:45:31.975358'
        },
    ],
    'finished': [
        {
            u'id': u'34c23...b21ba',
            u'spider': u'spider_name',
            u'start_time': u'2014-06-17 22:45:31.975358',
            u'end_time': u'2014-06-23 14:01:18.209680'
        }
    ]
}

List all projects registered:(列出所有注册项目)
>>> scrapyd.list_projects()
[u'ecom_project', u'estate_agent_project', u'car_project']

Displays the load status of a service registered:(显示已注册服务的加载状态)
>>> scrapyd.daemon_status()
{u'finished': 0, u'running': 0, u'pending': 0, u'node_name': u'ScrapyMachine'}

List all spiders available to a given project:(列出给定项目可用的所有爬虫)
>>> scrapyd.list_spiders('project_name')
[u'raw_spider', u'js_enhanced_spider', u'selenium_spider']

List all versions registered to a given project:(列出注册到给定项目的所有版本)
>>> scrapyd.list_versions('project_name'):
[u'345', u'346', u'347', u'348']

Schedule a job to run with a specific spider:(安排作业在特定的爬虫项目上运行)
# Schedule a job to run with a specific spider.
>>> scrapyd.schedule('project_name', 'spider_name')
# Returns the Scrapyd job id.
u'14a6599ef67111e38a0e080027880ca6'

Schedule a job to run while passing override settings:(安排作业在传递覆盖设置时运行)
>>> settings = {'DOWNLOAD_DELAY': 2}
>>> scrapyd.schedule('project_name', 'spider_name', settings=settings)
u'25b6588ef67333e38a0e080027880de7'

Schedule a job to run while passing extra attributes to spider initialisation:
(安排作业运行,同时将额外的属性传递给爬虫初始化)
>>> scrapyd.schedule('project_name', 'spider_name', extra_attribute='value')
# NB: 'project', 'spider' and 'settings' are reserved kwargs for this
注意:“project”、“spider”和“settings”是为此保留的kwargs
# method and therefore these names should be avoided when trying to pass
方法,因此在尝试通过时应避免使用这些名称
# extra attributes to the spider init.
spider init的额外属性
u'25b6588ef67333e38a0e080027880de7'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342