在我的脚本中,requests.get从不返回:
import requests
print ("requesting..")
# This call never returns!
r = requests.get(
"http://www.some-site.com",
proxies = {'http': '222.255.169.74:8080'},
)
print(r.ok)可能的原因是什么?有什么补救措施吗?get使用的默认超时是多少?
发布于 2013-07-22 15:59:50
get使用的默认超时是多少?
默认超时是None,这意味着它将等待(挂起),直到连接关闭。
只需指定一个超时值,如下所示:
r = requests.get(
'http://www.justdial.com',
proxies={'http': '222.255.169.74:8080'},
timeout=5
)发布于 2014-03-13 19:40:18
来自requests documentation
通过timeout parameter:
requests.get('http://github.com',timeout=0.001) Traceback (最近一次调用):File "",第1行,in requests.exceptions.Timeout: HTTPConnectionPool( =‘github.com’,port=80):Request timed out,你可以告诉请求在给定的秒数后停止等待响应。(timeout=0.001)
注意:
超时不是整个响应下载的时间限制;相反,如果服务器没有发出超时秒数的响应(更准确地说,如果在基础套接字上没有接收到timeout seconds).的字节),则会引发异常
我经常遇到这样的情况:即使timeout是1秒,requests.get()也需要很长时间才能返回。有几种方法可以解决这个问题:
1.使用 TimeoutSauce 内部类
来自:https://github.com/kennethreitz/requests/issues/1928#issuecomment-35811896
从requests.adapters导入TimeoutSauce MyTimeout请求(TimeoutSauce):def __init__(
,*args,**kwargs):如果kwargs‘’connect‘为None: kwargs’‘connect’=5如果kwargs‘’read‘为None: kwargs’‘read’=5 super(MyTimeout,self).__init__(*args,**kwargs) requests.adapters.TimeoutSauce =MyTimeout
此代码应使我们将读取超时设置为等于连接超时,这是您在Session.get()调用中传递的超时值。(请注意,我还没有实际测试过这段代码,因此它可能需要一些快速调试,我只是直接将其写入GitHub窗口。)
2.使用来自kevinburke的请求分叉: https://github.com/kevinburke/requests/tree/connect-timeout
来自它的文档:https://github.com/kevinburke/requests/blob/connect-timeout/docs/user/advanced.rst
如果为超时值指定了单个值,则如下所示:
R= requests.get('https://github.com',timeout=5)
超时值将同时应用于连接超时和读取超时。如果要单独设置值,请指定一个元组:
R= requests.get('https://github.com',timeout=(3.05,27))
注:The change has since been merged to the main Requests project。
3.使用类似问题中已经提到的evenlet signal 或: Timeout for python requests.get entire response
发布于 2019-04-25 12:31:20
我想要在一堆代码中轻松添加一个默认超时(假设超时解决了您的问题)
这是我从提交给存储库的请求工单中获得的解决方案。
图片来源:https://github.com/kennethreitz/requests/issues/2011#issuecomment-477784399
解决方案是这里的最后几行,但为了更好的上下文,我展示了更多的代码。我喜欢使用会话来实现重试行为。
import requests
import functools
from requests.adapters import HTTPAdapter,Retry
def requests_retry_session(
retries=10,
backoff_factor=2,
status_forcelist=(500, 502, 503, 504),
session=None,
) -> requests.Session:
session = session or requests.Session()
retry = Retry(
total=retries,
read=retries,
connect=retries,
backoff_factor=backoff_factor,
status_forcelist=status_forcelist,
)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
# set default timeout
for method in ('get', 'options', 'head', 'post', 'put', 'patch', 'delete'):
setattr(session, method, functools.partial(getattr(session, method), timeout=30))
return session然后你可以这样做:
requests_session = requests_retry_session()
r = requests_session.get(url=url,...https://stackoverflow.com/questions/17782142
复制相似问题