Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python urllib3以及如何处理cookie支持?_Python_Urllib3 - Fatal编程技术网

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

Python urllib3以及如何处理cookie支持?,python,urllib3,Python,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.c

所以我研究它是因为它有连接池并且是线程安全的(所以性能更好,特别是对于爬网),但是文档是。。。至少可以这么说。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”来标记它。

您需要设置
'Cookie'
而不是
'set-Cookie'
'set-Cookie'
由web服务器设置


Cookie是其中一个标题,所以这样做没有错。

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

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

  • shazow(urllib3的作者)

多个cookie没有问题吗

一些服务器返回多个Set Cookie头,但urllib3将这些头存储在dict中,并且dict不允许使用同一密钥的多个条目

httplib2也有类似的问题

或者可能不是:事实证明,httplib包中HTTPMessage类的readheaders方法(urllib3和httplib2都使用)有以下注释:

如果出现具有相同名称的多个标题字段,则根据RFC 2616第4.2节中的规则组合这些字段:

因此不会丢失任何标题


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

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


您可以使用如下代码:

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\u名称和cookie\u值

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

@bigredbob,按您的要求进行标记。我看过urllib3的源代码,它似乎没有urllib2的任何调整和变化,包括
Opener
对象,所以我怀疑是否有魔杖适合你。希望它随着时间的推移而成熟,因为它现在还很不成熟是的,这是一个拼写错误,但我的问题仍然存在,我希望有一个更好的方法(即使用内置)。如果我知道如何修补这个问题,我很乐意,但我不是那么好。很高兴知道我至少没有做错。RFC6265说,设置Cookie必须是特殊情况才能处理这个问题。httplib在python 2中没有这样做。。。看到了吗?这是不是要给我的浏览器添加cookie?如果是这样的话,有哪些原因使它不起作用?我在运行apache服务器、Windows 10、Python 2.75的本地网站上进行了测试。我将使用请求库,它允许您将cookie正确地放在请求中并传播它们。
import requests
r1 = requests.get(url, cookies={'somename':'somevalue'})
print(r1.content)
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