【问题标题】:Python: Sending POST request doesn't workPython:发送 POST 请求不起作用
【发布时间】:2017-06-01 22:23:53
【问题描述】:

我正在尝试抓取发送 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)

【问题讨论】:

    标签: python selenium post web-scraping python-requests


    【解决方案1】:

    我看到所有表单都有这样的隐藏字段

        <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

    【讨论】:

    • 谢谢!我更正了那部分,我的程序填写了表单(值被标记为“在 HTML 代码中选择”),但仍然没有得到表单的下一页,就像程序没有提交表单......你有什么想法吗?谢谢!
    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多