2016-03-11 195 views
1

我正在嘗試使用請求(python 3.4)創建一個會話,在該會話中我登錄到gamefaqs.com並導航到董事會頁面,以便我可以抓取內容以獲取相關信息我正在努力完成。我直接從firefox中的開發人員控制檯複製標題和有效負載信息。使用請求登錄身份驗證

import requests 
import urllib3 

url = 'http://www.gamefaqs.com/user/login' 
url2 = 'http://www.gamefaqs.com/user/Leight_Weight/boards' 

header = { 
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
    'Accept-Encoding': 'gzip, deflate', 
    'Accept-Language': 'en-US,en;q=0.5', 
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0', 
    'Referer': 'http://www.gamefaqs.com/', 
    'Connection': 'keep-alive', 
    'Host': 'www.gamefaqs.com', 
    } 

payload = { 
    'path': "http://www.gamefaqs.com/", 
    'key': "71548de4", 
    'EMAILADDR': "username", 
    'PASSWORD': "password", 
    } 

with requests.Session() as s: 
    p = s.get(url, headers=header) 
    p = s.post(url, headers=header, data=payload, cookies = s.cookies) 

我遇到的問題是我沒有收到從網站傳遞給我的會話的驗證cookie。我正在使用fiddler來跟蹤來自Python的發佈請求。儘管請求頭信息與firefox中的請求頭信息相同,但響應頭信息卻非常不同。

從Firefox的響應報頭(由提琴手所見): Firefox Response Header

從Python中的響應報頭(由提琴手所見): Python Response Header

此時我在一個位的虧損。據我可以告訴我的代碼是健全的,並且請求標頭是正確的,但是沒有收到認證cookie證明有什麼錯誤。如果你查看響應頭,代碼是不同的(302 vs 200)。我不確定錯誤是什麼。

回答

0

事實證明 - 有效載荷項目'key'根據您的會話而變化。我最初沒有注意到這一點,因爲我沒有想到瀏覽器通過打開/關閉來使用持久性cookie,這個解決方案沒有使用這個事實。

我使用BeautifulSoup來找到正確的關鍵值有點笨手笨腳,但結果仍然一樣。一旦我擁有合適的關鍵值,我會在發佈post命令和中提琴登錄之前將其添加到有效載荷中。

爲了後代的緣故,代碼如下。

import requests 
from bs4 import BeautifulSoup as bs 

url = 'http://www.gamefaqs.com/user/login' 
url2 = 'http://www.gamefaqs.com/user/Leight_Weight/boards' 

header = { 
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
    'Accept-Encoding': 'gzip, deflate', 
    'Accept-Language': 'en-US,en;q=0.5', 
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0', 
    'Referer': 'http://www.gamefaqs.com/', 
    'Connection': 'keep-alive', 
    'Host': 'www.gamefaqs.com', 
    } 

payload = { 
    'PASSWORD': "password", 
    'path': "http://www.gamefaqs.com/", 
    'EMAILADDR': "username", 
    } 

with requests.Session() as s: 
    resp = s.get(url, headers=header) 
    parse = bs(resp.text) 
    keyval = parse.find_all('form')[1].contents[1]['value'] 
    payload['key'] = keyval 
    p = s.post(url, headers=header, data=payload)