在爬取一個小站時,遇到了前幾十條網頁能順利爬取,但突然報錯的情況。
報錯信息如下:Message=HTTPConnectionPool(host=‘pub.sinoss.net’, port=80): Max retries exceeded with url: /portal/webgate/CmdProjectView?proj_id=212473&applier=%C0%EE%BB%B3%C1%C1 (Caused by NewConnectionError(’<urllib3.connection.HTTPConnection object at 0x000001B7EEE35A58>: Failed to establish a new connection: [WinError 10060] 由於連接方在一段時間后沒有正確答復或連接的主機沒有反應,連接嘗試失敗。’,))
把這個報錯信息一百度,發現有很多博客,但都沒能解決問題。在嘗試了一中午之后,終於成功了!現將經驗做一簡要總結:
報錯原因如下:
1.ip被封。
2.http的連接數超過最大限制。headers的Connection參數默認為keep-alive,導致之前所有的鏈接都一直存在,占用了后續的鏈接請求。
3.網站服務器太差,爬取請求的速度太快。(我的就是這樣)
解決方案:
1.換ip,更換headers或者使用代理ip。
2.將Connection參數的值改為close。或者在requests.get前一行添加requests.adapters.DEFAULT_RETRIES = 5
,意思是連接失敗時重連五次。
3.將爬取操作放在while語句中。格式如下(此條100%有用):
while True: try: response = requests.get(url, headers=headers,timeout=(30,50),verify=False) break except: print("Connection refused by the server..") print("Let me sleep for 5 seconds") print("ZZzzzz...") t.sleep(5) print("Was a nice sleep, now let me continue...") continue