最近經常接到別人反饋某個爬蟲工具程序沒有正常運行,需要下載的資訊數據也沒有及時進行收錄。
剛開始以為可能是機器的問題,偶爾機器會出現程序運行中途卡住的情況。
但隨着異常的情況越來越頻繁,我便只好去排查問題。
通過查看程序運行的日志信息,發現程序總是卡在requests請求的那一步。
這讓我覺得很奇怪,這一步為什么會卡住呢,我已經設置了超時時間,按理說超時的話程序會進入異常啊,然而卻什么異常信息都沒有輸出。
查找了相關的資料,發現確實存在這種情況。
requests文檔上有寫,timeout is not a time limit on the entire response download; rather, an exception is raised if the server has not issued a response for timeout seconds (more precisely, if no bytes have been received on the underlying socket for timeout seconds). If no timeout is specified explicitly, requests do not time out.
大概的意思就是說requests請求上設置的timeout不是整個響應下載的時間限制,這里的timeout應該理解為與服務器連接后接收數據的時間,如果超過規定的時間則為超時。這與我之前的理解有很大不同。
那么如何解決這個問題呢?
目前有兩種方法解決,一種是更改dns,並且推薦阿里的dns,因為他們認為這里的卡住是因為卡在了dns解析那里。
另一種則是設置全局的socket超時時間,通過
import socket
socket.setdefaulttimeout(時間)
這兩句代碼來解決。
通過測試,使用第二種方案后,程序還是會卡住。(難道真的是卡在dns解析?如果是的話,只能更改dns嗎?有沒有別的辦法?)
因為目前對網絡連接方面不是很了解,所以尚不太清楚具體原因。這個問題先留在這,待解決時再來補充。
#補充
最近嘗試了第二種方案,發現能夠有效解決問題,就是說這里的請求確實是卡在了解析dns的那一步。
解決方案是直接修改linux機器的hosts文件,指定域名訪問的ip地址,免去解析dns的步驟。