Python中如何实现Scrapy分布式管理?
最近在使用 scrapy-redis 做分布式爬虫,目前考虑写一个扩展,主要可以实现:
- 通过一个 ui 界面来提交爬虫代码。(大概类似于一些 oj 刷题网站的代码编辑页面)
- 然后点击运行按钮,就能够自动启动一个 scrapy 实例。
这里遇到一些问题,爬虫代码保存在哪里?然后通过什么方法来运行这份爬虫代码? 目前我的方案是:
- 把代码文件存到一个公共的目录,所有的爬虫都从这个目录启动。
- 然后爬虫通过 docker 来启动,docker 可以访问那个公共目录。
不过感觉这样好麻烦啊,估计会碰到很多坑,不知道各位 v 友有没有什么更优的方式,实现我这个需求。
Python中如何实现Scrapy分布式管理?
自己部个 marathon 或者 k8s,然后通过 api 启动实例?
核心方案:使用Scrapy-Redis实现分布式爬虫。
Scrapy本身是单机框架,要实现分布式管理,需要引入Scrapy-Redis库。它通过Redis作为调度队列和数据存储中心,让多个爬虫实例共享请求队列和去重集合。
1. 安装依赖
pip install scrapy-redis redis
2. 修改Scrapy项目配置
在settings.py中添加:
# 启用Scrapy-Redis调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 启用去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# Redis连接设置
REDIS_HOST = 'localhost' # Redis服务器地址
REDIS_PORT = 6379 # Redis端口
REDIS_PASSWORD = None # 密码(如果有)
# 保持Redis数据持久化(爬虫关闭后不清空队列)
SCHEDULER_PERSIST = True
# 请求队列模式(可选优先级队列)
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'
3. 修改爬虫文件
将原有爬虫继承类改为RedisSpider或RedisCrawlSpider:
from scrapy_redis.spiders import RedisSpider
class MyDistributedSpider(RedisSpider):
name = 'distributed_spider'
redis_key = 'myspider:start_urls' # Redis中的起始URL键名
def parse(self, response):
# 解析逻辑保持不变
# 新增的请求会自动进入Redis队列
yield {
'title': response.css('title::text').get()
}
4. 运行分布式爬虫
- 启动Redis服务:
redis-server - 在不同机器/进程运行爬虫:
scrapy crawl distributed_spider - 向Redis队列添加起始URL(通过redis-cli):
lpush myspider:start_urls http://example.com/page1 lpush myspider:start_urls http://example.com/page2
关键点:
- 所有爬虫实例从同一个Redis队列获取请求,自动分配任务
- 去重指纹存储在Redis中,避免多机重复爬取
- 支持动态添加新URL到队列
一句话总结:用Scrapy-Redis+Redis做任务调度中心就能轻松实现分布式。
= =不会啊,还没用过。
试试 spiderkeeper
Heroku 把,它可以和你的 git 联动
如果用 docker 的话,强力推荐 rancher
那个项目部署方式太蛋疼了,界面可以参考一下,但是调度方式还是得写一套。
[捂脸]我还觉得挺好用的, 有 api 直接写好脚本打包 egg, 上传到 scrapyd 服务器
有一个现成的轮子,需要配置 scrapyd
https://github.com/DormyMo/SpiderKeeper
如何简单高效地部署和监控分布式爬虫项目 www.v2ex.com/t/507933


