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

全國(guó)咨詢/投訴熱線:400-618-4000

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

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

好口碑IT培訓(xùn)

每個(gè)程序在運(yùn)行過程中可能會(huì)遇到各種各樣的問題,網(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故障、拒絕連接等),就會(huì)導(dǎo)致程序引發(fā)異常并停止運(yùn)行。 requests.exceptions模塊中定義了很多異常類型,常見的異常類型如表所示。

 Python爬蟲異常類型

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

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

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

import time
import requests
# 記錄請(qǐng)求的發(fā)起時(shí)間
print(time.strftime('開始時(shí)間:%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)
#記錄請(qǐng)求的終止時(shí)間
print(time.strftime('結(jié)束時(shí)間:Y-im-d H:iM:S'))

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

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

開始時(shí)間: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]由于連接方
在一段時(shí)間后沒有正確答復(fù)或連接的主機(jī)沒有反應(yīng),連接嘗試失致。))
   結(jié)束時(shí)間:2021-06-1613:51:14

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

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

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

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

   開始時(shí)間: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é)束時(shí)間:2021-06-1614:30:06

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

0 分享到:
和我們?cè)诰€交談!