Python Requests花费很长时间

15 浏览
0 Comments

Python Requests花费很长时间

基本上,我正在处理一个Python项目,其中我从SEC Edgar数据库下载和索引文件。但问题在于,使用 requests 模块时,将文本保存在变量中需要很长时间(一个文件在大约 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)

谢谢!

admin 更改状态以发布 2023年5月23日
0
0 Comments

来自@martijn-pieters

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

0
0 Comments

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

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

额外的细节

我的情况是,我的请求没有返回编码类型。响应大小为 256k,r.apparent_encoding 花费了 20 秒。

查看 text 属性函数。它会检查是否有编码。如果是 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(),您也可能更清楚地知道您正在失去时间的地方。

0