信號一般使用信號分發器dispatcher.connect(),來設置信號,和信號觸發函數,當捕獲到信號時執行一個函數
dispatcher.connect()信號分發器,第一個參數信號觸發函數,第二個參數是觸發信號,
?
以下是各種信號
signals.engine_started當Scrapy引擎啟動爬取時發送該信號。該信號支持返回deferreds。
signals.engine_stopped當Scrapy引擎停止時發送該信號(例如,爬取結束)。該信號支持返回deferreds。
?
signals.item_scraped(item, response, spider)當item被爬取,并通過所有 Item Pipeline 后(沒有被丟棄(dropped),發送該信號。該信號支持返回deferreds。
參數:
item (Item 對象) – 爬取到的item
spider (Spider 對象) – 爬取item的spider
response (Response 對象) – 提取item的response
signals.item_dropped(item, exception, spider)當item通過 Item Pipeline ,有些pipeline拋出 DropItem 異常,丟棄item時,該信號被發送。該信號支持返回deferreds。
參數:
item (Item 對象) – Item Pipeline 丟棄的item
spider (Spider 對象) – 爬取item的spider
exception (DropItem 異常) – 導致item被丟棄的異常(必須是 DropItem 的子類)
signals.spider_closed(spider, reason)當某個spider被關閉時,該信號被發送。該信號可以用來釋放每個spider在 spider_opened 時占用的資源。該信號支持返回deferreds。
參數:
spider (Spider 對象) – 關閉的spider
reason (str) – 描述spider被關閉的原因的字符串。如果spider是由于完成爬取而被關閉,則其為 'finished' 。否則,如果spider是被引擎的 close_spider 方法所關閉,則其為調用該方法時傳入的 reason 參數(默認為 'cancelled')。如果引擎被關閉(例如, 輸入Ctrl-C),則其為 'shutdown' 。
signals.spider_opened(spider)當spider開始爬取時發送該信號。該信號一般用來分配spider的資源,不過其也能做任何事。該信號支持返回deferreds。
參數: spider (Spider 對象) – 開啟的spider
signals.spider_idle(spider)當spider進入空閑(idle)狀態時該信號被發送。空閑意味著:
requests正在等待被下載
requests被調度
items正在item pipeline中被處理
當該信號的所有處理器(handler)被調用后,如果spider仍然保持空閑狀態, 引擎將會關閉該spider。當spider被關閉后, spider_closed 信號將被發送。您可以,比如,在 spider_idle 處理器中調度某些請求來避免spider被關閉。該信號 不支持 返回deferreds。
參數: spider (Spider 對象) – 空閑的spider
signals.spider_error(failure, response, spider)當spider的回調函數產生錯誤時(例如,拋出異常),該信號被發送
參數:
failure (Failure 對象) – 以Twisted Failure 對象拋出的異常
response (Response 對象) – 當異常被拋出時被處理的response
spider (Spider 對象) – 拋出異常的spider
signals.request_scheduled(request, spider)當引擎調度一個 Request 對象用于下載時,該信號被發送。該信號 不支持 返回deferreds。
參數:
request (Request 對象) – 到達調度器的request
spider (Spider 對象) – 產生該request的spider
signals.response_received(response, request, spider)當引擎從downloader獲取到一個新的 Response 時發送該信號。該信號 不支持 返回deferreds。
參數:
response (Response 對象) – 接收到的response
request (Request 對象) – 生成response的request
spider (Spider 對象) – response所對應的spider
signals.response_downloaded(response, request, spider)當一個 HTTPResponse 被下載時,由downloader發送該信號。該信號 不支持 返回deferreds。
參數:
response (Response 對象) – 下載的response
request (Request 對象) – 生成response的request
spider (Spider 對象) – response所對應的spider
?
我們以signals.spider_closed(spider, reason)信號舉例其他信號同理:
# -*- coding: utf-8 -*- import scrapy from scrapy.http import Request,FormRequest from scrapy.xlib.pydispatch import dispatcher # 信號分發器 from scrapy import signals # 信號class PachSpider(scrapy.Spider): #定義爬蟲類,必須繼承scrapy.Spidername = 'pach' #設置爬蟲名稱allowed_domains = ['www.dict.cn'] #爬取域名def start_requests(self): #起始url函數,會替換start_urlsreturn [Request(url='http://www.dict.cn/9999998888',callback=self.parse)]# 利用數據收集器,收集所有404的url以及,404頁面數量handle_httpstatus_list = [404] # 設置不過濾404def __init__(self):self.fail_urls = [] # 創建一個變量來儲存404URLdispatcher.connect(self.spider_closed, signals.spider_closed) # dispatcher.connect()信號分發器,第一個參數信號觸發函數,第二個參數是觸發信號,signals.spider_closed是爬蟲結束信號def spider_closed(self, spider, reason): # 信號觸發函數print('爬蟲結束 停止爬蟲')print(self.fail_urls) # 打印404URL列表print(self.crawler.stats.get_value('failed_url')) # 打印數據收集值def parse(self, response): # 回調函數if response.status == 404: # 判斷返回狀態碼如果是404self.fail_urls.append(response.url) # 將URL追加到列表self.crawler.stats.inc_value('failed_url') # 設置一個數據收集,值為自增,每執行一次自增1else:title = response.css('title::text').extract()print(title)
?