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'