Scrapy之scrapy-redis分布式爬虫

scrapy-redisscrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署。

特征

分布式爬取

  您可以启动多个spider工程,相互之间共享单个redisrequests队列。最适合广泛的多个域名网站的内容爬取。

分布式数据处理

  爬取到的scrapyitem数据可以推入到redis队列中,这意味着你可以根据需求启动尽可能多的处理程序来共享item的队列,进行item数据持久化处理

Scrapy即插即用组件

  Scheduler调度器 + Duplication复制 过滤器,Item Pipeline,基本spider

实现流程

安装组件

1
pip install scrapy-redis

redis修改配置文件

1
2
3
- 注释该行:bind 127.0.0.1,表示可以让其他ip访问redis

- 将yes该为no:protected-mode no,表示可以让其他ip操作redis

爬虫文件

将爬虫类的父类修改成基于RedisSpider或者RedisCrawlSpider。注意:如果原始爬虫文件是基于Spider的,则应该将父类修改成RedisSpider,如果原始爬虫文件是基于CrawlSpider的,则应该将其父类修改成RedisCrawlSpider; 注释或者删除start_urls列表,且加入redis_key属性,属性值为scrpy-redis组件中调度器队列的名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# -*- coding: utf-8 -*-
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import Rule
from scrapy_redis.spiders import RedisCrawlSpider


from redisscrapy.items import RedisscrapyItem


class DiandianSpider(RedisCrawlSpider):
name = 'diandian'
# allowed_domains = ['www.diandian100.cn']
# start_urls = ['http://www.diandian100.cn/']

redis_key = 'diandianredis'

rules = (
Rule(LinkExtractor(allow=r'/page/\d+/'), callback='parse_item', follow=True),
)

def parse_item(self, response):


posts = response.xpath('//div[@class="posts-expand"]/article')

for post in posts:
print(post)
# 取出该条文章第一个link标签下的href属性值
url = post.xpath('./link/@href').extract_first()
# 在该条文章html中搜索h2标签下的第一个a标签的内容
tit = post.xpath('.//h2/a/text()').extract_first()
yield RedisscrapyItem(url=url, tit=tit)
# return item

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 开启管道
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400
}

# 使用scrapy-redis组件的去重队列
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 是否允许暂停
SCHEDULER_PERSIST = True

REDIS_HOST = 'redis服务的ip地址'
REDIS_PORT = 6379
REDIS_ENCODING = ‘utf-8
REDIS_PARAMS = {‘password’:’123456’}

启动redis服务器

使用修改后的redis配置文件来启动redis服务

1
redis-server 配置文件

启动redis客户端

1
redis-cli

运行爬虫

要进入爬虫目录,使用一下命令运行爬虫文件

1
scrapy runspider 爬虫文件名

开始爬取

redis客户端中丢入要爬取的页面起始url

1
lpush diandianredis https://www.diandian100.cn

以上就是分布式的完整示例