【概述】正則表達式
所謂分佈式爬蟲就是:多臺機器上能夠執行同一個爬蟲程序,實現網站數據的分佈爬取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/,你們可自行前往學習。