博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

scrapy之基于redis的分布式爬虫(RedisCrawlSpider)

Posted on 2019-03-25 19:26  TigerAt  阅读(354)  评论(0)    收藏  举报

【概述】

所谓分布式爬虫就是:多台机器上可以执行同一个爬虫程序,实现网站数据的分布爬取

原生的scrapy是不可以实现分布式爬虫的,原因是:a.调度器无法共享;b.管道无法共享。

为了解决scrapy不能实现分布式的问题,scrapy-redis组件诞生,scrapy-redis组件是专门为scrapy开发的一套组件,可以使scrapy实现分布式。

【分布式爬虫实现流程】(以windows为例)

1.安装scrapy-redis组件:pip install scrapy-redis

2.修改redis配置文件(redis.windows.conf):

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

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

3.基于配置文件开启redis服务器:redis-server.exe redis.windows.conf

4.创建基于crawlspiter的爬虫文件:scrapy genspider -t crawl spiderName 对应url

5.导入RedisCrawSpiter类,然后将爬虫文件修改成基于该类的爬虫文件

from scrapy_redis.spiders import RedisCrawlSpider
class QiushiTextSpider(RedisCrawSpiter):

6.将start_url修改成redis_key='xxx'

7.将项目的管道和调度器配置成基于scrapy-redis组件(如下操作在settings配置中操作):

#管道配置为基于scrapy-redis,管道文件就无需再做配置:
ITEM_PIPELINES = {
   #'crawlspider_demo.pipelines.CrawlspiderDemoPipeline': 300,
   'scrapy_redis.pipelines.RedisPipeline': 400,
}

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

8.如果redis数据库没有在本地(数据默认存储在本地的redis服务器),则需要在settings.py中做如下配置(可选):

1 #redis数据库非本地存储时使用如下命令进行配置
2 REDIS_HOST = 'redis服务的ip地址'
3 REDIS_PORT = 6379
4 REDIS_ENCODING = 'utf-8'
5 REDIS_PARAMS = {'password':'xxxxxx'}

 

9.执行爬虫文件:scrapy runspider 爬虫文件.py

表示等待调度器队列中传入起始url

10.将起始url放置到调度器的队列中(redis-cli中执行):lpush 队列名称(redis-key) 起始url

例如:lpush qiushi https://www.qiushibaike.com/text/

 如下是完整业务代码

 1 # -*- coding: utf-8 -*-
 2 import scrapy
 3 
 4 #导入scrapy-redis模块
 5 from scrapy_redis.spiders import RedisCrawlSpider
 6 #导入items,用于持久化存储
 7 from crawlspider_demo.items import CrawlspiderDemoItem
 8 from scrapy.linkextractors import LinkExtractor
 9 from scrapy.spiders import CrawlSpider, Rule
10 
11 
12 class QiushiTextSpider(RedisCrawlSpider):
13     name = 'qiushi_text'
14     #allowed_domains = ['https://www.qiushibaike.com/text/']
15     #start_urls = ['https://www.qiushibaike.com/text/']
16     redis_key = 'qiushi'
17 
18     '''实例化了一个链接提取器对象:用来提取特定的url
19        allow参数:赋值一个正则表达式
20        链接提取器可以根据此表达式在页面中提取指定的链接,并将提取到的链接全部交给规则解析器'''
21     link = LinkExtractor(allow=r'/text/page/\d+/')
22 
23     '''指定不同规则解析器。一个Rule对象表示一种提取规则。
24        实例化了一个规则解释器对象
25        规则解析器接受了链接提取器发送的链接后,就会对这些链接发起请求,获取页面内的请求数据
26        callback:指定一个解析规则(方法/函数)
27        follow:是否将链接提取器继续作用到链接提取器取出的链接所表示的页面数据中'''
28     rules = (
29         Rule(link, callback='parse_item', follow=True),
30     )
31 
32     def parse_item(self, response):
33         content_list = response.xpath('//div[@id="content-left"]/div')
34         for content in content_list:
35             author = content.xpath('normalize-space(./div/a[2]/h2/text())').extract_first()
36             content_detail = content.xpath('normalize-space(.//div[@class="content"]/span/text())').extract()[0]
37             # 将解析到的数据值存储到items对象
38             item = CrawlspiderDemoItem()
39             item['author'] = author
40             item['content_detail'] = content_detail
41 
42             # 将item对象提交给管道
43             yield item
抓取糗事百科-文字完整业务代码(分布式)

 

声明:本内容仅用于学习参阅,勿用他用。本节部分内容参阅:http://xiaobaibook.com/details/61/,大家可自行前往学习。