Python请求需要很长时间

Python Requests taking a long time

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

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

1
2
3
4
5
6
7
import requests

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

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

print(r.text)

谢谢!


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

1
2
3
...
r.encoding = 'utf-8'
...

额外细节

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

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

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

验证这是您的问题

在上面的例子中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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()


来自@ martijn-pieters

Decoding and printing 15MB of data to your console is often slower than loading data from a network connection. Don't print all that data. Just write it straight to a file.