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", пожалуйста.
Решение
Вы правы, лучшего способа сделать это прямо сейчас нет.Я был бы более чем счастлив принять патч, если у вас есть соответствующее улучшение.
Следует иметь в виду одну вещь: HTTPConnectionPool urllib3 предназначен для того, чтобы быть "пулом подключений" к определенному хосту, в отличие от клиента с отслеживанием состояния.В этом контексте имеет смысл сохранить отслеживание файлов cookie за пределами фактического пула.
- shazow (автор urllib3)
Другие советы
Нет ли проблемы с несколькими файлами cookie?
Некоторые серверы возвращают несколько заголовков Set-Cookie, но urllib3 хранит заголовки в dict, а dict не допускает несколько записей с одним и тем же ключом.
у httplib2 аналогичная проблема.
А может быть, и нет:оказывается , что метод readheaders класса HTTPMessage в пакете httplib , который используют как urllib3 , так и httplib2 , имеет следующий комментарий:
Если встречается несколько полей заголовка с одинаковым именем, они объединяются в соответствии с правилами, приведенными в RFC 2616, раздел 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") У меня складывается впечатление, что любые запятые в значении заголовка должны быть заключены в кавычки.
Вам нужно установить 'Cookie'
не 'Set-Cookie'
, 'Set-Cookie'
устанавливается веб-сервером.
А файлы cookie - это один из заголовков, так что в этом нет ничего плохого.
Вам следует использовать библиотеку запросов.Он использует urllib3, но делает такие вещи, как добавление файлов cookie, тривиальными.
https://github.com/kennethreitz/requests
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
Вам следует заменить cookie_name и cookie_value