【问题标题】:How to Speed Up Python's urllib2 when doing multiple requests执行多个请求时如何加速 Python urllib2
【发布时间】:2010-01-05 21:32:14
【问题描述】:

我正在使用 python 的 urllib2 库向特定主机发出多个 http 请求。每次发出请求时,都会创建一个新的 tcp 和 http 连接,这需要相当长的时间。有没有办法使用 urllib2 保持 tcp/http 连接处于活动状态?

【问题讨论】:

    标签: python http urllib2


    【解决方案1】:

    如果您切换到httplib,您将可以更好地控制底层连接。

    例如:

    import httplib
    
    conn = httplib.HTTPConnection(url)
    
    conn.request('GET', '/foo')
    r1 = conn.getresponse()
    r1.read()
    
    conn.request('GET', '/bar')
    r2 = conn.getresponse()
    r2.read()
    
    conn.close()
    

    这将在同一个底层 TCP 连接上发送 2 个 HTTP GET。

    【讨论】:

    • 这是一个很好的答案,因为 httplib 是 python 的一部分。这使我们不必安装第三方模块。谢谢!
    • 也许对有用的人有用,还有HTTPSConnection。
    【解决方案2】:

    我过去使用过第三方urllib3 库,效果很好。它旨在通过汇集连接以供重用,以补充 urllib2

    来自the wiki的修改示例:

    >>> from urllib3 import HTTPConnectionPool
    >>> # Create a connection pool for a specific host
    ... http_pool = HTTPConnectionPool('www.google.com')
    >>> # simple GET request, for example
    ... r = http_pool.urlopen('GET', '/')
    >>> print r.status, len(r.data)
    200 28050
    >>> r = http_pool.urlopen('GET', '/search?q=hello+world')
    >>> print r.status, len(r.data)
    200 79124
    

    【讨论】:

      【解决方案3】:

      如果您需要比普通 httplib 更自动化的东西,这可能会有所帮助,尽管它不是线程安全的。

      try:
          from http.client import HTTPConnection, HTTPSConnection
      except ImportError:
          from httplib import HTTPConnection, HTTPSConnection
      import select
      connections = {}
      
      
      def request(method, url, body=None, headers={}, **kwargs):
          scheme, _, host, path = url.split('/', 3)
          h = connections.get((scheme, host))
          if h and select.select([h.sock], [], [], 0)[0]:
              h.close()
              h = None
          if not h:
              Connection = HTTPConnection if scheme == 'http:' else HTTPSConnection
              h = connections[(scheme, host)] = Connection(host, **kwargs)
          h.request(method, '/' + path, body, headers)
          return h.getresponse()
      
      
      def urlopen(url, data=None, *args, **kwargs):
          resp = request('POST' if data else 'GET', url, data, *args, **kwargs)
          assert resp.status < 400, (resp.status, resp.reason, resp.read())
          return resp
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-14
        • 1970-01-01
        • 2019-02-07
        • 2015-03-14
        • 2019-02-01
        • 2021-12-24
        相关资源
        最近更新 更多