繁体   English   中英

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

[英]Python urllib3 and how to handle cookie support?

所以我正在研究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”标记它。

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

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

  • shazow(urllib3 的作者)

多个cookies没有问题吗?

一些服务器返回多个 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 状态管理机制”)我得到的印象是标头中的任何逗号值应该被引用。

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

https://github.com/kennethreitz/requests

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

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

并且 Cookie 是标头之一,因此这样做并没有错。

这有点可悲。 我有一种情况,我访问了一个网站,它设置了一个 cookie,然后重定向到实际端点。 向初始请求添加“Cookie:”标头不会将该 Cookie: 标头传播到重定向的请求,因为它不是实际的 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_name 和 cookie_value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM