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

时间:2010-03-11 06:03:11

标签: python urllib3

所以我正在调查urllib3,因为它有连接池并且是线程安全的(因此性能更好,特别是对于爬网),但文档是......最小的说法。 urllib2有build_opener,所以像:

#!/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”标记这个。

6 个答案:

答案 0 :(得分:10)

你是对的,现在没有更好的方法可以做到这一点。如果你有一致的改进,我会非常乐意接受补丁。

要记住一件事,urllib3的HTTPConnectionPool旨在成为特定主机的“连接池”,而不是有状态客户端。在这种情况下,将cookie跟踪保留在实际池之外是有意义的。

  • shazow(urllib3的作者)

答案 1 :(得分:3)

多个Cookie没有问题吗?

某些服务器返回多个Set-Cookie标头,但urllib3将标头存储在dict中,而dict不允许多个条目具有相同的密钥。

httplib2也有类似的问题。

或许不是:事实证明,httplib包中的HTTPMessage类的readheaders方法 - urllib3和httplib2都使用 - 具有以下注释:

  

如果出现多个具有相同名称的标题字段,则根据RFC 2616 sec 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.

因此没有标题丢失。

如果标头值中有逗号,则会出现问题。我还没有弄清楚这里发生了什么,但是从略读RFC 2616(“超文本传输​​协议 - HTTP / 1.1”)和RFC 2965(“HTTP状态管理机制”)我得到的印象是标题中的任何逗号值应该被引用。

答案 2 :(得分:1)

您需要设置'Cookie'而不是'Set-Cookie''Set-Cookie'由网络服务器设置。

而Cookies是标题之一,所以这样做并没有错。

答案 3 :(得分:1)

您应该使用请求库。它使用urllib3但是像添加cookie一样简单。

https://github.com/kennethreitz/requests

import requests
r1 = requests.get(url, cookies={'somename':'somevalue'})
print(r1.content)

答案 4 :(得分:0)

这有点悲哀。我有一种情况,我访问了一个网站,它设置了一个 cookie,然后重定向到实际端点。向初始请求添加“Cookie:”标头不会将该 Cookie: 标头传播到重定向的请求,因为它不是实际的 cookie,即浏览器保留并在每次请求时发送到特定域的内容。

答案 5 :(得分:-1)

您可以使用以下代码:

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_name和cookie_value