Python urllib3 и как обращаться с поддержкой cookie? - PullRequest
8 голосов
/ 11 марта 2010

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

10 голосов
/ 11 марта 2010

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

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

  • Shazow (автор urllib3)
3 голосов
/ 18 мая 2010

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

Некоторые серверы возвращают несколько заголовков Set-Cookie, но urllib3 хранит заголовки в файле 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») у меня складывается впечатление, что в заголовке есть запятые значение должно быть в кавычках.

1 голос
/ 19 марта 2012

Вы должны использовать библиотеку запросов. Он использует urllib3, но делает такие вещи, как добавление файлов cookie, тривиальными.

https://github.com/kennethreitz/requests

import requests
r1 = requests.get(url, cookies={'somename':'somevalue'})
print(r1.content)
1 голос
/ 11 марта 2010

Вам нужно установить 'Cookie', а не 'Set-Cookie', 'Set-Cookie' установить веб-сервером.

И Cookies - один из заголовков, так что в этом нет ничего плохого.

0 голосов
/ 08 декабря 2013

Вы можете использовать код, подобный этому:

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

...