Python请求需要很长时间

时间:2017-08-07 17:28:45

标签: python-requests

基本上我正在开发一个python项目,我从sec edgar数据库下载和索引文件。但问题是,在使用请求模块时,将文本保存在变量中需要很长时间(对于一个文件,在大约130到170秒之间)。

该文件大约有大约1600万个字符,我想看看是否有任何方法可以轻松地减少检索文本所需的时间。 - 示例:

import requests

url ="https://www.sec.gov/Archives/edgar/data/0001652044/000165204417000008/goog10-kq42016.htm"

r = requests.get(url, stream=True)

print(r.text)

谢谢!

2 个答案:

答案 0 :(得分:3)

我发现的是r.text的代码,特别是没有给出编码时(r.encoding =='无')。检测编码的时间是20秒,我可以通过定义编码来跳过它。

...
r.encoding = 'utf-8' 
...

其他细节

在我的情况下,我的请求没有返回编码类型。响应的大小为256k,r.apparent_encoding的响应时间为20秒。

查看text属性函数。它会测试是否有encoding。如果有None,它将调用apperent_encoding函数,该函数将扫描文本以自动检测编码方案。

在长字符串上,这需要时间。通过定义响应的编码(如上所述),您将跳过检测。

验证这是您的问题

在上面的示例中:

from datetime import datetime    
import requests

url = "https://www.sec.gov/Archives/edgar/data/0001652044/000165204417000008/goog10-kq42016.htm"

r = requests.get(url, stream=True)

print(r.encoding)

print(datetime.now())
enc = r.apparent_encoding
print(enc)

print(datetime.now())
print(r.text)
print(datetime.now())

r.encoding = enc
print(r.text)
print(datetime.now())

当然输出可能会在打印中丢失,所以我建议你在一个交互式shell中运行上面的内容,即使没有打印datetime.now()

,它也会变得更加明显。

答案 1 :(得分:1)

来自@ martijn-pieters

  

将15MB数据解码并打印到控制台通常比从网络连接加载数据要慢。不要打印所有数据。只需将其直接写入文件即可。