无法在网页上使用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
但是,这段代码不起作用。输出是
当我运行a.content
。它显示
CSRF验证失败。请求异常终止
请任何人帮助我。
其实要拆分的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也可用
但我不想使用API。我想做网络报废。 –
@rohinichaudhary如果你想抓取需要验证的页面,那么你将不得不使用他们的API进行验证,无论它是否为OAuth。 –
@rohinichaudhary我编辑了上面的答案。看看它是否能解决你的问题。你也可以尝试像python scrapy这样的web scrapers。 – cutteeth
您能打印来自第一次发布会话的响应,以检查登录是否成功。例如。 'check = c.post('https://courses.edx.org/login/',data = payload)''print check.test' – user3636636
您的链接需要登录。请检查该网站的API。他们是否首先需要一些特定的标题?也许他们需要你先获得一个csrf标记,然后用它来发布你的登录表单? –
@ user3636636登录不成功。因为当我试着'a = c.post('https://courses.edx.org/login/',data = payload)''然后'打印一个'。输出是'' –