python:urllib2urlopenリクエストでCookieを送信する方法


82

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

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

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

前もって感謝します

回答:


111

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

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

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

Cookieを処理する方法は他にもあります。cookielibのようないくつかのモジュールは、Webブラウザのように動作しようとします-以前に取得したCookieを記憶し、次のリクエストで自動的に再送信します。


9
複数のCookieがある場合は、セミコロンで区切って1つのヘッダー値に結合する必要があります。たとえば、と呼ばれるCookie値の辞書がある場合はcookievals、を使用しますopener.addheaders.append(('Cookie', "; ".join('%s=%s' % (k,v) for k,v in cookievals.items())))
Greg Glockner 2015

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

編集:

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

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

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

私は自分の経験からしか話すことができず、Cookieの99%のユースケースは、Cookieを受信し、そのセッションの後続のすべての要求とと​​もに送信する必要があることです。上記のコードはまさにそれを処理し、透過的に処理します。


6
@PiotrDobrogostあなたは正しいです、私はこのコードで特定のクッキーを送信しません:)私はPOST時にそれを受け取ると仮定していCookieJarます、そしてインスタンスはそれ以降すべての関連するドメインでそれを処理します。
モーテンジェンセン

2
OPは、特定のCookieテキストを送信するように(…)明確に述べているため(…)、これは答えではありません。
Piotr Dobrogost 2017

13

Requestsと呼ばれる優れたHTTPPythonライブラリを確認することをお勧めします。これにより、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を保存していますね。
オレグタラセンコ2010

通常、これがCookieの動作方法であるため、サーバーから取得したCookieを保存し、サーバーに戻します。いつもと違うことをしたい場合は、ライブラリをもう少し深く掘り下げる必要があります。私はそれがあなたがやりたいことは何でもサポートすると確信しています。
マルセロカントス2010

1

urllib2モジュールがPython3で複数のモジュールに分割されているため、この回答は機能しません。

from urllib import request
opener = request.build_opener()
opener.addheaders.append(('Cookie', 'cookiename=cookievalue'))
f = opener.open("http://example.com/")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.