1. 实现scrapy-redis前的一些准备
- 参考前文,在centos7环境下安装redis,实现远程登录redis服务功能并开启服务
https://blog.csdn.net/wxfghy/article/details/80349405 - 下载scrapy-redis源代码并解压
https://github.com/rmax/scrapy-redis - pycharm中安装scrapy和scrapy-redis模块
- pycharm中打开scrapy-redis源代码所在文件夹
- 同scrapy用法,修改四个文件items, settings, pipelines 和自定义的爬虫代码dmoz
2. scrapy-redis与scrapy区别
利用redis实现分布式爬虫
调度器Scheduler
- scrapy
- 改写Python双向队列为自己的优先级队列,但是scapry中存在多个spider时不能共享同一个待爬队列
- scrapy-redis
- 将scarpy队列放到redis数据库中读取,实现多个爬虫共享一个队列
- 同时还支持使用FIFO队列和LIFO队列
去除重复Duplication Filter
- scrapy
- 使用集合实现去重
- 将已发送请求的指纹存入集合,新发送请求时与该集合比对判断是否已请求过
- scrapy-redis
- redis的zset具有不重复的特点
- 将指纹存入redis,将不重复的请求写入请求队列
数据管道Item Pipeline
- scrapy
爬取到的数据直接传给管道文件 - scrapy-redis
将爬取到的数据存入redis数据队列,可实现items processes集群
爬虫引擎Base Spider
- scrapy
Spider类 - scrapy-redis
继承Spider类和RedisMixin类,从redis读取url
3. 代码部分
settings
# Scrapy settings for lagou project
#
# For simplicity, this file contains only the most important settings by
# default. All the other settings are documented here:
#
# http://doc.scrapy.org/topics/settings.html
#
SPIDER_MODULES = ['lagou.spiders']
NEWSPIDER_MODULE = 'lagou.spiders'
#USER_AGENT = 'scrapy-redis (+https://github.com/rolando/scrapy-redis)'
# 本地重复过滤
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 计划调度器,将请求队列处理分发
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 是否将本地请求队列持久化到远程服务器
SCHEDULER_PERSIST = True
# 使用框架提供的队列
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"# 常用,优先级队列
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"# FIFO队列,先进先出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"# LIFO队列,后进先出
ITEM_PIPELINES = {
'lagou.pipelines.lagouPipeline': 300,
'scrapy_redis.pipelines.RedisPipeline': 400,
}