更新時間:2023年09月06日17時05分 來源:傳智教育 瀏覽次數:
每個程序在運行過程中可能會遇到各種各樣的問題,網絡爬蟲自然也不例外。網絡爬蟲訪問網站離不開網絡的支撐。由于網絡環(huán)境十分復雜,具有一定的不可控性,所以網絡爬蟲每次訪問網站后不一定能夠成功地獲得從服務器返回的數據。網絡爬蟲一旦在訪問過程中遇到一些網絡問題(如DNS故障、拒絕連接等),就會導致程序引發(fā)異常并停止運行。 requests.exceptions模塊中定義了很多異常類型,常見的異常類型如表所示。
上表中羅列了一些常見的異常類型。其中,Timeout繼承自RequestException,Connect Timeout 和ReadTimeout 繼承自Timeout。
為保證程序能夠正常終止,我們可以使用try-except語句捕獲相應的異常,并對異常進行相應的隊理。
由于谷歌網站服務器的原因,訪問該網站必定會出現連接超時的問題。下面以訪問谷歌網站為例,為大家演示如何使用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('結束時間:Y-im-d H:iM:S'))
上述代碼中,第4行代碼記錄了發(fā)送請求之后的時間。第6~10行代碼使用try-except語句嘗試捕獲與處理RequestException異常。其中,第6~8行代碼在try子句中調用getO函數訪問谷歌網站,并在訪問成功后輸出“訪問成功”。第9~10行代碼在except子句中指定了捕獲的異常類型為RequestException。程序監(jiān)測到try子句中的代碼拋出RequestException異常時,會捕獲RequestException和所有繼承自RequestException的異常,并在捕獲異常后輸出詳細的異常信息。第12行代碼記錄了終止請求之后的時間。
運行代碼,輸出如下結果。
開始時間: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]由于連接方 在一段時間后沒有正確答復或連接的主機沒有反應,連接嘗試失致。)) 結束時間:2021-06-1613:51:14
通過對比結束時間與開始時間可知,我們等待了約20秒,這個時間相對來說有些長,這種長時間的等待是沒有任何意義的。
為了減少無意義的等待,我們在發(fā)送HTTP請求時可以設置超時時長,即調用getO函數時傳入timeout參數,并給該參數指定代表超時時長的值。如果超過該時長,服務器仍然沒有返回任何響應內容,就讓程序立即引發(fā)一個超時異常。在以上示例中,為請求設置超時時長為5秒,具體代碼如下。
# 發(fā)送GET請求,設置超時時長 Im html_str = requests.get('http://www.google.com', timeout=5).text
再次運行代碼,輸出如下結果。
開始時間: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)')) 結束時間:2021-06-1614:30:06
通過對比結果中的結束時間和開始時間可知,程序執(zhí)行了5秒后便直接結束,并拋出ConnectTimeoutError異常及提示信息“Connection to www.google.com timed out”。這說明連接谷歌網站時超過了預設的等待時長而導致訪問失敗。