python 網路爬蟲與資訊採取之異常處理

2021-08-06 02:49:41 字數 2889 閱讀 6773

本篇文章**ryan mitchell 寫的python:網路資料採集

網路是十分複雜的。網頁資料格式不友好,**伺服器宕機,目標資料的標籤找不到,都是很麻煩的事情。網路資料採集最痛苦的遭遇之一,就是爬蟲執行的時候你洗洗睡了,夢想著明天一早資料就都會採集好放在資料庫裡,結果第二天醒來,你看到的卻是乙個因某種資料格式異常導致執行錯誤的爬蟲,在前一天當你不再盯著螢幕去睡覺之後,沒過一會兒爬蟲就不再執行了。那個時候,你可能想罵發明網際網路(以及那些奇葩的網路資料格式)的人,但是你真正應該斥責的人是你自己,為什麼一開始不估計可能會出現的異常!

讓我們看看爬蟲 import 語句後面的第一行**,如何處理那裡可能出現的異常:

html = urlopen("")

這行**主要可能會發生兩種異常:

• 網頁在伺服器上不存在(或者獲取頁面的時候出現錯誤)

• 伺服器不存在第一種異常發生時,程式會返回 http 錯誤。

http 錯誤可能是「404 page not found」「500internal server error」等。所有類似情形,urlopen 函式都會丟擲「httperror」異常。我們可以用下面的方式處理這種異常:

print(e) # 返回空值,中斷程式,或者執行另乙個方案

else: # 程式繼續。注意:如果你已經在上面異常捕捉那一段**裡返回或中斷(break), # 那麼就不需要使用else語句了,這段**也不會執行如果程式返回 http 錯誤**,程式就會顯示錯誤內容,不再執行 else 語句後面的**。

如果伺服器不存在(就是說鏈結 打不開,或者是 url 鏈結寫錯了),urlopen 會返回乙個 none 物件。這個物件與其他程式語言中的 null 類似。我們可以增加乙個判斷語句檢測返回的 html 是不是none:

if html is none:

print(「url is not found」)

else: # 程式繼續

網頁已經從伺服器成功獲取,如果網頁上的內容並非完全是我們期望的那樣,仍然可能會出現異常。每當你呼叫 beautifulsoup 物件裡的乙個標籤時,增加乙個檢查條件保證標籤確實存在是很聰明的做法。如果你想要呼叫的標籤不存在,beautifulsoup 就會返初見網路爬蟲 | 9回 none 物件。不過,如果再呼叫這個 none 物件下面的子標籤,就會發生 attributeerror錯誤。下面這行**(nonexistenttag 是虛擬的標籤,beautifulsoup 物件裡實際沒有)print(bsobj.nonexistenttag)會返回乙個 none 物件。處理和檢查這個物件是十分必要的。如果你不檢查,直接呼叫這個none 物件的子標籤,麻煩就來了。如下所示。

print(bsobj.nonexistenttag.sometag)

attributeerror: 'nonetype' object has no attribute 'sometag'

我們怎麼才能避免這兩種情形的異常呢?最簡單的方式就是對兩種情形進行檢查:

try: badcontent = bsobj.nonexistingtag.anothertag

except attributeerror as e:

print("tag was not found")

else:

if badcontent == none:

print ("tag was not found")

else: print(badcontent)

`初看這些檢查與錯誤處理的**會覺得有點兒累贅,但是,我們可以重新簡單組織一下**,讓它變得不那麼難寫(更重要的是,不那麼難讀)。例如,下面的**是上面爬蟲的另一種寫法:
from urllib.request import urlopenfrom

print(title)

第 1 章在這個例子中,我們建立了乙個 gettitle 函式,可以返回網頁的標題,如果獲取網頁的時候遇到問題就返回乙個 none 物件。在 gettitle 函式裡面,我們像前面那樣檢查了httperror,然後把兩行 beautifulsoup **封裝在乙個 try 語句裡面。這兩行中的任何一行有問題,attributeerror 都可能被丟擲(如果伺服器不存在,html 就是乙個 none 物件,html.read() 就會丟擲 attributeerror)。其實,我們可以在 try 語句裡面放任意多行**,或者放乙個在任意位置都可以丟擲 attributeerror 的函式。在寫爬蟲的時候,思考**的總體格局,讓**既可以捕捉異常又容易閱讀,這是很重要的。如果你還希望能夠很大程度地重用**,那麼擁有像 getsitehtml 和 gettitle 這樣的通用函式(具有周密的異常處理功能)會讓快速穩定地網路資料採集變得簡單易行。

Python網路爬蟲與資訊提取(2) 爬蟲協議

上一節學習了requests庫,這一節學習robots協議 宣告robots協議,一般放在 的根目錄下,robots.txt檔案 京東robots鏈結 user agent disallow disallow pop html disallow pinpai html?user agent etao...

python 網路爬蟲之資訊標記與提取

find all name,attrs,recursive,string,kwargs 返回列表型別,儲存查詢結果 屬性說明 name 對標籤名稱的檢索字串,可以 attrs 對標籤屬性值的檢索字串,可標註屬性檢索 recursive 是否對子孫所有節點進行搜尋,預設true string 對標籤中...

python網路爬蟲(四) 資訊標記與資訊提取

方式 說明應用領域 xml最早的通用資訊標記語言,可擴充套件性好,但繁瑣 internet上資訊的互動與傳遞 json 資訊有型別,適合程式處理 js 比xml簡潔 移動應用雲端和節點的資訊通訊,無注釋 yaml 資訊無型別,文字資訊比例最高,可讀性好 各類系統的配置檔案,有注釋易讀 二.資訊提取的...