web-dev-qa-db-ja.com

Pythonリクエスト-Cookieの管理

リクエスト(およびbs4)を使用してサイトからコンテンツを自動的に取得しようとしています

Cookieを取得するスクリプトがあります。

def getCookies(self):
    username = 'username'
    password = 'password'
    URL = 'logonURL'
    r = requests.get(URL, auth=('username', 'password'))
    cookies = r.cookies

cookieのダンプは次のようになります。

<<class 'requests.cookies.RequestsCookieJar'>[<Cookie ASP.NET_SessionId=yqokjr55ezarqbijyrwnov45 for URL.com/>, <Cookie BIGipServerPE_Journals.lww.com_80=1440336906.20480.0000 for URL.com/>, <Cookie JournalsLockCookie=id=a5720750-3f20-4207-a500-93ae4389213c&ip=IP address for URL.com/>]>

しかし、次のURLにCookieオブジェクトを渡すと、

 soup = Soup(s.get(URL, cookies = cookies).content)

うまくいかない-スープをダンプすることで、Webサーバーに資格情報を適切に与えていないことがわかります

リクエストセッションを実行してみました。

def getCookies(self):
    self.s = requests.session()
    username = 'username'
    password = 'password'
    URL = 'logURL'
    r = self.s.get(URL, auth=('username', 'password'))

と私は同じ喜びを得ません。

2番目のページにアクセスすると、FFのliveHttpを介してヘッダーを確認したところ、非常に異なるフォームが表示されました。

Cookie: WT_FPC=id=264b0aa85e0247eb4f11355304127862:lv=1355317068013:ss=1355314918680; UserInfo=Username=username; BIGipServerPE_Journals.lww.com_80=1423559690.20480.0000; PlatformAuthCookie=true; Institution=ReferrerUrl=http://logonURL.com/?wa=wsignin1.0&wtrealm=urn:adis&wctx=http://URL.com/_layouts/Authenticate.aspx?Source=%252fpecnews%252ftoc%252f2012%252f06440&token=method|ExpireAbsolute; counterSessionGuidId=6e2bd57f-b6da-4dd4-bcb0-742428e08b5e; MyListsRefresh=12/13/2012 12:59:04 AM; ASP.NET_SessionId=40a04p45zppozc45wbadah45; JournalsLockCookie=id=85d1f38f-dcbb-476a-bc2e-92f7ac1ae493&ip=10.204.217.84; FedAuth=77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48U2VjdXJpdHlDb250ZXh0VG9rZW4gcDE6SWQ9Il9mMGU5N2M3Zi1jNzQ5LTQ4ZjktYTUxNS1mODNlYjJiNGNlYzUtNEU1MDQzOEY0RTk5QURCNDFBQTA0Mjc0RDE5QzREMEEiIHhtbG5zOnAxPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIiB4bWxucz0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3Mtc3gvd3Mtc2VjdXJlY29udmVyc2F0aW9uLzIwMDUxMiI+PElkZW50aWZpZXI+dXJuOnV1aWQ6ZjJmNGY5MGItMmE4Yy00OTdlLTkwNzktY2EwYjM3MTBkN2I1PC9JZGVudGlmaWVyPjxJbnN0YW5jZT51cm46dXVpZDo2NzMxN2U5Ny1lMWQ3LTQ2YzUtOTg2OC05ZGJhYjA3NDkzOWY8L0luc3RhbmNlPjwvU2VjdXJpdHlDb250ZXh0VG9rZW4+

明らかな理由により、質問のユーザー名、パスワード、URLを編集しました。

明らかなものがないのですか?クッキーをキャプチャする別の/適切な方法はありますか-私が使用している現在の方法は機能していません。

編集:

これは、セッション化されたコードの自立バージョンです。

s = requests.session()
username = 'username'
password = 'password'
URL = 'logonURL.aspx'
r = s.get(URL, auth=('username', 'password'))
URL = r"URL.aspx"
soup = Soup(s.get(URL).content)

スープのダンプを読んでいると、htmlでアクセス権がないことがわかります。この文字列は、ログインしていないときにブラウザを介してのみ表示されます。

14
Jay Gattuso

同様の問題があり、この質問に助けを見つけました。セッションjarは空で、実際にセッションを使用するために必要なcookieを取得するために必要でした。

session = requests.session()
p = session.post("http://example.com", {'user':user,'password':password})
print 'headers', p.headers
print 'cookies', requests.utils.dict_from_cookiejar(session.cookies)
print 'html',  p.text
23
arhuaco

関連するcookiejarではなく、sessionオブジェクト全体を再利用する必要があります。行うすべてのリクエストに_self.s_を使用します。

セッションを再利用してもリクエストが失敗する場合は、Cookieを適切に返していないのではなく、別の理由でリクエストが失敗しています。

auth=('username', 'password')を使用する必要がある場合、認証はCookieベースではなくHTTPAuthベースであることに注意してください。すべての呼び出しに同じ認証を渡す必要があります。リクエストセッションでも同じことができます。

_s = requests.session(auth=('username', 'password'))
_

ただし、ログインページがユーザー名とパスワードのフィールドを持つフォームである場合は、代わりにフォームターゲットを呼び出す必要があります。フォームがPOSTまたはGETであるかどうかを確認し、フィールド名を確認します。

_s.post(loginTarget, {usernamefield=username, passwordfield=password, otherfield=othervalue})
_

hTTP認証をまったく使用しません。

7
Martijn Pieters