2015-06-30 47 views
0

我想通過腳本在edx網站上登錄。爲此,我使用python的請求庫。這裏是代碼無法在網頁上使用python的請求庫登錄

from requests import session 

ID = '[email protected]' 
PASSWORD = '*********' 


with session() as c: 
    g = c.get('https://courses.edx.org/login/', allow_redirects=True) 
    csrftoken = (g.headers['set-cookie']).split()[0][10:-1] 
    login_data = dict(email=ID, password=PASSWORD, csrfmiddlewaretoken=csrftoken, next='/') 
    a = c.post('https://courses.edx.org/login/', data=login_data, headers={'Referer':'https://courses.edx.org/login/'}) 
    response = c.get('https://courses.edx.org/dashboard') 
    print response.url 

但是,這段代碼不起作用。輸出是

https://courses.edx.org/accounts/login?next=/dashboard

當我運行a.content。它顯示

CSRF驗證失敗。請求異常終止

請任何人幫助我。

+0

您能打印來自第一次發佈會話的響應,以檢查登錄是否成功。例如。 'check = c.post('https://courses.edx.org/login/',data = payload)''print check.test' – user3636636

+1

您的鏈接需要登錄。請檢查該網站的API。他們是否首先需要一些特定的標題?也許他們需要你先獲得一個csrf標記,然後用它來發布你的登錄表單? –

+0

@ user3636636登錄不成功。因爲當我試着'a = c.post('https://courses.edx.org/login/',data = payload)''然後'打印一個'。輸出是'<響應[403]>' –

回答

2

其實要拆分的CSRF令牌走錯了路

csrftoken = (g.headers['set-cookie']).split()[0][10:-1] 

將獲得CSRF令牌 'essionid = csrfstring'。你必須刪除'sessionid'部分。因此,改爲

csrftoken = (g.headers['set-cookie']).split(';')[0].split('=')[1] 

使用python shell來驗證您是否以正確的方式獲取csrf標記。

如果您想從edx中提取格式化的數據,那麼可以使用edx api註冊您的應用程序。然後,您可以使用OAuth 2機制訪問API。這包括創建code並將該代碼交換爲access token。它像Gmail和Facebook提供的OAuth2認證。有關如何創建令牌的更多信息是here。 A demo也可用

+0

但我不想使用API​​。我想做網絡報廢。 –

+0

@rohinichaudhary如果你想抓取需要驗證的頁面,那麼你將不得不使用他們的API進行驗證,無論它是否爲OAuth。 –

+0

@rohinichaudhary我編輯了上面的答案。看看它是否能解決你的問題。你也可以嘗試像python scrapy這樣的web scrapers。 – cutteeth