14

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

4

5 回答 5

13

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

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

  • shazow(urllib3 的作者)
于 2010-03-11T07:07:21.617 回答
4

多个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 状态管理机制”)我得到的印象是标题中的任何逗号value 应该被引用。

于 2010-05-18T02:04:48.733 回答
1

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

Cookies 是标头之一,因此这样做没有错。

于 2010-03-11T06:07:54.950 回答
1

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

https://github.com/kennethreitz/requests

import requests
r1 = requests.get(url, cookies={'somename':'somevalue'})
print(r1.content)
于 2012-03-18T22:00:48.393 回答
-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

于 2013-12-08T18:07:13.413 回答