更新時(shí)間:2023年09月06日17時(shí)05分 來源:傳智教育 瀏覽次數(shù):
每個(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模塊中定義了很多異常類型,常見的異常類型如表所示。
上表中羅列了一些常見的異常類型。其中,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)致訪問失敗。
怎么實(shí)現(xiàn)Hbase的預(yù)分區(qū)?_大數(shù)據(jù)入門培訓(xùn)
2023-08-28Hive的join有幾種方式,怎么實(shí)現(xiàn)join的?_大數(shù)據(jù)入門培訓(xùn)
2023-08-28Flink是如何做到高效的數(shù)據(jù)交換的?_大數(shù)據(jù)基礎(chǔ)培訓(xùn)
2023-08-25Kafka與傳統(tǒng)消息系統(tǒng)之間的三個(gè)關(guān)鍵區(qū)別是什么?
2023-08-25HBase Region分裂的意義是什么?_大數(shù)據(jù)基礎(chǔ)培訓(xùn)
2023-08-24Hadoop有哪些調(diào)度器,工作方法都是什么?
2023-08-24北京校區(qū)