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

StackOverflow https://stackoverflow.com/questions/2422922

  •  19-09-2019
  •  | 
  •  

Вопрос

Итак, я изучаю 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top