python: urllib2 как отправить cookie с запросом urlopen


83

Я пытаюсь использовать urllib2, чтобы открыть URL-адрес и отправить конкретный текст cookie на сервер. Например, я хочу открыть сайт Решить шахматные задачи с помощью определенного файла cookie, например search = 1. Как это сделать?

Я пытаюсь сделать следующее:

import urllib2
(need to add cookie to the request somehow)
urllib2.urlopen("http://chess-problems.prg")

заранее спасибо

Ответы:


112

Cookie - это просто еще один HTTP-заголовок.

import urllib2
opener = urllib2.build_opener()
opener.addheaders.append(('Cookie', 'cookiename=cookievalue'))
f = opener.open("http://example.com/")

См. Примеры urllib2, чтобы узнать о других способах добавления заголовков HTTP к вашему запросу.

Есть другие способы обработки файлов cookie. Некоторые модули, такие как cookielib, пытаются вести себя как веб-браузер - запоминают, какие файлы cookie вы получали ранее, и автоматически отправляют их снова в следующих запросах.


9
Если у вас несколько файлов cookie, вам необходимо объединить их в одно значение заголовка, разделенное точкой с запятой. Например, если у вас есть словарь значений файлов cookie cookievals, используйте opener.addheaders.append(('Cookie', "; ".join('%s=%s' % (k,v) for k,v in cookievals.items()))).
Грег Глокнер,

Что, если они используют другие параметры для открытия URL?
Эндрю

56

Возможно, вам поможет cookielib.CookieJar . Например, при публикации на странице, содержащей форму:

import urllib2
import urllib
from cookielib import CookieJar

cj = CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
# input-type values from the html form
formdata = { "username" : username, "password": password, "form-id" : "1234" }
data_encoded = urllib.urlencode(formdata)
response = opener.open("https://page.com/login.php", data_encoded)
content = response.read()

РЕДАКТИРОВАТЬ:

После комментария Петра я немного уточню. Из документов:

Класс CookieJar хранит файлы cookie HTTP. Он извлекает файлы cookie из HTTP-запросов и возвращает их в HTTP-ответах. Экземпляры CookieJar автоматически удаляют содержащиеся файлы cookie при необходимости. Подклассы также отвечают за хранение и получение файлов cookie из файла или базы данных.

Таким образом, какие бы запросы вы ни делали со своим CookieJarэкземпляром, все файлы cookie будут обрабатываться автоматически. Как ваш браузер :)

Я могу говорить только по собственному опыту, и мой 99% вариант использования файлов cookie - это получение файла cookie, а затем необходимость его отправки со всеми последующими запросами в этом сеансе. Приведенный выше код обрабатывает именно это, и делает это прозрачно.


6
@PiotrDobrogost, вы правы, я не отправляю конкретный файл cookie с этим кодом :) Я предполагаю, что получу его при POSTing, и с этого момента CookieJarэкземпляр будет обрабатывать его для меня на всех соответствующих доменах.
Мортен Йенсен,

2
OP четко указывает (…) отправлять определенный текст cookie (…), так что это не ответ.
Петр Доброгост

13

Возможно, вы захотите взглянуть на отличную библиотеку HTTP Python под названием Requests . Это делает каждую задачу, связанную с HTTP, немного проще, чем urllib2. Из раздела « Файлы cookie » краткого руководства:

Чтобы отправить свои собственные файлы cookie на сервер, вы можете использовать параметр cookie:

>>> cookies = dict(cookies_are='working')

>>> r = requests.get('http://httpbin.org/cookies', cookies=cookies)
>>> r.text
'{"cookies": {"cookies_are": "working"}}'

1
Он основан на urllib3, он поддерживает объединение соединений, таких как urllib3, и сохраняет файлы cookie, заголовки - см Requests Session. Это прекрасно!
Serge S.

5

Используйте Cookielib . На связанной странице документации в конце приведены примеры. Вы также найдете учебник здесь .


В учебнике они сохраняют cookie после его получения с сервера, не так ли?
Олег Тарасенко

Они оба сохраняют файлы cookie, полученные с сервера, и возвращают их обратно на сервер, поскольку обычно так работают файлы cookie. Если вы хотите сделать что-то необычное, вам придется копнуть немного глубже в библиотеку. Я почти уверен, что он поддержит все, что вы хотите.
Марсело Кантос,

1

Этот ответ не работает, так как urllib2модуль был разделен на несколько модулей в Python 3. Вам необходимо сделать

from urllib import request
opener = request.build_opener()
opener.addheaders.append(('Cookie', 'cookiename=cookievalue'))
f = opener.open("http://example.com/")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.