当使用请求库请求Web资源或网站或Web服务时,请求需要很长时间才能完成。该代码类似于以下内容:
import requests
requests.get("https://www.example.com/")
此请求需要2分钟(恰好是2分钟10秒)才能完成!为什么这么慢,我该如何解决?
这个问题可以有多种可能的解决方案。关于StackOverflow的答案很多,因此,我将尝试将它们全部组合起来,以免您寻找它们的麻烦。
在搜索中,我发现了以下几层:
对于许多问题,激活日志记录可以帮助您发现问题所在(源代码):
import requests
import logging
import http.client
http.client.HTTPConnection.debuglevel = 1
# You must initialize logging, otherwise you'll not see debug output.
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True
requests.get("https://www.example.com")
如果调试输出不能帮助您解决问题,请继续阅读。
不请求所有数据,而是仅发送HEAD请求(source)会更快:
requests.head("https://www.example.com")
某些服务器不支持此功能,那么您可以尝试流式传输响应(source):
requests.get("https://www.example.com", stream=True)
如果您连续发送多个请求,则可以使用来加快请求的速度requests.Session
。这样可以确保与服务器的连接保持打开和配置状态,并且还保留cookie,这是一个不错的好处。试试这个:
import requests
session = requests.Session()
for _ in range(10):
session.get("https://www.example.com")
如果您一次发送大量请求,则每个请求都会阻止执行。您可以利用例如request-
futures
并行化它:
from concurrent.futures import as_completed
from requests_futures.sessions import FuturesSession
with FuturesSession() as session:
futures = [session.get("https://www.example.com") for _ in range(10)]
for future in as_completed(futures):
response = future.result()
注意不要同时让太多请求淹没服务器。
如果这也不能解决您的问题,请继续阅读…
在许多情况下,原因可能在于您所请求的服务器。首先,通过以相同的方式请求其他任何URL来验证这一点:
requests.get("https://www.google.com")
如果这样做正常,您可以将精力集中在以下可能的问题上:
服务器可能会专门阻止requests
,或者他们可能会使用白名单或其他原因。要发送更好的用户代理字符串,请尝试以下操作(source):
headers = {"User-Agent": "Mozilla/5.0 (X11; CrOS x86_64 12871.102.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.141 Safari/537.36"}
requests.get("https://www.example.com", headers=headers)
如果有时仅在某些情况下(例如,在几次请求后)出现此问题,则服务器可能会限制您的速率。检查响应,看是否沿这些方向读取某些内容(即“达到速率限制”,“超出工作队列深度”或类似内容;)。
在这里,解决方案是在请求之间等待更长的时间,例如使用time.sleep()
。
您可以通过不阅读从服务器收到的响应来进行检查。如果代码仍然很慢,这不是您的问题,但是如果此问题得以解决,则问题可能出在解析响应上。
要解决这些问题,请尝试:
r = requests.get("https://www.example.com")
r.raw.chunked = True # Fix issue 1
r.encoding = 'utf-8' # Fix issue 2
print(response.text)
这可能是所有所有人中最糟糕的问题。一种简单但奇怪的检查方法是添加一个timeout
参数,如下所示:
requests.get("https://www.example.com/", timeout=5)
如果返回 成功响应
,则问题应该出在IPv6上。原因是requests
首先尝试进行IPv6连接。如果超时,它将尝试通过IPv4连接。通过将超时设置为较低,可以强制其在较短的时间内切换到IPv4。
通过使用验证,例如,wget
或curl
:
wget --inet6-only https://www.example.com -O - > /dev/null
# or
curl --ipv6 -v https://www.example.com
在这两种情况下,我们都强制该工具通过IPv6连接以隔离问题。如果超时,请再次尝试强制使用IPv4:
wget --inet4-only https://www.example.com -O - > /dev/null
# or
curl --ipv4 -v https://www.example.com
问题内容: 我正在使用Hibernate 4.2,JPA 2.0和Postgres 9.2 代码卡在 在进一步调查中,我发现Hibernate调用了class 方法。此方法尝试加载有关每个数据库对象的元数据 的代码是Postgers的JDBC驱动程序的一部分,而确实是花费时间来执行该方法的驱动程序(我加载了驱动程序源并尝试了跟踪)。但是由于这个问题在Hibernate 3.3(我之前使用过)中没有
2013/04/22 12:35:56[错误]2709#0:*1从上游读取响应标头时上游超时(110:连接超时),客户端:xx.xx.xx.xx,服务器:,请求:“get/entity/datasenders/http/1.1”,上游:“uwsgi://127.0.0.1:9001”,主机:“xxx.xx.xx.x” 我已经设置了标题超时和uWSGI发送/读取超时5分钟,有人能告诉我我可以做什么来
此代码用于生成excel报告。有15列,如果记录数在1000左右,生成excel表需要近10-15分钟。上面的代码有什么问题吗?如何提高性能(Excel报告生成时间减少)?
问题内容: 升级到macOS Sierra之后,“ sbt测试”(包括查找本地主机名称/ IP地址)的性能似乎出现问题。在OS X的早期版本中,大约需要40-50秒才能完成。macOS Sierra时间远不止于此。我上次跑步大约是15分钟。编译时间与“ El Capitan”上的时间大致相同。 我是团队中唯一尝试使用此新macOS的人,因此我无法确定它是否仅在我的Mac上发生,还是普遍存在。 我的
我使用javamail通过IMAP协议从exchage帐户读取邮件。这些邮件是纯格式的,内容是XML。 几乎所有这些邮件的大小都很短(通常小于100Kb)。然而,有时我不得不处理大型邮件(大约10Mb-15Mb)。例如,昨天我收到一封13Mb大小的电子邮件。仅仅读它就花了50多分钟。这正常吗?有没有办法提高它的性能?代码是: 花费如此长时间的方法是。我做错了什么?有什么提示吗? 非常感谢,我的英语
问题内容: 我有一个以datetime为参数的查询,我们观察到的是,如果通过变量提供datetime参数,则执行查询的时间比直接对参数进行硬编码要多2 -3倍,是否有任何原因或解决方案?对此 以下查询大约需要5分钟才能返回结果 虽然作为 它会在10到20秒内返回 我并不总是希望在列上使用索引进行搜索。 按照kevchadders的建议,我看到执行计划有很大的不同。使用日期变量的查询正在执行聚集索引