2016-06-14 152 views
0

我试图访问一个网站以获取一些信息,但是我无法通过Python发布登录信息。这是我到目前为止的代码:使用请求模块无法登录到网站(Python版本3.5.1)

import requests 

c = requests.Session() 
url = 'https://subscriber.hoovers.com/H/login/login.html' 
USERNAME = 'user' 
PASSWORD = 'pass' 

c.get(url) 
csrftoken = c.cookies['csrftoken'] 
login_data = dict(j_username=USERNAME, j_password=PASSWORD,   
csrfmiddlewaretoken=csrftoken, next='/') 
c.post(url, data=login_data, headers=dict(Referer=url)) 
page = c.get('http://subscriber.hoovers.com/H/home/index.html') 
print(page.content) 

下面是从后登录页面的表单数据:

为j_username:用户 为j_password:通过 OWASP_CSRFTOKEN:8N0Z-TND5-NV71-C4N4-43BK -B13S-A1MO-NZQC OWASP_CSRFTOKEN:8N0Z-TND5-NV71-C4N4-43BK-B13S-A1MO-NZQC

这是我收到错误:

Traceback (most recent call last): 
    File "C:/Users/10023539/Desktop/pyscripts/webscraper ex.py", line 9, in <module> 
    csrftoken = c.cookies['csrftoken'] 
    File "C:\Program Files (x86)\Python35-32\Lib\site-packages\requests\cookies.py", line 293, in __getitem__ 
    return self._find_no_duplicates(name) 
    File "C:\Program Files (x86)\Python35-32\Lib\site-packages\requests\cookies.py", line 351, in _find_no_duplicates 
    raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) 
KeyError: "name='csrftoken', domain=None, path=None" 

我相信这个问题与'OWASP_CSRFTOKEN'标签有关吗?我还没有找到任何在线任何地方的这个特定CSRF名称的解决方案。我也尝试删除c.cookies方法,并手动将CSRF代码输入到csrfmiddlewaretoken参数中。我也试着改变了referal的URL,仍然得到相同的错误。

任何援助将不胜感激。

+0

你在哪里看到的表单数据?特别是'csrfmiddlewaretoken'? –

+0

我在登录后从页面获取表单数据。我使用'csrfmiddlewaretoken',因为我在文档中看到了这个例子。我应该使用不同的东西吗?另外,如果您需要更多头部或其他信息,请告诉我,我很乐意发布。 – raidboss

+0

是的,在实际表单数据中的名称,打开开发人员工具,你会看到你也张贴到不正确的网址,它是'https:// subscriber.hoovers.com/H/j_spring_security_check' ans'OWASP_CSRFTOKEN'是名称为csrf标记 –

回答

-1

首先你抓KeyError例外,这意味着cookies字典中没有键csrftoken

因此,您需要探索您的响应以找到正确的CSRF令牌cookie名称。 例如,您可以打印所有Cookie:

for key in c.cookies.keys(): 
    print('%s: %s' % (key, c.cookies[key])) 

UPD:其实你的回应没有CSRF的cookie。 你需要看令牌位于c.textpyquery

<input type="hidden" name="OWASP_CSRFTOKEN" class="csrfClass" value="X48L-NEYI-CG18-SJOD-VDW9-FGEB-7WIT-88P4"> 
+0

感谢您的信息。你可以请更具体一点吗?我在回应中究竟在寻找什么?另外,还有其他方法可以查看我的回复吗?在将此代码放入时,我仍然收到错误。 – raidboss

+0

html是动态生成的,因此您不会在源代码中获取该代码 –