三十四 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解
信號一般使用信號分發(fā)器dispatcher.connect(),來設(shè)置信號,和信號觸發(fā)函數(shù),當(dāng)捕獲到信號時執(zhí)行一個函數(shù)
dispatcher.connect()信號分發(fā)器,第一個參數(shù)信號觸發(fā)函數(shù),第二個參數(shù)是觸發(fā)信號,
?
以下是各種信號
signals.engine_started當(dāng)Scrapy引擎啟動爬取時發(fā)送該信號。該信號支持返回deferreds。
signals.engine_stopped當(dāng)Scrapy引擎停止時發(fā)送該信號(例如,爬取結(jié)束)。該信號支持返回deferreds。
?
signals.item_scraped(item, response, spider)當(dāng)item被爬取,并通過所有 Item Pipeline 后(沒有被丟棄(dropped),發(fā)送該信號。該信號支持返回deferreds。
參數(shù):
item (Item 對象) – 爬取到的item
spider (Spider 對象) – 爬取item的spider
response (Response 對象) – 提取item的response
signals.item_dropped(item, exception, spider)當(dāng)item通過 Item Pipeline ,有些pipeline拋出 DropItem 異常,丟棄item時,該信號被發(fā)送。該信號支持返回deferreds。
參數(shù):
item (Item 對象) – Item Pipeline 丟棄的item
spider (Spider 對象) – 爬取item的spider
exception (DropItem 異常) – 導(dǎo)致item被丟棄的異常(必須是 DropItem 的子類)
signals.spider_closed(spider, reason)當(dāng)某個spider被關(guān)閉時,該信號被發(fā)送。該信號可以用來釋放每個spider在 spider_opened 時占用的資源。該信號支持返回deferreds。
參數(shù):
spider (Spider 對象) – 關(guān)閉的spider
reason (str) – 描述spider被關(guān)閉的原因的字符串。如果spider是由于完成爬取而被關(guān)閉,則其為 'finished' 。否則,如果spider是被引擎的 close_spider 方法所關(guān)閉,則其為調(diào)用該方法時傳入的 reason 參數(shù)(默認為 'cancelled')。如果引擎被關(guān)閉(例如, 輸入Ctrl-C),則其為 'shutdown' 。
signals.spider_opened(spider)當(dāng)spider開始爬取時發(fā)送該信號。該信號一般用來分配spider的資源,不過其也能做任何事。該信號支持返回deferreds。
參數(shù): spider (Spider 對象) – 開啟的spider
signals.spider_idle(spider)當(dāng)spider進入空閑(idle)狀態(tài)時該信號被發(fā)送。空閑意味著:
requests正在等待被下載
requests被調(diào)度
items正在item pipeline中被處理
當(dāng)該信號的所有處理器(handler)被調(diào)用后,如果spider仍然保持空閑狀態(tài), 引擎將會關(guān)閉該spider。當(dāng)spider被關(guān)閉后, spider_closed 信號將被發(fā)送。您可以,比如,在 spider_idle 處理器中調(diào)度某些請求來避免spider被關(guān)閉。該信號 不支持 返回deferreds。
參數(shù): spider (Spider 對象) – 空閑的spider
signals.spider_error(failure, response, spider)當(dāng)spider的回調(diào)函數(shù)產(chǎn)生錯誤時(例如,拋出異常),該信號被發(fā)送
參數(shù):
failure (Failure 對象) – 以Twisted Failure 對象拋出的異常
response (Response 對象) – 當(dāng)異常被拋出時被處理的response
spider (Spider 對象) – 拋出異常的spider
signals.request_scheduled(request, spider)當(dāng)引擎調(diào)度一個 Request 對象用于下載時,該信號被發(fā)送。該信號 不支持 返回deferreds。
參數(shù):
request (Request 對象) – 到達調(diào)度器的request
spider (Spider 對象) – 產(chǎn)生該request的spider
signals.response_received(response, request, spider)當(dāng)引擎從downloader獲取到一個新的 Response 時發(fā)送該信號。該信號 不支持 返回deferreds。
參數(shù):
response (Response 對象) – 接收到的response
request (Request 對象) – 生成response的request
spider (Spider 對象) – response所對應(yīng)的spider
signals.response_downloaded(response, request, spider)當(dāng)一個 HTTPResponse 被下載時,由downloader發(fā)送該信號。該信號 不支持 返回deferreds。
參數(shù):
response (Response 對象) – 下載的response
request (Request 對象) – 生成response的request
spider (Spider 對象) – response所對應(yīng)的spider
?
我們以signals.spider_closed(spider, reason)信號舉例其他信號同理:
# -*- coding: utf-8 -*- import scrapy from scrapy.http import Request,FormRequest from scrapy.xlib.pydispatch import dispatcher # 信號分發(fā)器 from scrapy import signals # 信號class PachSpider(scrapy.Spider): #定義爬蟲類,必須繼承scrapy.Spidername = 'pach' #設(shè)置爬蟲名稱allowed_domains = ['www.dict.cn'] #爬取域名def start_requests(self): #起始url函數(shù),會替換start_urlsreturn [Request(url='http://www.dict.cn/9999998888',callback=self.parse)]# 利用數(shù)據(jù)收集器,收集所有404的url以及,404頁面數(shù)量handle_httpstatus_list = [404] # 設(shè)置不過濾404def __init__(self):self.fail_urls = [] # 創(chuàng)建一個變量來儲存404URLdispatcher.connect(self.spider_closed, signals.spider_closed) # dispatcher.connect()信號分發(fā)器,第一個參數(shù)信號觸發(fā)函數(shù),第二個參數(shù)是觸發(fā)信號,signals.spider_closed是爬蟲結(jié)束信號def spider_closed(self, spider, reason): # 信號觸發(fā)函數(shù)print('爬蟲結(jié)束 停止爬蟲')print(self.fail_urls) # 打印404URL列表print(self.crawler.stats.get_value('failed_url')) # 打印數(shù)據(jù)收集值def parse(self, response): # 回調(diào)函數(shù)if response.status == 404: # 判斷返回狀態(tài)碼如果是404self.fail_urls.append(response.url) # 將URL追加到列表self.crawler.stats.inc_value('failed_url') # 設(shè)置一個數(shù)據(jù)收集,值為自增,每執(zhí)行一次自增1else:title = response.css('title::text').extract()print(title)?
轉(zhuǎn)載于:https://www.cnblogs.com/meng-wei-zhi/p/8182807.html
總結(jié)
以上是生活随笔為你收集整理的三十四 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十 web爬虫讲解2—Scrapy框架
- 下一篇: rsync(六)命令中文手册