无法在网页上使用python的请求库登录

无法在网页上使用python的请求库登录

问题描述:

我想通过脚本在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)''然后'打印一个'。输出是'' –

其实要拆分的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