分佈式爬蟲

  分佈式爬蟲,可讓不少臺電腦都使用同一個的爬蟲程序,將爬蟲分發獲得多臺電腦上,這樣能夠提升爬蟲的速度,也就是分佈式爬蟲。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=     (向在爬蟲文件中指定的)

相關文章
相關標籤/搜索