簡體   English   中英

Python請求 - 管理cookie

[英]Python Requests - managing cookies

我正在嘗試使用請求(和bs4)從站點自動獲取一些內容

我有一個獲取cookie的腳本:

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

轉儲餅干看起來像:

<<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/>]>

但是當我將cookie對象傳遞給下一個URL時:

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

它沒有運作 - 我可以通過傾倒湯來看到我沒有正確地給網絡服務器我的憑據

我嘗試運行請求會話:

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

我得到的同樣沒有快樂。

當我訪問第二頁時,我通過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+

出於顯而易見的原因,我已經從問題中修改了用戶名,密碼和URLS。

我錯過了一些明顯的東西嗎 是否有一種不同/正確的方法來捕獲cookie - 我正在使用的當前方法不起作用。

編輯:

這是會話代碼的自立版本:

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中看到它告訴我我沒有訪問權限 - 這個字符串只有在你沒有登錄時才會通過瀏覽器顯示。

我遇到了類似的問題,並在這個問題上找到了幫助。 會話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

您應該重用整個會話對象,而不是關聯的cookiejar。 對所有請求使用self.s

如果在重新使用會話時您的請求仍然失敗,則會因為其他原因而失敗,這不是因為您沒有正確返回Cookie。

請注意,如果您需要使用auth=('username', 'password')則身份驗證是基於HTTPAuth的,而不是基於cookie的。 您需要為所有呼叫傳遞相同的身份驗證。 請求會話也可以為您執行此操作:

s = requests.session(auth=('username', 'password'))

但是,如果登錄頁面是帶有用戶名和密碼字段的表單,則需要調用表單目標。 檢查表單是POST還是GET,並檢查字段名:

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

而根本不使用HTTP身份驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM