python捕捉线程错误_Pythonrequests多线程抓取出现HTTPConnectionPoolMaxretiresexceeded异常...
問題: Python requests 多線程抓取 出現(xiàn)HTTPConnectionPool Max retires exceeded異常
描述:
主要代碼如下:import threading
import requests
def get_info():
try:
res = requests.get('http://www.xxx.com/test/json')
if res.status_code == 200 and res.text != '':
print res.text
else:
print res.status_code
time.sleep(10)
get_info()
except Exception as e:
print e
def start():
threads = []
for i in range(40):
threads.append(threading.Thread(target=get_info,args=()))
for t in threads:
time.sleep(0.3)
t.start()
for t in threads:
t.join()
if __name__ == '__main__':
start()
代碼臨時(shí)寫,可能有小錯(cuò)誤,大概就是這么個(gè)意思:
開啟40個(gè)線程,間隔0.3秒請求。剛開始很正常,但是2輪過后幾乎80% 90%的請求都報(bào)異常
HTTPConnectionPool(host='http://www.xxx.com/',port=80):Max retries exceeded with url: /test/json (Caused by(class 'socked.error'):[Errno 10060])
請問是哪里出了問題?
感謝你們的回答
抓的確實(shí)是小站。
我的想法是如果服務(wù)器臨時(shí)封禁的話,應(yīng)該是報(bào)10054的錯(cuò)誤。
可看起來又像是服務(wù)器封禁,前幾輪請求都是很正常的,為什么持續(xù)時(shí)間越長,拋出的異常就越多?
重試幾次的方法我做過,似乎不太起作用:def get_info(retries=3):
if 200:
...
else:
if retries > 0:
time.sleep(5)
get_info(retries-1)
初學(xué)Python,用來作爬蟲。實(shí)際上這個(gè)問題已經(jīng)困擾我很久了。我想這個(gè)應(yīng)該是在爬蟲項(xiàng)目中很常見的問題,請問該如何著手優(yōu)化(少量異常可以接受)這個(gè)問題?解決方案1:
Python-Requests close http connection
最近我也碰到了這個(gè)問題,好像是http連接太多沒有關(guān)閉導(dǎo)致的,你可以看看這個(gè)帖子。
s = requests.session()
s.config['keep_alive'] = False
requests使用了urllib3庫,默認(rèn)的http connection 是keep-alive的,requests中可以設(shè)置False關(guān)閉。解決方案2:
可能是訪問太頻繁,被封禁了?解決方案3:
因?yàn)槟惚镜氐亩丝诓粔蛴昧恕=鉀Q方案4:
你訪問的是小站吧?我遇到過一個(gè)站,爬數(shù)據(jù)有時(shí)會出問題,不知道是服務(wù)器真力不從心還是被臨時(shí)封禁了。解決方案5:
應(yīng)該是你的服務(wù)器與目標(biāo)站之間的網(wǎng)絡(luò)連接出了問題,可以在訪問目標(biāo)站時(shí)多重試幾次..
總結(jié)
以上是生活随笔為你收集整理的python捕捉线程错误_Pythonrequests多线程抓取出现HTTPConnectionPoolMaxretiresexceeded异常...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php mysql ajax 注册验证
- 下一篇: python格式字符_python格式字