web-dev-qa-db-ja.com

python:urllib2 urlopenリクエストでcookieを送信する方法

Urllib2を使用してurlを開き、特定のcookieテキストをサーバーに送信しようとしています。例えば。サイトを開きたい チェスの問題を解決する search = 1。どうすればいいのですか?

私は次のことをしようとしています:

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

前もって感謝します

81
Oleg Tarasenko

Cookieは単なるHTTPヘッダーです。

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

HTTPヘッダーをリクエストに追加する他の方法については、 rllib2の例 を参照してください。

Cookieを処理する方法は他にもあります。 cookielib などの一部のモジュールは、Webブラウザーのように振る舞います-以前に取得したCookieを覚えて、次のリクエストで自動的に再送信します。

110
Messa

多分 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()

編集:

Piotrのコメントの後、少し詳しく説明します。ドキュメントから:

CookieJarクラスには、HTTP Cookieが格納されます。 HTTPリクエストからCookieを抽出し、HTTPレスポンスでそれらを返します。 CookieJarインスタンスは、必要に応じて含まれるCookieを自動的に期限切れにします。サブクラスは、ファイルまたはデータベースからのCookieの保存と取得も行います。

したがって、CookieJarインスタンスでどのようなリクエストを行っても、すべてのCookieは自動的に処理されます。お使いのブラウザのようにちょっと:)

私は自分の経験からしか話せませんが、Cookieの99%の使用例はCookieを受信し、そのセッションの後続のすべてのリクエストでCookieを送信する必要があることです。上記のコードはそれを処理し、透過的に処理します。

57
Morten Jensen

Requests と呼ばれる優れたHTTP Pythonライブラリーをご覧ください。 HTTPに関連するすべてのタスクがurllib2より少し簡単になります。 Cookies クイックスタートガイドのセクションから:

独自のCookieをサーバーに送信するには、cookiesパラメーターを使用できます。

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

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

cookielib を使用します。リンクされたドキュメントページの最後に例を示します。チュートリアル here もあります。

5
Marcelo Cantos

urllib2モジュールはPython 3のいくつかのモジュールに分割されているため、この回答は機能しません。

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