python requests请求失败重试_Python Requests.post()请求失败时的retry设置
1. 問題描述
通常,我們在做爬蟲工作或遠程接口調用的過程中,往往由于訪問頻率過快等原因遇到連接超時的報錯問題,利用最近調用api.ai.qq.com某個接口舉例如下:
Traceback (most recent call last):
: HTTPSConnectionPool(host='api.ai.qq.com', port=443):
Max retries exceeded with url: /fcgi-bin/nlp/nlp_textpolar (Caused by ProxyError('Cannot connect to proxy.', OSError('Tunnel connection failed: 504 Gateway Time-out',)))
<==>用代碼格式顯示更為清晰:
Traceback (most recent call last):
: HTTPSConnectionPool(host='api.ai.qq.com', port=443):
Max retries exceeded with url: /fcgi-bin/nlp/nlp_textpolar (Caused by ProxyError('Cannot connect to proxy.',
OSError('Tunnel connection failed: 504 Gateway Time-out',)))
之前寫爬蟲時候為了快速解決問題就寫了一堆的while與try來實現鏈接的重新訪問,這種方式可以在一定程度上解決問題,但回看自己的代碼時候總覺得奇丑無比,今天在做一個遠程接口調用時候又遇到這個報錯,想著python的requests模塊中一定有內置方法來解決這個問題,于是便嘗試了一下,但同時又引發了另一個小問題,遂決定記錄一下。
2. 解決方案
其實,我們在http請求中遇到連接超時導致訪問中斷的情況時,往往不需要自己來寫重訪問策略,requests模塊中有對應的重訪問設置,可以通過設置最大重訪問次數,當一次訪問失敗時,會自動進行重新訪問,實現方式(簡化)如下:
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util import Retry
s = requests.Session()
s.mount('https://', HTTPAdapter(max_retries=Retry(total=5)))
resp_get = s.get(url=http_url, data={'key':'value'})
resp_post = s.post(url=http_url, data={'key':'value'})
可以看到,我們設置最大重訪問次數為5。但此時會發現,如果我們使用的是get()方法的話則沒有問題,但如果使用post()方法的話仍然會報錯。通過查資料發現,python的requests模塊使用的urllib3,而urllib3默認對post()方法不設置重訪問,因此需要我們手動指定才可以,修改如下:
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util import Retry
s = requests.Session()
s.mount('https://', HTTPAdapter(max_retries=Retry(total=5, method_whitelist=frozenset(['GET', 'POST'])))) # 設置 post()方法進行重訪問
resp_get = s.get(url=http_url, data={'key':'value'})
resp_post = s.post(url=http_url, data={'key':'value'})
這樣再使用requests.post()時幾乎不會出現超時中斷的情況了!
參考文獻
https://stackoverflow.com/questions/35704392/how-to-make-python-post-requests-to-retry
https://www.biaodianfu.com/python-requests-retry.html
總結
以上是生活随笔為你收集整理的python requests请求失败重试_Python Requests.post()请求失败时的retry设置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: portainer 启动mysql_Do
- 下一篇: python回归方程系数计算_线性回归中