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'

你可能感兴趣的:(Scrapy 分布式部署(包括scrapyd部署))