我正在尝试抓一个发送POST填充表单的网页,一般我用selenium用python抓一页,但我最近读到发送POST请求是一种更好的方法来刮取结果。无论如何,我按照一些说明来制作我的代码,但是当我发布我的数据时,我得到填写表单的同一页面(POST不提交表单),我做错了什么?同样的页面还有另一个表单填写第一个,所以如果我填写第一个表单我真的不知道如何保持响应以获得最终的响应,所以如果有人可以帮助一些想法,我会回想一下欣赏它!谢谢,我包括我的代码和我正在寻找的页面刮取最终报价:
https://www.santander.cl/cotizador-web/
import requests, lxml.html
import time
s = requests.session()
login = s.get('https://www.santander.cl/cotizador-web/cotizador/pasosSolicitud.xhtml')
login_html = lxml.html.fromstring(login.text)
hidden_inputs = login_html.xpath(r'//form//input[@type="hidden"]')
form = {x.attrib["name"]: x.attrib["value"] for x in hidden_inputs}
form['pasosForm:marcas']='27'
form['pasosForm:modelos']='1978'
form['pasosForm:ano']='2015'
form['pasosForm:uso']='1'
form['pasosForm:j_id93373712_1a32e354_input']='on'
form['formDialogCotiSelec:j_id216370348_64c01a10_active'] = '1'
form['javax.faces.partial.execute']='pasosForm pasosForm:siguiente1'
response = s.post('https://www.santander.cl/cotizador-web/cotizador/pasosSolicitud.xhtml', data=form)
print(response.text)
答案 0 :(得分:0)
我看到所有表单都有像这样的隐藏字段
<input type="hidden" name="javax.faces.ViewState"
id="javax.faces.ViewState" value="zDmSF7aJ4QSdyqjY5D4dGbfEaQr5OiS6WorNARY6pfHWSXIe/APb5e
/wcHsiGvPVaXW4IFpVHFyFHNSSJMPdHt2mhaYm4TQ9WPo+TQgWFTB1ZRE1wwiJtXQfmKuwE2+R+iRmONBAmZCR9E8x" />
它是csrf令牌并从当前会话生成。在发帖请求之前,您应该访问表单页面(创建会话)。
更多信息:
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet