Python请求需要很长时间

Jak*_*rch 7 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)
Run Code Online (Sandbox Code Playgroud)

谢谢!

小智 11

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

...
r.encoding = 'utf-8' 
...
Run Code Online (Sandbox Code Playgroud)

额外细节

就我而言,我的请求没有返回编码类型。响应大小为 256k,r.apparent_encoding耗时 20 秒。

查看文本属性函数。它测试以查看是否存在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())
Run Code Online (Sandbox Code Playgroud)

当然,输出可能会在打印中丢失,所以我建议你在交互式 shell 中运行上面的内容,它可能会变得更加明显,即使没有打印也会浪费时间 datetime.now()


Jak*_*rch 1

来自@martijn-pieters

解码 15MB 数据并将其打印到控制台通常比从网络连接加载数据慢。不要打印所有这些数据。直接写到文件里就可以了。