今天是4.18號。
上周五的時候參加了中國銀聯的暑期實習生筆試,然后收到通知說讓周天早上去上海總部面試,自己又錯過了那邊打過來的電話,本想問可不可以視頻面試的,結果是非常遺憾的沒有去參加面試。本來暑期實習就不好找,怎么說最終還是怪自己。
論文還是沒有出結果,大概還要等上一個星期吧,而python爬蟲的學習也還要花差不多兩周的時間。
首先聲明下面的報錯是在使用BeautifulSoup的基礎上的
**(1).list index out of range **
這種情況基本就是你獲取的列表為空,所以在選取第x各元素([x])時就會報錯。
(2).requests 要對返回的狀態碼做判斷
r=requests.get(url)
if r.status_code==200:
(3).異常
異常是指程序中的例外,違例情況。異常機制是指程序出現錯誤后,程序的處理方法。當出現錯誤后,程序的執行流程發生改變,程序的控制權轉移到異常處理。可能情況有,比如寫入文件的時候,磁盤滿了,寫不進去了;從網絡抓取數據,網絡突然斷掉了;抓取數據時ip被封等等。
其他異常如寫進文件時磁盤滿了等情況在后面進行文件操作時才會涉及。單單就爬蟲過程來看一般是在requests()過程中出現下面幾種異常情況:
一、遇到網絡問題時,Requests會拋出一個 ConnectionError 異常。
(具體情況有兩種:一是請求的網址錯誤或不存在;二是網絡中斷)
二、遇到無效HTTP響應時,Requests則會拋出一個 HTTPError 異常。
(具體情況有:服務器拒絕連接,即ip被封等)
一般HTTPError又分為 4XX:客戶端錯誤 和 5XX:服務器錯誤。
對于前兩種異常通常使用try...exception...來解決,具體如下:
try:
#這一部分寫正常的運行語句
req=requests.get(url)
...
...
except (requests.ConnectionError, IndexError, UnicodeEncodeError,TimeoutError)
print(e.args)
except requests.HTTPError as f:
print('The server couldn\'t fulfill the request.')
ip被封處理辦法
三、若請求超時,則拋出一個 Timeout 異常。
(具體情況有:網絡斷開,但經常顯示無法連接;網絡阻塞;網絡不穩定,網絡無法完整傳送服務器信息;系統原因,系統資源過低,不足以)
解決辦法:
Timeout又分為connect timeout和read timeout。前者指的是你發出request請求到和服務器建立連接之間的等待時間;后者是同服務器建立連接后到服務器發回response之間的等待時間。那么在請求時可以加上相應的timeout時間,形式如下:
a).r = requests.get('https://XXXX.com', timeout=5)表示默認connect timeout和read timeout的值均為5秒;
b). r = requests.get('https://XXXX.com', timeout=(3.05, 27))表示connect timeout=3.05秒,read timeout=27秒;
c).r = requests.get('https://XXXX.com', timeout=None)則表示一直等待到服務器有響應為止。
此外再了解一些新的知識
(4).range()雖然返回的是一個整數列表,但不能直接進行賦值,例如a=range(10),而應該是a=list(range(10))
(5).用關鍵字lambda表示匿名函數,lambda x: x*x實際上就是:
def f(x):
return x * x
冒號前面的x表示函數參數。匿名函數有個限制,就是只能有一個表達式,不用寫return,返回值就是該表達式的結果;但用匿名函數也有個好處,因為函數沒有名字,不必擔心函數名沖突。此外,匿名函數也是一個函數對象,也可以把匿名函數賦值給一個變量,再利用變量來調用該函數。
最后附上: