教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Python爬蟲程序會出現(xiàn)哪些異常情況?怎樣處理?

更新時間:2023年09月06日17時05分 來源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

每個程序在運行過程中可能會遇到各種各樣的問題,網(wǎng)絡(luò)爬蟲自然也不例外。網(wǎng)絡(luò)爬蟲訪問網(wǎng)站離不開網(wǎng)絡(luò)的支撐。由于網(wǎng)絡(luò)環(huán)境十分復(fù)雜,具有一定的不可控性,所以網(wǎng)絡(luò)爬蟲每次訪問網(wǎng)站后不一定能夠成功地獲得從服務(wù)器返回的數(shù)據(jù)。網(wǎng)絡(luò)爬蟲一旦在訪問過程中遇到一些網(wǎng)絡(luò)問題(如DNS故障、拒絕連接等),就會導(dǎo)致程序引發(fā)異常并停止運行。 requests.exceptions模塊中定義了很多異常類型,常見的異常類型如表所示。

 Python爬蟲異常類型

上表中羅列了一些常見的異常類型。其中,Timeout繼承自RequestException,Connect Timeout 和ReadTimeout 繼承自Timeout。

為保證程序能夠正常終止,我們可以使用try-except語句捕獲相應(yīng)的異常,并對異常進行相應(yīng)的隊理。

由于谷歌網(wǎng)站服務(wù)器的原因,訪問該網(wǎng)站必定會出現(xiàn)連接超時的問題。下面以訪問谷歌網(wǎng)站為例,為大家演示如何使用try-except語句捕獲RequestException異常,具體代碼如下。

import time
import requests
# 記錄請求的發(fā)起時間
print(time.strftime('開始時間:%Y-%m-%d %H:%M:%S'))
# 捕獲RequestException異常
try:
   html_atr = requests.get('http://www.google.com').text
   print('訪問成功')
except requests.exceptions.RequestException as error:
    print(error)
#記錄請求的終止時間
print(time.strftime('結(jié)束時間:Y-im-d H:iM:S'))

上述代碼中,第4行代碼記錄了發(fā)送請求之后的時間。第6~10行代碼使用try-except語句嘗試捕獲與處理RequestException異常。其中,第6~8行代碼在try子句中調(diào)用getO函數(shù)訪問谷歌網(wǎng)站,并在訪問成功后輸出“訪問成功”。第9~10行代碼在except子句中指定了捕獲的異常類型為RequestException。程序監(jiān)測到try子句中的代碼拋出RequestException異常時,會捕獲RequestException和所有繼承自RequestException的異常,并在捕獲異常后輸出詳細的異常信息。第12行代碼記錄了終止請求之后的時間。

運行代碼,輸出如下結(jié)果。

開始時間:2021-06-1613:50:53
   HTTPConnectionPool(host='www.google.com',port=80):Max retries exceeded with url:
/  (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at
Ox00000000034D6790>:Failed to establish a new connection:[NinError 10060]由于連接方
在一段時間后沒有正確答復(fù)或連接的主機沒有反應(yīng),連接嘗試失致。))
   結(jié)束時間:2021-06-1613:51:14

通過對比結(jié)束時間與開始時間可知,我們等待了約20秒,這個時間相對來說有些長,這種長時間的等待是沒有任何意義的。

為了減少無意義的等待,我們在發(fā)送HTTP請求時可以設(shè)置超時時長,即調(diào)用getO函數(shù)時傳入timeout參數(shù),并給該參數(shù)指定代表超時時長的值。如果超過該時長,服務(wù)器仍然沒有返回任何響應(yīng)內(nèi)容,就讓程序立即引發(fā)一個超時異常。在以上示例中,為請求設(shè)置超時時長為5秒,具體代碼如下。

# 發(fā)送GET請求,設(shè)置超時時長
Im html_str = requests.get('http://www.google.com', timeout=5).text

再次運行代碼,輸出如下結(jié)果。

   開始時間:2021-06-1614:30:01
HTTPConnectionPool(host='www.google.con', port=80): Max retries exceeded with url:
/  (Caused by ConnectTimeoutError(surllib3.connection.HTrPConnection object at
Ox00000000033E23D0>, 'Connection to www.google.com timed out. (connect timeout=5)'))
   結(jié)束時間:2021-06-1614:30:06

通過對比結(jié)果中的結(jié)束時間和開始時間可知,程序執(zhí)行了5秒后便直接結(jié)束,并拋出ConnectTimeoutError異常及提示信息“Connection to www.google.com timed out”。這說明連接谷歌網(wǎng)站時超過了預(yù)設(shè)的等待時長而導(dǎo)致訪問失敗。

0 分享到:
和我們在線交談!