在我的脚本中,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
使用的默认超时是多少?
发布于 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,...
发布于 2017-11-04 14:53:00
查看了所有的答案,得出了问题仍然存在的结论。在某些网站上,请求可能会无限挂起,而使用多进程似乎有点过分了。这是我的方法(Python 3.5+):
import asyncio
import aiohttp
async def get_http(url):
async with aiohttp.ClientSession(conn_timeout=1, read_timeout=3) as client:
try:
async with client.get(url) as response:
content = await response.text()
return content, response.status
except Exception:
pass
loop = asyncio.get_event_loop()
task = loop.create_task(get_http('http://example.com'))
loop.run_until_complete(task)
result = task.result()
if result is not None:
content, status = task.result()
if status == 200:
print(content)
更新
如果您收到有关使用conn_timeout和read_timeout的弃用警告,请查看THIS参考资料底部附近的内容,了解如何使用ClientTimeout数据结构。根据链接的引用将此数据结构应用于上述原始代码的一种简单方法是:
async def get_http(url):
timeout = aiohttp.ClientTimeout(total=60)
async with aiohttp.ClientSession(timeout=timeout) as client:
try:
etc.
发布于 2020-04-22 23:20:02
修补文档中的“发送”函数将修复所有请求-即使在许多依赖库和sdk中也是如此。修补lib时,请确保修补支持/文档中的函数,而不是TimeoutSauce -否则您可能会默默地失去补丁的效果。
import requests
DEFAULT_TIMEOUT = 180
old_send = requests.Session.send
def new_send(*args, **kwargs):
if kwargs.get("timeout", None) is None:
kwargs["timeout"] = DEFAULT_TIMEOUT
return old_send(*args, **kwargs)
requests.Session.send = new_send
没有任何超时的影响是相当严重的,使用默认超时几乎不会破坏任何东西-因为TCP本身也有默认超时。
https://stackoverflow.com/questions/17782142
复制相似问题