【问题标题】:Python Requests POST to website with verification tokenPython 使用验证令牌请求 POST 到网站
【发布时间】:2015-02-13 08:42:42
【问题描述】:

我正在使用 Python 3.3 和 Requests 库来执行基本的 POST 请求。

我想模拟如果您从网页手动将信息输入浏览器会发生什么: https://www.dspayments.com/FAIRFAX。例如,在该网址中,输入“x”作为车牌,输入弗吉尼亚州作为州。然后 url 变为:https://www.dspayments.com/FAIRFAX/Home/PayOption,并显示所需的信息(我关心第二个网页的源代码)。

我查看了上面两个url的源代码。在第一个 url 的文本框中执行“检查元素”,我发现一些需要包含在发布请求中的内容:{'Plate':"x", 'PlateStateProv':"VA", "submit":"Search "}。

然后是第二个网站(以 /PayOption 结尾),有原始 html:

<form action="/FAIRFAX/Home/PayOption" method="post"><input name="__RequestVerificationToken" type="hidden" value="6OBKbiFcSa6tCqU8k75uf00m_byjxANUbacPXgK2evexESNDz_1cwkUpVVePA2czBLYgKvdEK-Oqk4WuyREi9advmDAEkcC2JvfG2VaVBWkvF3O48k74RXqx7IzwWqSB5PzIJ83P7C5EpTE1CwuWM9MGR2mTVMWyFfpzLnDfFpM1" /><div class="validation-summary-valid" data-valmsg-summary="true">

然后,我使用上述 html 中的名称:值对作为发布请求的有效负载字典中的键和值。我认为问题在于,在第二个 url 中,有一个“__RequestVerificationToken”,它似乎每次都有一个随机生成的值。

我怎样才能正确地发布到这个网站? “正确”的答案是在网站上生成以“/PayOption”结尾的相同源代码,就像您手动输入“x”作为车牌号和弗吉尼亚州作为州,然后单击第一个网址上的提交。

我的代码是:

import requests

url1 = r'https://www.dspayments.com/FAIRFAX'
url2 = r'https://www.dspayments.com/FAIRFAX/Home/PayOption'

s = requests.Session()

#GET request  
r = s.get(url1)
text1 = r.text
startstr = '<input name="__RequestVerificationToken" type="hidden" value="'
start_ind = text1.find(startstr)+len(startstr)
end_ind = text1.find('"',start_ind)
auth_string = text1[start_ind:end_ind]


#POST request
payload = {'Plate':'x', 'PlateStateProv':'VA',"submit":"Search",
           "__RequestVerificationToken":auth_string,"validation-summary-valid":"true"}

post = s.post(url2, headers=user_agent, data=payload)
source_code = post.text

谢谢,-K。

【问题讨论】:

    标签: python post token python-requests verification


    【解决方案1】:

    您应该只需要第一页中的数据,正如您所说,__RequestVerificationToken 会随着每个请求而变化。

    您必须执行以下操作:

    • GET 请求到https://www.dspayments.com/FAIRFAX

    • 收获 __RequestVerificationToken 值(请求会话将处理任何关联的 cookie)

    • 使用从 GET 请求中抓取的数据进行 POST

    • 从第二页中提取您需要的任何内容

    因此,只需专注于创建一个与第一页中的表单完全相同的表单。试一试,如果你还在苦苦挣扎,我可以帮助你深入了解细节。

    【讨论】:

    • 感谢您的建议,这似乎是个好主意。我编辑了我的帖子,以便按照您的建议更新代码。我仍然没有得到我期望的源代码,并且在我返回的 POST 请求源代码中看到“由于不活动,您的会话已超时”。还有什么我应该做的吗?
    • 您会想要忽略 url 更改的内容 - 重要的 url 是第一页中的表单发布到 (dspayments.com/FAIRFAX) 的那个。将其更改为 post = s.post(url1, data=payload) 对我有用(我没有费心提供 user_agent)。
    • 这种抓取的技巧是从网络浏览器的角度来想象它。在每个步骤中,您都只有发回给您的 html / cookie。页面中有哪些表格,您可以提交什么?您需要模拟那些假装是真实用户的操作。
    • Aidan,谢谢你的建议,很成功,所以我接受你的回答。我在stackoverflow.com/questions/27514316/… 提出了一个非常相似的问题,并且现在很想知道如何在有多个连续页面 btwn 的情况下执行此操作。第一页和最后一页?本质上,我尝试收集第一页和中间页中的所有名称/值对,然后执行 POST 请求。
    猜你喜欢
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2016-04-04
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    相关资源
    最近更新 更多