三十四 Python分布式爬蟲打造搜索引擎Scrapy精講—scrapy信號詳解

信號一般使用信號分發器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)
復制代碼

?

轉載于:https://www.cnblogs.com/meng-wei-zhi/p/8182807.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390427.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390427.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1713. 得到子序列的最少操作次數

給你一個數組 target ,包含若干 互不相同 的整數,以及另一個整數數組 arr ,arr 可能 包含重復元素。 每一次操作中,你可以在 arr 的任意位置插入任一整數。比方說,如果 arr [1,4,1,2] ,那么你可以在中間添…

CVE-2018-1000136:Electron nodeIntegration繞過漏洞

1周前,研究人員發現一個影響Electron所有版本的漏洞,利用該漏洞可以開啟nodeIntegration,這可能會造成遠程代碼執行。Electron是一個使用JavaScript,HTML和CSS等Web技術創建原生程序的框架,它負責比較難搞的部分,而用戶…

bash腳本 文件_如何使用Bash腳本來管理從AWS S3存儲桶下載和查看文件

bash腳本 文件As you can read in this article, I recently had some trouble with my email server and decided to outsource email administration to Amazons Simple Email Service (SES). 正如您在本文中所讀到的 ,最近我的電子郵件服務器遇到了一些麻煩&…

rsync(六)命令中文手冊

rsync(1) rsync(1)名稱rsync - 一個快速、多功能的遠程(和本地)文件拷貝工具摘要Local: rsync [OPTION...] SRC... [DEST]Access via remote shell:Pull: rsync [OPTION...] [USE…

NFS共享存儲服務部署

服務端部署 1、檢查服務器上是否已安裝nfs及rpc,沒有則需要安裝檢查rpm -qa rpcbind nfs-utils安裝(已安裝略過)yum install -y rpcbind nfs-utils################################################################2、編寫nfs的配置文件cat…

區塊鏈運作機制_什么是區塊鏈及其運作方式?

區塊鏈運作機制If youre interested in technology, theres a good chance you’ve probably heard the terms Bitcoin, Crypto, Ethereum, or even "distributed, decentralized ledgers."如果您對技術感興趣,那么您很有可能已經聽說過比特幣&#xff0c…

敏捷管理之績效考核方案

前段時間,公司簽了年終獎確認。覺得公司發放年終獎完全是憑主觀發放,沒有事實依據,由此產生了對如何發放年終獎的一些想法。 獎金發放作為激勵員工最直接的手段,往往也是讓管理人員最難抉擇的,而且很多公司&#xff0c…

序言

為什么要寫這篇文章? 說起架構,剛入行的新人覺得是高大上的技術,有工作經驗的一些人又覺得是虛無縹緲的東西,不能落實。具體有用沒用,我不給答案,想通過寫這么一個例子來還原場景,讓讀者自己判斷…

kotlin編程語言_Kotlin初學者編程基礎

kotlin編程語言什么是Kotlin? (What is Kotlin?) Kotlin is a programming language developed by Jetbrains, the company behind some of the world’s most popular IDEs like IntelliJ and Pycharm.Kotlin是Jetbrains開發的一種編程語言,該公司是In…

記一個蒟蒻的絕望

感覺現在…… 怎么講,心挺冷的。 今天一月五號了。距離省選,時間好短啊。 我還有那么多東西不懂。甚至聽都沒聽說過。 等到真正去省選的時候,我可能跟現在一樣,什么都不會。 我的名字能不能被看到都不知道。哈,還進隊呢…

671. 二叉樹中第二小的節點

給定一個非空特殊的二叉樹,每個節點都是正數,并且每個節點的子節點數量只能為 2 或 0。如果一個節點有兩個子節點的話,那么該節點的值等于兩個子節點中較小的一個。 更正式地說,root.val min(root.left.val, root.right.val) 總…

CentOS查詢端口占用和清除端口占用的程序

1、查詢端口號占用,根據端口查看進程信息 [rootserver2 ~]# lsof -i:80COMMAND PID USER FD TYPE DEVICE SIZE NODE NAMEhttpd 5014 root 3u IPv4 14346 TCP server2:http (LISTEN)2、根據進程號查看進程對應的可執行程序 ps -f -p 進程號# p…

Android基礎夯實--你了解Handler有多少?

概述 對于剛入門的同學來說,往往都會對Handler比較迷茫,到底Handler是個什么樣的東西。當然,可能對于一些有工作經驗的工程師來說,他們也不一定能很準確地描述,我們來看下API的介紹。 Handler是用來結合線程的消息隊列…

spring與springBoot不同之處

( 1)遵循“習慣優于配置”的原則,使用Spring Boot只需要很少的配置,大部分的時候我們直接使用默認的配置即可; (2)項目快速搭建,可以無需配置的自動整合第三方的框架; (3…

sketch-a-net_Adobe XD,Sketch,Figma,InVision-如何在2020年選擇最佳設計軟件

sketch-a-netComparing Adobe XD vs Sketch vs Figma vs InVision studio is a very common topic among designers who are looking for the best design software. 在尋求最佳設計軟件的設計師中,比較Adobe XD,Sketch,Figma和InVision Stud…

merge intervals(合并間隔)

Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,10],[15,18],return [1,6],[8,10],[15,18]. 題目沒有說所有間隔的start是依次增加的。所以,為了方便討論,我們要將所有間隔按照start升序排列。因…

劍指 Offer 49. 丑數

我們把只包含質因子 2、3 和 5 的數稱作丑數(Ugly Number)。求按從小到大的順序的第 n 個丑數。 示例: 輸入: n 10 輸出: 12 解釋: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 個丑數。 說明: 1 是丑數。n 不超過1690。 解題思路 使用小根堆&#xf…

維護舊項目_為什么您的舊版軟件難以維護-以及如何處理。

維護舊項目Believe it or not, some organizations still rely on legacy software to carry out operations even though newer and more versatile options are available. We know that “old is gold”, but legacy applications cannot glitter forever. As such, these o…

python--內置函數

內置函數現在python一共為我們提供了68個內置函數,講述過程:一、其他中的12個 (一)執行 字符串 類型代碼的執行 1 eval執行有意義的字符串 ,有返回值 print(eval(12))print(eval("print(美麗)")) #美麗 2 ex…

Nancy簡單實戰之NancyMusicStore(四):實現購物車

原文:Nancy簡單實戰之NancyMusicStore(四):實現購物車前言 上一篇,我們完成了商品的詳情和商品的管理,這一篇我們來完成最后的一個購物車功能。 購物車,不外乎這幾個功能:添加商品到購物車,刪除購物車中的商…