異常處理正則表達式
做爲爬蟲的抓取過程基本就那麼多內容了,後面再將一些正則表達式的東西簡單介紹一下基本就完事了,下面先說說異常處理的方法。先介紹一下抓取過程當中的主要異常,如URLError和HTTPError。編程
URLError可能產生的緣由主要有:網絡無鏈接,即本機沒法上網;鏈接不到特定的服務器;服務器不存在等。以下所示:瀏覽器
錯誤代號是11004,錯誤緣由是getaddrinfo failed。這類錯誤相對來講比較少,理由是在咱們抓取網頁時,通常都會人工經過瀏覽器訪問一遍,而最爲常見的是HTTPError。服務器
HTTPError是URLError的子類,在你利用urlopen方法發出一個請求時,服務器上都會對應一個應答對象response,其中它包含一個數字「狀態碼」。舉個例子,假如response是一個「重定向」,需定位到別的地址獲取文檔,urllib2將對此進行處理。網絡
其餘不能處理的,urlopen會產生一個HTTPError,對應相應的狀態碼,HTTP狀態碼錶示HTTP協議所返回的響應的狀態。下面將狀態碼歸結以下:url
HTTPError實例產生後會有一個code屬性,這就是服務器發送的相關錯誤號。由於urllib2能夠爲你處理重定向,也就是3開頭的代號能夠被處理,而且100~299範圍的號碼指示成功,因此咱們只能看到400~599的錯誤號碼。另外可能還會遇到1005三、10060等狀態碼,通常都是服務器不穩定形成的,多刷新幾回就行了。spa
捕獲的異常是HTTPError,它會帶有一個code屬性,就是錯誤代號,另外咱們又打印了reason屬性,這就是它的父類URLError的屬性。.net
錯誤代號是403,錯誤緣由是Forbidden,說明服務器禁止訪問。日誌
咱們知道,HTTPError的父類是URLError,根據編程經驗,父類的異常應當寫到子類異常的後面,若是子類捕獲不到,那麼能夠捕獲父類的異常,因此上述的代碼能夠改寫爲:code
首先對異常的屬性進行判斷,以避免出現屬性輸出報錯的現象。
不過,就我我的而言,我不喜歡單獨捕獲該類異常,由於在實際應用過程當中,會出項各類各樣的異常,爬蟲任務每每都是幾天幾夜的連續工做,咱們又不可能24小 時盯着,因此一旦異常捕獲不到就會形成爬蟲程序的崩潰,而若是你尚未設置相關爬取進度的日誌,這基本就是個失敗的任務。因此在爬蟲中,異常的捕獲一般不 僅僅是報告異常的緣由,更重要的是加強程序的健壯性,不至於因異常而崩潰,因此一般個人作法就是從全局角度捕獲全部異常。
能夠在異常捕獲後記錄到log日誌文件中,待全部任務初步完成後,能夠再對log日誌裏有問題的內容進行二次處理。