Scrapy學習-21-信號量

scrapy信號量
定義
  Scrapy使用信號來通知事情發生。您能夠在您的Scrapy項目中捕捉一些信號(使用 extension)來完成額外的工做或添加額外的功能,擴展Scrapy。
  雖然信號提供了一些參數,不過處理函數不用接收全部的參數 - 信號分發機制(singal dispatching mechanism)僅僅提供處理器(handler)接受的參數。
  您能夠經過 信號(Signals) API 來鏈接(或發送您本身的)信號
 
可用信號
engine_started      當Scrapy引擎啓動爬取時發送該信號

engine_stopped      當Scrapy引擎中止時發送該信號(例如,爬取結束)

item_scraped        當item被爬取,並經過全部 Item Pipeline 後(沒有被丟棄(dropped),發送該信號

item_dropped        當item經過 Item Pipeline ,有些pipeline拋出 DropItem 異常,丟棄item時,該信號被髮送

spider_closed       當某個spider被關閉時,該信號被髮送。該信號能夠用來釋放每一個spider在 spider_opened 時佔用的資源

spider_opened       當spider開始爬取時發送該信號。該信號通常用來分配spider的資源,不過其也能作任何事

spider_idle         當spider進入空閒(idle)狀態時該信號被髮送

spider_error        當spider的回調函數產生錯誤時(例如,拋出異常),該信號被髮送

request_scheduled   當引擎調度一個 Request 對象用於下載時,該信號被髮送

request_dropped     當一個請求,由引擎安排在稍後被下載時,被調度程序拒絕

response_received   當引擎從downloader獲取到一個新的 Response 時發送該信號

response_downloaded 當一個 HTTPResponse 被下載時,由downloader發送該信號

 

信號量使用
import scrapy
from scrapy.xlib.pydispatch import dispatcher
from scrapy import signals

class JobboleSpider(scrapy.Spider):
    name = "jobbole"
    allowed_domains = ["blog.jobbole.com"]
    start_urls = ['http://blog.jobbole.com/all-posts/']
    handle_httpstatus_list = [404]

    def __init__(self, **kwargs):
        self.fail_urls = []
        dispatcher.connect(self.handle_spider_closed, signals.spider_closed)

    def handle_spider_closed(self, spider, reason):
        self.crawler.stats.set_value("failed_urls", ",".join(self.fail_urls))

    def parse(self, response):
        if response.status == 404:
            self.fail_urls.append(response.url)
            self.crawler.stats.inc_value("failed_url")
相關文章
相關標籤/搜索