python: urllib2 як надіслати файл cookie із запитом urlopen


83

Я намагаюся використовувати urllib2 для відкриття URL-адреси та надсилання певного тексту cookie на сервер. Наприклад, я хочу відкрити сайт. Вирішуйте шахові завдання за допомогою певного файлу cookie, наприклад, пошук = 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/")

Інші способи додавання заголовків HTTP до вашого запиту див. У прикладах urllib2 .

Існує більше способів поводження з файлами cookie. Деякі модулі, такі як cookielib, намагаються поводитися як веб-браузер - пам’ятайте, які файли cookie ви отримували раніше, і автоматично надсилайте їх знову за наступними запитами.


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

Що робити, якщо вони використовують інші параметри для urlopen?
Ендрю

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 оброблятимуться автоматично. Подібно до вашого браузера :)

Я можу говорити лише з власного досвіду, і мій варіант використання файлів cookie на 99% полягає в тому, щоб отримати файл cookie, а потім потрібно надіслати його з усіма наступними запитами в цій сесії. Наведений вище код обробляє саме це, і робить це прозоро.


6
@PiotrDobrogost ти маєш рацію, я не надсилаю конкретний файл cookie з цим кодом :) Я припускаю, що отримаю його при ПУСТИНГУ, і з цього моменту CookieJarекземпляр буде обробляти його для мене у всіх відповідних доменах.
Morten Jensen

2
В ОП чітко зазначено (...) надсилати конкретний текст cookie (...), тому це не відповідь.
Piotr Dobrogost

13

Можливо, ви захочете поглянути на чудову бібліотеку HTTP Python під назвою Requests . Це робить кожне завдання за участю HTTP дещо простішим, ніж urllib2. З розділу файлів cookie в посібнику з швидкого запуску:

Щоб надіслати власні файли cookie на сервер, ви можете використовувати параметр cookies:

>>> 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.