第三百五十七節,Python分佈式爬蟲打造搜索引擎Scrapy精講—利用開源的scrapy-redis編寫分佈式爬蟲代碼css
scrapy-redis是一個能夠scrapy結合redis搭建分佈式爬蟲的開源模塊python
scrapy-redis的依賴redis
Scrapy
>= 1.1,Scrapy版本
redis-py
>= 2.10,redis-py版本,redis-py是一個Python操做Redis的模塊,scrapy-redis底層是用redis-py來實現的
下載地址:https://pypi.python.org/pypi/scrapy-redis/0.6.8dom
咱們以scrapy-redis/0.6.8版本爲講scrapy
1、安裝scrapy-redis/0.6.8版本的依賴分佈式
首先安裝好scrapy-redis/0.6.8版本的依賴關係模塊和軟件ide
2、建立scrapy項目函數
執行命令建立項目:scrapy startproject fbshpchpost
3、將下載的scrapy-redis-0.6.8模塊包解壓,解壓後將包裏的crapy-redis-0.6.8\src\scrapy_redis的scrapy_redis文件夾複製到項目中搜索引擎
4、分佈式爬蟲實現代碼,普通爬蟲,至關於basic命令建立的普通爬蟲
注意:分佈式普通爬蟲必須繼承scrapy-redis的RedisSpider類
#!/usr/bin/env python # -*- coding:utf8 -*- from scrapy_redis.spiders import RedisSpider # 導入scrapy_redis裏的RedisSpider類 import scrapy from scrapy.http import Request #導入url返回給下載器的方法 from urllib import parse #導入urllib庫裏的parse模塊 class jobboleSpider(RedisSpider): # 自定義爬蟲類,繼承RedisSpider類 name = 'jobbole' # 設置爬蟲名稱 allowed_domains = ['blog.jobbole.com'] # 爬取域名 redis_key = 'jobbole:start_urls' # 向redis設置一個名稱儲存url def parse(self, response): """ 獲取列表頁的文章url地址,交給下載器 """ # 獲取當前頁文章url lb_url = response.xpath('//a[@class="archive-title"]/@href').extract() # 獲取文章列表url for i in lb_url: # print(parse.urljoin(response.url,i)) #urllib庫裏的parse模塊的urljoin()方法,是自動url拼接,若是第二個參數的url地址是相對路徑會自動與第一個參數拼接 yield Request(url=parse.urljoin(response.url, i), callback=self.parse_wzhang) # 將循環到的文章url添加給下載器,下載後交給parse_wzhang回調函數 # 獲取下一頁列表url,交給下載器,返回給parse函數循環 x_lb_url = response.xpath('//a[@class="next page-numbers"]/@href').extract() # 獲取下一頁文章列表url if x_lb_url: yield Request(url=parse.urljoin(response.url, x_lb_url[0]), callback=self.parse) # 獲取到下一頁url返回給下載器,回調給parse函數循環進行 def parse_wzhang(self, response): title = response.xpath('//div[@class="entry-header"]/h1/text()').extract() # 獲取文章標題 print(title)
5、分佈式爬蟲實現代碼,全站自動爬蟲,至關於crawl命令建立的全站自動爬蟲
注意:分佈式全站自動爬蟲必須繼承scrapy-redis的RedisCrawlSpider類
#!/usr/bin/env python # -*- coding:utf8 -*- from scrapy_redis.spiders import RedisCrawlSpider # 導入scrapy_redis裏的RedisCrawlSpider類 import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import Rule class jobboleSpider(RedisCrawlSpider): # 自定義爬蟲類,繼承RedisSpider類 name = 'jobbole' # 設置爬蟲名稱 allowed_domains = ['www.luyin.org'] # 爬取域名 redis_key = 'jobbole:start_urls' # 向redis設置一個名稱儲存url rules = ( # 配置抓取列表頁規則 # Rule(LinkExtractor(allow=('ggwa/.*')), follow=True), # 配置抓取內容頁規則 Rule(LinkExtractor(allow=('.*')), callback='parse_job', follow=True), ) def parse_job(self, response): # 回調函數,注意:由於CrawlS模板的源碼建立了parse回調函數,因此切記咱們不能建立parse名稱的函數 # 利用ItemLoader類,加載items容器類填充數據 neir = response.css('title::text').extract() print(neir)
6、settings.py文件配置
# 分佈式爬蟲設置 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 使調度在redis存儲請求隊列 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 確保全部的蜘蛛都共享相同的過濾器經過Redis複製 ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 300 # 存儲在redis刮項後處理 }
7、執行分佈式爬蟲
一、運行命令:scrapy crawl jobbole(jobbole表示爬蟲名稱)
二、啓動redis,而後cd到redis的安裝目錄,
執行命令:redis-cli -h 127.0.0.1 -p 6379 鏈接一個redis客戶端
在鏈接客戶端執行命令:lpush jobbole:start_urls http://blog.jobbole.com/all-posts/ ,向redis列隊建立一個起始URL
說明:lpush(列表數據) jobbole:start_urls(爬蟲裏定義的url列隊名稱) http://blog.jobbole.com/all-posts/(初始url)
8、scrapy-redis編寫分佈式爬蟲代碼原理
其餘使用方法和單機版爬蟲同樣