我正在尝试访问某个网站以获取一些信息,但是我无法通过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网址,但仍然遇到同样的错误。
非常感谢任何协助。
答案 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">