最近在爬取网站中一直使用 redis 来管理分发爬虫任务,让我对 scrapy-redis 有很深刻的理解,下面让我慢慢说来。
首先说下scrapy 和scrapy-redis的关系
scrapy-redis 与 Scrapy的关系就像电脑与固态硬盘一样,是电脑中的一个插件,能让电脑更快的运行。
Scrapy 是一个爬虫框架,scrapy-redis 则是这个框架上可以选择的插件,它可以让爬虫跑的更快。
为什么使用 scrapy-redis
首先,在实际开发中,我们总会对爬虫速度表示不满,为啥这么慢,能不能跑快点。除了爬虫本身的优化,我们就要引入分布式爬虫的概念。Scrapy本身是不支持分布式的,因为它的任务管理和去重全部是在机器内存中实现的。
我自己对分布式爬虫的理解就是:多个爬虫执行同一个任务
在 Scrapy 中最出名的分布式插件就是scrapy-redis了,scrapy-redis的作用就是让你的爬虫快、更快、超级快。
那如何让你的爬虫变成分布式的呢?
那我给你门作具体介绍
1.redis 服务
2.确保scrapy-redis 环境已经安装
3.确定单机scrapy 能够正常运行
4.配置setting.py 文件
setting.py 配置代码如下
# url指纹过滤器
'DUPEFILTER_CLASS' : "scrapy_redis.dupefilter.RFPDupeFilter",
# 调度器
'SCHEDULER' : "scrapy_redis.scheduler.Scheduler",
# 设置爬虫是否可以中断
'SCHEDULER_PERSIST' : True,
'SCHEDULER_QUEUE_CLASS' : "scrapy_redis.queue.SpiderQueue", # 按照队列模式
# redis 连接配置
'REDIS_HOST' : '10.15.112.29',
'REDIS_PORT' :6379,
#密码和选择的库号
'REDID_PARAMS' = {
'password': '12324345',
'db' : 0,
}
## 配置redis管道文件,权重数字相对最大
'ITEM_PIPELINES' = {
'scrapy_redis.pipelines.RedisPipeline': 3, # redis管道文件,自动把数据加载到redis
}
SCHEDULER是任务分发与调度,把所有的爬虫开始的请求都放在redis里面,所有爬虫都去redis里面读取请求。 DUPEFILTER_CLASS是去重队列,负责所有请求的去重,REDIS_START_URLS_AS_SET指的是使用redis里面的set类型(简单完成去重),如果你没有设置,默认会选用list。
5 接下来就是设置你的爬虫文件了
在spider文件下找你写好的爬虫文件
然后导入
from scrapy_redis.spiders import RedisCrawlSpider
你的class类要继承RedisCrawlSpider
class BosszpSpider(RedisCrawlSpider):
然后设置属性
设置爬虫的rediskey(这个个自己取名,要和redis的键名一样)
redis_key = 'boss_url'
接下来连接redis
#启动redis的命令是redis-server /etc/redis.cfon
#l连接好redis后,添加一个列表
键名就是你爬虫属性里设置的名字
值就是你首次请求的url
#配置完后就可以启动你的爬虫了
命令 scrapy runspider 爬虫文件名
scrapy-redis 优点
速度快
scrapy-redis 使用redis这个速度非常快的非关系型(NoSQL)内存键值数据库,速度快是最重要原因(但是也会产生负面想过,下面会说到)。
为什么是scrapy-redis而不是scrapy-mongo呢,大家可以仔细想想。
用法简单
前人已经造好轮子了,scrapy-redis。 我们直接拿来用就好,而用法也像上面提到的在 settings.py 文件中配置。在文档中还有另一种用法,即Feeding a Spider from Redis
run the spider: scrapy runspider myspider.py
push urls to redis: redis-cli lpush myspider:start_urls http://google.com(建议把lpush换为zset)
其实这种用法就是先打开一个爬虫,他会一直在redis里面寻找key为 myspider:start_urls,如果存在,就提取里面的url。当然你也可以在爬虫中指定redis_key,默认的是爬虫的名字加上:start_urls
去重简单
爬虫中去重是一件大事,使用了scrapy-redis后就很简单了。上面提到过使用redis的set类型就可以很容易达到这个目标了,即REDIS_START_URLS_AS_SET = True。
scrapy-redis 缺点
内存问题
为什么使用分布式爬虫,当然是因为会有很多链接需要跑,或者说会存放很多个myspider:start_urls到redis中,Redis是key-value数据库,面对key的内存搜索,优势明显,但是Redis吃的是纯内存
这就是我对分布式的理解,如有错误请指出,谢谢。