Python请求:CSRF令牌丢失或不正确

时间:2017-06-27 11:54:52

标签: python

我有一个简单的HTML页面,我尝试使用requests.post()发布表单数据;但是,即使我传递了URL编码,我仍然会收到Bad Request 400. CSRF token missing or incorrect。 请帮忙。

url = "https://recruitment.advarisk.com/tests/scraping"

res = requests.get(url)

tree = etree.HTML(res.content)
csrf = tree.xpath('//input[@name="csrf_token"]/@value')[0]

postData = dict(csrf_token=csrf, ward=wardName)
print(postData)
postUrl = urllib.parse.quote(csrf)

formData = dict(csrf_token=postUrl, ward=wardName)
print(formData)
headers = {'referer': url, 'content-type': 'application/x-www-form-urlencoded', 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
page = requests.post(url, data=formData, headers=headers)
return page.content

1 个答案:

答案 0 :(得分:2)

您确保在一个会话中requests,以便匹配csrf_token

import sys
import requests

wardName = "DHANLAXMICOMPLEX"

url = 'https://recruitment.advarisk.com/tests/scraping'

#make the requests in one session
client = requests.session()
# Retrieve the CSRF token first
tree = etree.HTML(client.get(url).content)
csrf = tree.xpath('//input[@name="csrf_token"]/@value')[0]
#form data
formData = dict(csrf_token=csrf, ward=wardName)
headers = {'referer': url, 'content-type': 'application/x-www-form-urlencoded', 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
#use same session client
r = client.post(url, data=formData, headers=headers)
print r.content

它将为您提供带结果数据表的html。