这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战
第一部分:分布式爬虫(使用Scrapy_redis):
(官方文档:点我!!!)
1.简单介绍:
scrapy_redis是一个基于Redis的Scrapy组件,用于scrapy项目的分布式部署和开发。
特点:
分布式爬取
你可以启动多个spider对象,互相之间共享有一个redis的request队列。最适合多个域名的广泛内容的爬取。
分布式数据处理
爬取到的item数据被推送到redis中,这意味着你可以启动尽可能多的item处理程序。
scrapy即插即用
scrapy调度程序+过滤器,项目管道,base spider,使用简单。
2.Scrapy_redis的安装:
一般通过pip安装Scrapy-redis:
pip install scrapy-redis
scrapy-redis依赖:
Python 2.7, 3.4 or 3.5以上
Redis >= 2.8
Scrapy >= 1.1
redis-py >= 2.10
scrapy-redis的使用非常简单,几乎可以并不改变原本scrapy项目的代码,只用做少量设置。
注意:使用分布式和以往直接使用Scrapy的区别在于,增加了一个redis数据库,也就是增加了一步:在引擎将请求交给调度器scheduler后,调度器不是直接将请求排队后就再交给引擎,而是要先交给redis数据库,可想而知,如果有多个spider对象,那每个里面的步骤都是这样的话,这个redis数据库就是所有spider对象的公共区域,所有的请求都要扔进redis数据库中,如果有个spider对象是空闲的,那么redis就会直接将请求给它,而源码中有过滤去重功能,所以,这就实现了多个人共同做一件事,即分布式爬取。
注意:多个主机使用此分布式框架爬取数据时,获取到的数据可以通过一个特定的管道存储到Redis里的公共区域!!!
1.实例讲解上面两个注意点!!!
(1)此处使用之前做的完整的豆瓣TOP250项目(项目链接!),但是设置为只爬取一页(共25个电影信息),便于观察!!!
(2)配置settings.py文件中使用scrapy_redis的必要配置,并使用公共redsi数据存储区域(通过使用特定管道实现)!!!
# 第一步:加入以下代码:
#设置scrapy-redis
#1.启用调度将请求存储进redis
from scrapy_redis.scheduler import Scheduler
SCHEDULER="scrapy_redis.scheduler.Scheduler"
#2.确保所有spider通过redis共享相同的重复过滤
from scrapy_redis.dupefilter import RFPDupeFilter
DUPEFILTER_CLASS="scrapy_redis.dupefilter.RFPDupeFilter"
#3.指定连接到Redis时要使用的主机和端口 目的是连接上redis数据库
REDIS_HOST="localhost"
REDIS_PORT=6379
# 不清理redis队列,允许暂停/恢复抓取 (可选) 允许暂停,redis数据不丢失 可以实现断点续爬!!!
SCHEDULER_PERSIST = True
# 第二步:开启将数据存储进redis公共区域的管道!
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
# 'film.pipelines.FilmPipeline': 300,
'scrapy_redis.pipelines.RedisPipeline': 100,
# 'film.pipelines.DoubanSqlPipeline': 200,
}
复制代码
(3)注意:上述settings.py配置中有个可选项SCHEDULER_PERSIST,作用是决定清理还是不清理redis队列,首先,设置其值为True,允许断点续爬,通过Redis Desktop Manager观察redis中存储数据的公共区域:(会发现,其中有一个是Douban:duperfilter,里面放的是每个请求URL的指纹;一个是Douban:items,里面放的是最终爬取的数据!)
但是,如果将可选项SCHEDULER_PERSIST的值设为False,不允许断点续爬,观察:(发现只有一个Douban:items,里面放的是最终爬取的数据!而没有每个请求URL的指纹数据!)
(4)但是上面我们并没有在redis中看到每个请求URL的信息,这是因为每次执行完毕之后,redis中就不存在了,所以,为了观察到scrapy_redis是将每个请求都交给redis的,我们在运行项目一段时间后,强制关闭项目,再来观察redis,会发现:(其中包括了Douban:requests!!!)
(5)实例实现断点续爬:
首先,设置SCHEDULER_PERSIST为True,运行框架一会之后立马强制中断!
然后,settings.py中开启存储本地txt数据的管道!
会发现,在本地存储的数据没有25条,这是因为断点续爬,接着之前中断的点继续爬取的:
🔆In The End!
| 从现在做起,坚持下去,一天进步一小点,不久的将来,你会感谢曾经努力的你! |
|---|
本博主会持续更新爬虫基础分栏及爬虫实战分栏,认真仔细看完本文的小伙伴们,可以点赞收藏并评论出你们的读后感。并可关注本博主,在今后的日子里阅读更多爬虫文!
如有错误或者言语不恰当的地方可在评论区指出,谢谢!
如转载此文请联系我征得本人同意,并标注出处及本博主名,谢谢 !




近期评论