2024-09-25 00:35:34 发布
网友
我有一个python3.4脚本来获取多个web页面。起初,我使用请求库获取页面:
def get_page_requsets(url): r = requests.get(url) return r.content
上面的代码给出了每秒4.6个请求的平均速度。 为了提高速度,我重写了函数以使用套接字库:
平均速度下降到每秒4.04个请求。我不希望提高速度,但希望略有提高,因为插座是较低水平。 是图书馆的问题还是我做错了什么?在
requests使用^{},它非常有效地处理HTTP连接。尽可能重复使用同一服务器的连接,从而节省套接字连接和拆卸成本:
requests
Re-use the same socket connection for multiple requests, with optional client-side certificate verification. See: HTTPConnectionPool and HTTPSConnectionPool
HTTPConnectionPool
HTTPSConnectionPool
此外,urllib3和requests向服务器通告它们可以处理压缩的响应;通过压缩,您可以在相同的时间内传输更多的数据,从而导致每秒更多的请求。在
urllib3
Supports gzip and deflate decoding. See: decode_gzip() and decode_deflate()
decode_gzip()
decode_deflate()
urllib3也使用套接字(尽管是通过^{} module);重新设计这个轮子没有什么意义。也许您应该考虑使用线程或多处理或eventlets并行获取url;requests作者有一个{a3}可以帮助您。在
慢可能是因为你做了错误的HTTP:发出HTTP/1.1请求,甚至显式地指定connectionkeep-alive(甚至不需要,因为这在HTTP/1.1中是隐式的)。但是,您只需从套接字读取,并期望服务器在请求完成后关闭连接。但是服务器不会这样做,它会等待更多的请求,因为它会保持活动状态,并且只有在一段时间的非活动状态之后才会关闭连接,这取决于服务器的配置。你很幸运地连接到一个超时时间很短的服务器,在那里你每秒钟仍能收到4.04个请求,而在其他服务器上,你的代码每分钟只有几个请求。在
如果您想用普通套接字发出一个简单的HTTP请求,请使用HTTP/1.0,而不要使用keep-alive。然后你可以一直读到服务器关闭,你也不必处理HTTP/1.1中引入的分块传输编码。您也不必处理压缩编码,因为您不明确接受它们(但一些损坏的服务器无论如何都会发送它们)。在
但是,虽然这将使您的代码比现在更快,但它不会像请求那样快,因为所有这些保持活动、压缩等都是为了提高速度而添加的。要正确地重新实现所有这些并不容易,所以我建议您继续使用请求库。在
requests
使用^{此外,
urllib3
和requests
向服务器通告它们可以处理压缩的响应;通过压缩,您可以在相同的时间内传输更多的数据,从而导致每秒更多的请求。在urllib3
也使用套接字(尽管是通过^{requests
作者有一个{a3}可以帮助您。在慢可能是因为你做了错误的HTTP:发出HTTP/1.1请求,甚至显式地指定connectionkeep-alive(甚至不需要,因为这在HTTP/1.1中是隐式的)。但是,您只需从套接字读取,并期望服务器在请求完成后关闭连接。但是服务器不会这样做,它会等待更多的请求,因为它会保持活动状态,并且只有在一段时间的非活动状态之后才会关闭连接,这取决于服务器的配置。你很幸运地连接到一个超时时间很短的服务器,在那里你每秒钟仍能收到4.04个请求,而在其他服务器上,你的代码每分钟只有几个请求。在
如果您想用普通套接字发出一个简单的HTTP请求,请使用HTTP/1.0,而不要使用keep-alive。然后你可以一直读到服务器关闭,你也不必处理HTTP/1.1中引入的分块传输编码。您也不必处理压缩编码,因为您不明确接受它们(但一些损坏的服务器无论如何都会发送它们)。在
但是,虽然这将使您的代码比现在更快,但它不会像请求那样快,因为所有这些保持活动、压缩等都是为了提高速度而添加的。要正确地重新实现所有这些并不容易,所以我建议您继续使用请求库。在
相关问题 更多 >
编程相关推荐