一、分布式爬虫
- 1.概念:
我们需要搭建一个分布式的机群,让其对一组资源进行分布联合爬取。 - 2.作用:
提升爬取数据的效率 - 3.依赖:
pip install scrapy-redis
- scrapy-redis作用:可以给原生的scrapy框架提供可以被共享的管道和调度器
二、实现流程
- 1.创建一个工程:
scrapy startproject ProjectName - 2.进入工程目录下:
cd ProjectName - 3.创建一个基于CrawlSpider的爬虫文件:
scrapy genspider -t crawl SpiderName www.xxxx.com - 4.将CrawlSpider修改为RedisCrawlSpider
- 5.将start_urls和allowed_domains进行注释
- 6.添加一个新属性(作为redis列表的key):
redis_key = xxx - 7.执行工程:
scrapy runspider xxx.py - 8.向调度器的队列中放入一个起始的url:
- 9.爬取到的数据存储在了redis的proName:items这个数据结构中
三、配置文件settings
- 1.指定使用可以被共享的管道:
ITEM_PIPELINES = {
‘scrapy_redis.pipelines.RedisPipeline’: 400
} - 2.指定调度器:
#增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
DUPEFILTER_CLASS = “scrapy_redis.dupefilter.RFPDupeFilter”
#使用scrapy-redis组件自己的调度器
SCHEDULER = “scrapy_redis.scheduler.Scheduler”
#配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据。
#这个设置可以实现增量式爬虫,每次只爬取更新过的数据。
SCHEDULER_PERSIST = True - 3.指定redis服务器:
REDIS_HOST = ‘redis服务的ip地址’
REDIS_PORT = 6379
REDIS_ENCODING =‘utf-8’
REDIS_PARAMS = {‘password’:‘xx’}
四、配置redis.conf
1.修改
- 注释该行:
bind 127.0.0.1,表示可以让其他ip访问redis - 将yes改为no:
protected-mode no,表示可以让其他ip操作redis
五、实例
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from fbsPro.items import FbsproItem
from scrapy_redis.spiders import RedisCrawlSpider
class FbsSpider(RedisCrawlSpider):
name = 'fbs'
redis_key = 'sun'
link = LinkExtractor(allow=r'type=4&page=\d+')
rules = (
Rule(link, callback='parse_item', follow=True),
)
def parse_item(self, response):
...
yield item