Python urllib3 и как обрабатывать поддержку файлов cookie?

Так что я смотрю в 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", пожалуйста.

5 ответов


вы правы,нет лучшего способа сделать это прямо сейчас. Я был бы более чем счастлив принять патч, если у вас есть конгруэнтное улучшение.

одна вещь, чтобы иметь в виду, HTTPConnectionPool urllib3 предназначен для "пула соединений" с определенным хостом, в отличие от клиента с состоянием. В этом контексте имеет смысл отслеживать файлы cookie за пределами фактического пула.

  • shazow (автор urllib3)

нет ли проблем с несколькими файлами cookie?

некоторые серверы возвращают несколько заголовков Set-Cookie, но urllib3 хранит заголовки в dict, а dict не разрешает несколько записей с одним и тем же ключом.

httplib2 имеет аналогичную проблему.

или, может быть, нет: оказывается, метод readheaders класса HTTPMessage в пакете httplib , который используют 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, но делает такие вещи, как добавление куки-файлов тривиальными.

https://github.com/kennethreitz/requests

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

необходимо указать 'Cookie' не 'Set-Cookie', 'Set-Cookie' установить веб-сервером.

и Cookies являются одним из заголовков, поэтому в этом нет ничего плохого.


вы можете использовать такой код:

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