ログインページ(GET)を開き、Webサーバーから提供されたCookieを取得してから、ユーザー名とパスワードのペアを送信してサイトにログインしようとしています(POST)。
このStackoverflowの質問/回答 を見ると、私は次のことを行うだけだと思います:
import requests
import cookielib
URL1 = 'login Prompt page'
URL2 = 'login submission URL'
jar = cookielib.CookieJar()
r = requests.get(URL1, cookies=jar)
r2 = requests.post(URL2, cookies=jar, data="username and password data payload")
ただし、r
ではヘッダーにset-cookie
がありますが、jar
オブジェクトでは変更されません。実際、リンクされた質問の応答が示すように、jar
には何も入力されていません。
私はコードでヘッダーdictを使用してこれを回避し、GETまたはPOSTを実行した後、これを使用してset-cookie
ヘッダーを処理します。
headers['Cookie'] = r.headers['set-cookie']
次に、リクエストメソッドのヘッダーを渡します。これは正しいですか、それともset-cookie
を適用するより良い方法はありますか?
Cookie-jarを無視して、requests
にcookieを処理させます。代わりに セッションオブジェクト を使用してください。Cookieが永続化され、サーバーに送信されます。
with requests.Session() as s:
r = s.get(URL1)
r = s.post(URL2, data="username and password data payload")
この種のことを自動的に処理する session
というインクルードクラスがあります。そのインスタンスを作成し、代わりにそのインスタンスでget
とset
を呼び出すことができます。
import requests
URL1 = 'login Prompt page'
URL2 = 'login submission URL'
session = requests.Session()
r = session.get(URL1)
r2 = session.post(URL2, data="username and password data payload")
( セッションオブジェクト を使用せずに)私のために働いた別の方法は次のとおりです(v2.18.4
でテストされています)。
jar = requests.cookies.RequestsCookieJar()
response1 = requests.get(some_url, cookies=jar) # or post ...
jar.update(response1.cookies)
response2 = requests.get(some_other_url, cookies=jar) # or post ...
上記のコードは Requests ライブラリによって透過的に処理されるリダイレクトがあると失敗します。このような場合、リダイレクト応答で送信されたCookieを使用してjarを更新する必要もあります。例えば。次のようなことをすることによって:
if (response.history): # we have to add to the cookie jar, the cookies sent by the server in intermediate responses
for historicResponse in response.history:
jar.update(historicResponse.cookies)