基本上我正在开发一个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)
谢谢!
答案 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数据解码并打印到控制台通常比从网络连接加载数据要慢。不要打印所有数据。只需将其直接写入文件即可。