为什么urllib.request这么慢?

时间:2019-02-12 13:01:02

标签: python-3.x urllib

当我使用urllib.request.decode从JSON格式获取python字典时,它花费的时间太长。但是,在查看数据时,我意识到我什至不想要所有这些。

  1. 有什么办法只能获取一些数据,例如从JSON字典的键之一而不是所有键中获取数据吗?
  2. 或者,是否有更快的方法来获取可以正常工作的数据?
  3. 还是仅仅是连接问题而无法解决?
  4. urllib.request.urlopen还是问题,json.loads还是.read().decode()也是如此。

该问题的主要症状可能是大约5秒钟,当您试图接收的信息甚至不多(少于1页非格式化字典)时。另一个症状是,当我尝试接收越来越多的信息时,有一点很重要,就是我根本没有收到网页的任何回复!

占用最多时间的2行是:

response = urllib.request.urlopen(url) # url is a string with the url
data = json.loads(response.read().decode())

对于其中的部分内容,我使用的是Edamam Recipe API。

我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

  

有什么办法只能获取一些数据,例如从JSON字典的键之一而不是所有键中获取数据吗?

您可以尝试使用流式json解析器,但我认为您不会从中获得任何提速。

  

或者,是否有更快的方法来获取可以正常工作的数据?

如果您必须从url中检索json文档并解析json内容,我无法想象有什么比发送http请求,读取响应内容和解析要快的多。

  

还是仅仅是连接问题而无法解决?

考虑到您提到的数据,这个问题确实在网络部分中,这意味着在python进程和服务器进程之间存在任何问题。请注意,这包括您的整个系统(代理/防火墙,网卡,操作系统tcp / ip堆栈等,可能还包括窗口上的某些防病毒软件),网络本身,以及最终服务器(速度可能很慢或有点过载)有时或故意限制您的请求,以避免过载。

  

urllib.request.urlopen还是问题,还是json.loads或.read()。decode()问题。

如果不在您自己的计算机上计时,我们怎么知道呢?但是可以轻松地将其检出,只需计时各个零件的执行时间并记录下来即可。

  

另一个症状是,当我尝试接收越来越多的信息时,有一点我根本根本没有收到网页的回复!

上面的

cf-如果您要连续发送数百个请求,则服务器可能会限制您的请求以避免过载(大多数API端点将以这种方式运行)或只是被过载。您是否至少检查了http响应状态代码?您可能会收到503(服务器超载)或429(请求过多)响应。