【概述】正则表达式
所谓分布式爬虫就是:多台机器上能够执行同一个爬虫程序,实现网站数据的分布爬取redis
原生的scrapy是不能够实现分布式爬虫的,缘由是:a.调度器没法共享;b.管道没法共享。数据库
为了解决scrapy不能实现分布式的问题,scrapy-redis组件诞生,scrapy-redis组件是专门为scrapy开发的一套组件,可使scrapy实现分布式。windows
【分布式爬虫实现流程】(以windows为例)服务器
1.安装scrapy-redis组件:pip install scrapy-redisdom
2.修改redis配置文件(redis.windows.conf):scrapy
- 注释该行:bind 127.0.0.1,表示可让其余ip访问redis分布式
- 将yes该为no:protected-mode no,表示可让其余ip操做rediside
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/,你们可自行前往学习。