分布式爬虫

  分布式爬虫,可让不少台电脑都使用同一个的爬虫程序,将爬虫分发获得多台电脑上,这样能够提升爬虫的速度,也就是分布式爬虫。php

  分布式爬虫须要专门的模块scrapy-redis,原生的scrapy框架没法实现分布式爬取,缘由在于:(1)scrapy框架中五大核心组件中的调度器只归属于该项目,没法实现被分布式集群共享;(2)scrapy框架中五大核心组件中的调度器管道只接受该项目的数据对象,没法实现被分布式集群共享。linux

  

基于scrapy-redis组件的分布式爬虫redis

        scrapy-redis组件中已经封装好了能够被多台机器共享的调度器和管道,能够直接使用并实现分布式数据爬取。要想实现分布式,必需要有共享的调度器队列和共享管道爬(爬取的数据必须存储在redis中,由于是基于scrapy-redis模块,内置封装的方法)数据库

    实现方式有两种: (1)基于该组件的RedisSpider类;(2)基于该组件的RedisCrawlSpider类。windows

分布式爬取数据案例框架

  东莞阳光网http://wz.sun0769.com/index.php/question/report?page=) dom

  1.安装下载scrapy-redis模块scrapy

    pip install scrapy-redis分布式

  2.建立爬虫项目(基于CrawlSpider来实现)ide

    scrapy startproject fbsPro

     cd fbsPro

    scrapy genspider -t crawl fbsTest www.xxx.com

  3.修改爬虫文件  

 1 import scrapy
 2 from scrapy.linkextractors import LinkExtractor
 3 from scrapy.spiders import CrawlSpider, Rule
 4 from fbsPro.items import FbsproItem
 5 from scrapy_redis.spiders import RedisCrawlSpider
 6 
 7 
 8 #分布式实现不须要依赖scrapy框架提供的起始url调度器和管道
 9 #(1)导入scrapy-redis模块封装好的类,将爬虫类的父类指定成RedisCrawlSpider
10 class FbstestSpider(RedisCrawlSpider):
11     name = 'fbsTest'
12     # allowed_domains = ['www.xxx.com']
13     # start_urls = ['http://www.xxx.com/']
14 
15     # 分布式爬虫的起始url是放在共享调度器队列中的
16     #(2)分布式实现要指定共享调度器队列
17     redis_key = 'fbsQueue'  # 能够被共享的调度器队列的名称
18 
19     #本案例采用CrawlSpider实现自动全站爬取
20     # Rule是规则解析器;
21     # LinkExtractor是链接提取器,提取符合allow规则的完整的url;
22     # callback指定当前规则解析器的回调解析函数;
23     # follow指定是否将连接提取器继续做用到连接提取器提取出的连接网页;
24     # follow不指定默认False;
25     rules = (
26         Rule(LinkExtractor(allow=r'page=\d+'), callback='parse_item', follow=True),
27     )
28 
29     def parse_item(self, response):
30         item = FbsproItem()
31         tr_list = response.xpath('//*[@id="morelist"]/div/table[2]/tbody/tr/td/table/tbody/tr')
32         for tr in tr_list:
33             item['identifier'] = tr.xpath('./td[1]/text()').extract_first()  # 解析编号
34             item['title'] = tr.xpath('/td[2]/a[2]/text()').extract_first()  # 解析标题
35             yield item
修改爬虫文件(继承类、共享调度器)

  4.items.py字段属性定义

1 import scrapy
2 
3 
4 class FbsproItem(scrapy.Item):
5     identifier=scrapy.Field()
6     title=scrapy.Field()
7     pass
items.py

  5.settings.py配置文件  

USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
ROBOTSTXT_OBEY = False
LOG_LEVEL="ERROR"

#(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_HOST = 'redis服务的ip地址'(注意不能是本机回环地址,此redis须要共用)
REDIS_HOST = '192.168.0.103'
REDIS_PORT = 6379

  6.配置redis数据库

  修改redis数据库配置文件:redis.windows.conf(windows)或者redis.conf(linux)  

    56行注释:#bind 127.0.0.1
    关闭保护模式:protected-mode no

  7.指定配置文件启动redis数据库服务

   redis-server ./redis.windows.conf

  8.启动爬虫项目(能够在多台机器上运行实现分布式)

  进入到爬虫文件对应的目录中:scrapy runspider fbsTest.py

  9.启动redis客户端,向共享调度器队列放进其实url

  redis-cli

  lpush  fbsQueue   http://wz.sun0769.com/index.php/question/report?page=     (向在爬虫文件中指定的)

相关文章
相关标签/搜索