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.