无法使用请求模块登录网站(Python版本3.5.1)

时间:2016-06-14 15:56:14

标签: python-3.x python-requests csrf

我正在尝试访问某个网站以获取一些信息,但是我无法通过Python发布登录信息。到目前为止,这是我的代码:

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&#39;有关。标签?我还没有在网上找到任何针对这个特定CSRF名称的解决方案。我还尝试删除c.cookies方法并手动输入CSRF代码到csrfmiddlewaretoken参数中。我还尝试更改了referal网址,但仍然遇到同样的错误。

非常感谢任何协助。

1 个答案:

答案 0 :(得分:0)

首先,您抓住KeyError例外,这意味着cookies字典没有密钥csrftoken

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

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

UPD:实际上你的回复没有CSRF cookie。 您需要使用c.text

pyquery中查看令牌
<input type="hidden" name="OWASP_CSRFTOKEN" class="csrfClass" value="X48L-NEYI-CG18-SJOD-VDW9-FGEB-7WIT-88P4">
相关问题