什么是分布式爬虫?
假设你有一群小伙伴,他们每个人都在帮你剥花生壳,然后把剥好的花生仁都丢到你面前的盘子里。分布式爬虫也差不多,许多台电脑一起上阵,各自负责去同一个网站获取数据,这叫建立一个分布式机群。
为什么要用分布式?
你一个人剥花生,速度自然慢。如果有一大堆人帮你,速度嗖嗖的上升。同理,为了提升爬取数据的效率,我们就用分布式爬虫。
怎么实现分布式爬虫?
我们用 scrapy+redis
,具体是通过 scrapy-redis
这个组件来实现分布式。
为什么原版 scrapy
做不了分布式?
因为它的调度器和管道不能共享,像你只能独享这堆花生仁,别人就只能干瞪眼了。
scrapy-redis
组件有啥用?
它提供了可以被大家一起分享的调度器和管道!
环境安装:
-
安装
redis
-
安装
scrapy-redis
:bashpip install scrapy-redis
编码流程:
1. 创建一个新的工程
2. 创建一个爬虫文件
这个爬虫文件可以是基于 CrawlSpider
的,也可以是普通爬虫文件。
3. 修改爬虫文件
-
导入必要的包:
pythonfrom scrapy_redis.spiders import RedisCrawlSpider # 如果你用普通的Spider可以用 RedisSpider
-
把
start_urls
替换成:pythonredis_key = 'your_queue_name'
表示这是一个共享调度器的队列名称。
-
编写爬虫类爬取数据的逻辑(注意:这时候不写起始URL):
pythonclass MySpider(RedisCrawlSpider): name = 'my_spider' redis_key = 'my_spider:start_urls' def parse(self, response): # your parsing logic here pass
4. 对 settings.py
进行配置:
-
开启共享管道:
pythonITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 400 }
-
指定调度器:
python# 使用Redis的set集合来存储请求的指纹数据,实现请求去重 DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter' # 使用scrapy-redis组件自己的调度器 SCHEDULER = 'scrapy_redis.scheduler.Scheduler' # 配置调度器是否要持久化,爬虫结束后是否清空Redis中请求队列和去重指纹的set SCHEDULER_PERSIST = True
-
指定Redis服务地址和端口:
pythonREDIS_HOST = 'your_redis_server_ip' REDIS_PORT = 6379
5. 修改Redis配置文件:redis.windows.conf
- 在第56行,将
#bind 127.0.0.1
去掉注释。 - 在第75行,将
protected-mode
设置为no
。
6. 启动Redis服务
带上配置文件启动:
bash
redis-server redis.windows.conf
7. 启动Redis客户端
bash
redis-cli
执行我们的工程:
-
进入爬虫文件对应的目录,运行爬虫:
bashscrapy runspider your_spider.py
最后一步,向调度器队列中添加一个起始URL:
在Redis客户端中输入:
bash
lpush your_queue_name 'http://www.example.com'
这个 your_queue_name
就是你在爬虫文件中定义的 redis_key
。
现在,就可以看着你的分布式爬虫计算机群高效地运行了!