代码之家  ›  专栏  ›  技术社区  ›  bigredbob

python urllib3以及如何处理cookie支持?

  •  8
  • bigredbob  · 技术社区  · 16 年前

    所以我在调查 urllib3 因为它有连接池并且是线程安全的(所以性能更好,特别是对于爬行),但是文档是…至少可以这么说。Urllib2构建了一个开放器,类似于:

    #!/usr/bin/python
    import cookielib, urllib2
    cj = cookielib.CookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
    r = opener.open("http://example.com/")
    

    但是urllib3没有build-opener方法,所以到目前为止我唯一能想到的方法是手动将其放在头中:

    #!/usr/bin/python
    import urllib3
    http_pool = urllib3.connection_from_url("http://example.com")
    myheaders = {'Cookie':'some cookie data'}
    r = http_pool.get_url("http://example.org/", headers=myheaders)
    

    但我希望有更好的方法,你们中的一个可以告诉我这是什么。也可以有人用“urllib3”来标记这个。

    5 回复  |  直到 12 年前
        1
  •  10
  •   shazow    16 年前

    你说得对,现在没有更好的方法。如果你有一个一致的改进,我会非常乐意接受一个补丁。

    需要记住的一点是,URLLIB3的httpConnectionPool旨在成为特定主机的“连接池”,而不是有状态的客户机。在这种情况下,跟踪实际池之外的cookie是有意义的。

    • Shazow(Urllib3的作者)
        2
  •  2
  •   Rod Montgomery    16 年前

    多个cookie是否没有问题?

    有些服务器返回多个set cookie头,但urllib3将头存储在dict中,而dict不允许使用同一密钥的多个条目。

    httplib2也有类似的问题。

    或者可能不是:事实证明,httplib包中httpmessage类的readheaders方法(同时使用urlib3和httplib2)具有以下注释:

    如果出现多个具有相同名称的头字段,它们将根据RFC 2616第4.2节中的规则进行组合:

        Appending each subsequent field-value to the first, each separated
        by a comma. The order in which header fields with the same field-name
        are received is significant to the interpretation of the combined
        field value.
    

    所以不会丢失任何标题。

    但是,如果头值中有逗号,则会出现问题。我还没有弄清楚这里发生了什么,但是通过浏览RFC2616(“超文本传输协议——HTTP/1.1”)和RFC2965(“HTTP状态管理机制”),我得到了这样一个印象:一个头值中的任何逗号都应该被引用。

        3
  •  1
  •   YOU    16 年前

    你需要设置 'Cookie' 不 'Set-Cookie' , '设置cookie' 由Web服务器设置。

    曲奇是标题之一,所以这样做没什么错。

        4
  •  1
  •   rd108    14 年前

    您应该使用请求库。它使用了urllib3,但使添加cookies之类的事情变得微不足道。

    https://github.com/kennethreitz/requests

    import requests
    r1 = requests.get(url, cookies={'somename':'somevalue'})
    print(r1.content)
    
        5
  •  -1
  •   Adrian B    12 年前

    您可以使用这样的代码:

    def getHtml(url):
        http = urllib3.PoolManager()
        r = http.request('GET', url, headers={'User-agent':'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36','Cookie':'cookie_name=cookie_value'})
        return r.data #HTML
    

    您应该替换cookie名称和cookie值