python: urllib2, как отправить cookie с запросом urlopen - PullRequest
81 голосов
/ 26 июля 2010

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

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

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

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

Ответы [ 5 ]

110 голосов
/ 26 июля 2010

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

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

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

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

57 голосов
/ 21 ноября 2011

Может быть, с помощью 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.Он извлекает куки из HTTP-запросов и возвращает их в HTTP-ответах.При необходимости экземпляры CookieJar автоматически удаляют содержащиеся в нем cookie.Подклассы также отвечают за хранение и извлечение файлов cookie из файла или базы данных.

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

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

13 голосов
/ 02 июня 2012

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

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

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

>>> r = requests.get('http://httpbin.org/cookies', cookies=cookies)
>>> r.text
'{"cookies": {"cookies_are": "working"}}'
5 голосов
/ 26 июля 2010

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

1 голос
/ 22 марта 2019

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

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