Scrapy-redis分布式爬虫

用Redis做队列处理实现分布式

实现原理

“Scrapy-redis框架流程图”
用Redis的ZSet有序队列做调度器来集中处理Requests

安装Scrapy-redis

直接pip install scrapy-redis即可

创建Spider继承自RedisSpider

1
2
3
4
5
6
7
8
class JobboleSpider(RedisSpider):
name = 'jobbole'
allowed_domains = ['blog.jobbole.com']
def parse(self, response):
#编写抓取规则
pass

settings.py配置

1
2
3
4
5
6
7
8
9
10
11
12
REDIS_URL='redis://:password@host' # 连接Redis
# 使用scrapy_redis的调度器替换原版调度器
SCHEDULER='scrapy_redis.scheduler.Scheduler'
#使用scrapy_redis的RFPDupeFilter作去重过滤器
DUPEFILTER_CLASS='scrapy_redis.dupefilter.RFPDupeFilter'
ITEM_PIPELINES={
# 'scrapy_redis.pipelines.RedisPipeline':300 # 可选项 是否把ITEM存储到Redis中
}
#爬虫停止后,保留/清理Redis中的请求队列以及去重集合
# TRUE:保留 FALSE:清理 默认为FALSE
SCHEDULER_PERSIST=TRUE

打开所有爬虫,部署Redis队列

打开所有部署到各个服务器上的爬虫,进入队列等待状态.
连接Redis服务器,输入lpush spider_name:start_urls 'http://www.baidu.com'既可开始抓取

编写代码读取Redis中保存的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import redis
import json
ITEM_KEYS='spider_name:items'
def process_item(item):
#添加处理数据的代码
pass
def main():
r=redis.StrictRedis(host='host',port=6379)
for _ in range(r.llen(ITEM_KEYS)):
data=r.lpop(ITEM_KEYS)
item=json.loads(data.decode('utf-8'))
process_item(item)
if __name__ == '__main__':
main()