为什么套接字实现比请求慢?

眼泪

我有一个python 3.4脚本可以提取多个网页。最初,我使用请求库来获取页面:

def get_page_requsets(url):
    r = requests.get(url)
    return r.content

上面的代码给出了每秒4.6个请求的平均速度。为了提高速度,我重写了使用套接字库的函数:

def get_page_socket(url):

    url = urlparse(url)
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((url.netloc, 80))
    req = '''
GET {} HTTP/1.1\r
Host: {}\r
Connection: Keep-Alive\r
\r
    '''.format(url.path, url.host, uagent)
    sock.send(req.encode())
    reply = b''
    while True:
        chunk = sock.recv(65535)
        if chunk:
            reply += chunk
        else:
            break
    sock.close()
    return reply

平均速度降至每秒4.04个请求。我不希望速度急剧提高,但希望稍微增加一点,因为插座的位置更低。这是图书馆问题还是我做错了什么?

马丁·彼得斯(Martijn Pieters)

requests使用urllib3,可以非常有效地处理HTTP连接。尽可能重复使用与同一服务器的连接,从而节省了套接字连接和拆除成本:

  • 通过可选的客户端证书验证,将同一套接字连接重用于多个请求。请参阅:HTTPConnectionPoolHTTPSConnectionPool

另外,urllib3并向requests服务器通告它们可以处理压缩的响应;通过压缩,您可以在相同的时间内传输更多数据,从而导致每秒更多的请求。

  • 支持gzip和deflate解码。请参阅:decode_gzip()decode_deflate()

urllib3也使用套接字(尽管通过http.client模块);重新发明这个轮子毫无意义。也许您应该考虑使用线程或多处理或事件let并行获取URL。requests笔者有一个gevents,请求集成包,可以帮助那里。实现并发的另一种方法是asyncio结合使用,aiohttp因为HTTP请求主要在等待网络I / O。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么套接字BeginSend将花费太长时间

来自分类Dev

为什么套接字无限返回-1(errno:104)

来自分类Dev

从Java套接字读取比Python慢

来自分类Dev

通过TCP套接字发送手工制作的HTTP请求时,为什么会收到HTTP 400错误请求响应?

来自分类Dev

为什么从套接字流中读取永远会阻塞?

来自分类Dev

为什么套接字的行为如此?

来自分类Dev

Python套接字实现

来自分类Dev

为什么我无法通过此套接字发送文本?

来自分类Dev

c-套接字,为什么ip以整数格式发送?

来自分类Dev

为什么会收到“错误套接字挂断”响应?

来自分类Dev

与简单的Rcpp实现相比,为什么zoo :: rollmean慢?

来自分类Dev

为什么Android套接字定期读取如此缓慢?

来自分类Dev

为什么bash无法识别套接字文件的存在

来自分类Dev

为什么在运行方法中关闭套接字?

来自分类Dev

为什么与Web套接字聊天需要消息队列?

来自分类Dev

在Linux中在套接字上选择慢

来自分类Dev

为什么套接字会发出多次?

来自分类Dev

取消套接字接收请求的最佳方法是什么?

来自分类Dev

Python套接字选择模块,显示它仅接收请求时已接收到读取请求。为什么?

来自分类Dev

为什么将TCP / IP套接字视为“打开文件”?

来自分类Dev

为什么套接字的行为是这样的?

来自分类Dev

为什么要在客户端套接字之前打开服务器套接字?

来自分类Dev

为什么将此python UDP套接字重置为“无”?

来自分类Dev

为什么这个简单的字宏这么慢

来自分类Dev

套接字TCP:为什么我用scanf丢失消息

来自分类Dev

为什么gpg-agent创建几个套接字

来自分类Dev

为什么程序写入套接字为空?

来自分类Dev

为什么非阻塞套接字在 connect() 或 accept() 之前是可写的?

来自分类Dev

scapy 中的套接字实现

Related 相关文章

  1. 1

    为什么套接字BeginSend将花费太长时间

  2. 2

    为什么套接字无限返回-1(errno:104)

  3. 3

    从Java套接字读取比Python慢

  4. 4

    通过TCP套接字发送手工制作的HTTP请求时,为什么会收到HTTP 400错误请求响应?

  5. 5

    为什么从套接字流中读取永远会阻塞?

  6. 6

    为什么套接字的行为如此?

  7. 7

    Python套接字实现

  8. 8

    为什么我无法通过此套接字发送文本?

  9. 9

    c-套接字,为什么ip以整数格式发送?

  10. 10

    为什么会收到“错误套接字挂断”响应?

  11. 11

    与简单的Rcpp实现相比,为什么zoo :: rollmean慢?

  12. 12

    为什么Android套接字定期读取如此缓慢?

  13. 13

    为什么bash无法识别套接字文件的存在

  14. 14

    为什么在运行方法中关闭套接字?

  15. 15

    为什么与Web套接字聊天需要消息队列?

  16. 16

    在Linux中在套接字上选择慢

  17. 17

    为什么套接字会发出多次?

  18. 18

    取消套接字接收请求的最佳方法是什么?

  19. 19

    Python套接字选择模块,显示它仅接收请求时已接收到读取请求。为什么?

  20. 20

    为什么将TCP / IP套接字视为“打开文件”?

  21. 21

    为什么套接字的行为是这样的?

  22. 22

    为什么要在客户端套接字之前打开服务器套接字?

  23. 23

    为什么将此python UDP套接字重置为“无”?

  24. 24

    为什么这个简单的字宏这么慢

  25. 25

    套接字TCP:为什么我用scanf丢失消息

  26. 26

    为什么gpg-agent创建几个套接字

  27. 27

    为什么程序写入套接字为空?

  28. 28

    为什么非阻塞套接字在 connect() 或 accept() 之前是可写的?

  29. 29

    scapy 中的套接字实现

热门标签

归档