Python 使用验证 token 向网站请求 GET 和 POST

标签 python post get token python-requests

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

我想模拟一下如果您从网页手动输入信息到浏览器中会发生什么:https://capp.arlingtonva.us/tap/AC_xwTapPay.aspx 。例如,尝试输入“2. Parking Tickets”,单击“下一步”,输入 1234 作为车牌号,输入弗吉尼亚州作为州,然后单击“下一步”,然后选中复选框并单击“下一步”。

虽然url是一样的,但是却有多次输入信息、点击下一步的迭代。

目前,我正在对 url 进行 GET 操作,以获取随机生成的字符串,例如源代码中“__EVENTVALIDATION”和“__VIEWSTATE”的值。然后我用该信息以及其他一些信息进行 POST。

我是否在代码中使用了正确的帖子有效负载,如下所示?

我的代码是:

import requests
url = r'https://capp.arlingtonva.us/tap/AC_xwTapPay.aspx'

#GET request
s = requests.Session()
r = s.get(url)
text1 = r.text

#getting "__EVENTVALIDATION" value:
eventvalstartstring = r'id="__EVENTVALIDATION" value="'
eventvalstart = text1.find(eventvalstartstring)+len(eventvalstartstring)
end_ind = text1.find('"',eventvalstart)
eventvalidation_string = text1[eventvalstart:end_ind]

#getting "__VIEWSTATE" value:
viewstate_start_string= 'id="__VIEWSTATE" value="'
viewstate_start = text1.find(viewstate_start_string)+len(viewstate_start_string)
end_ind2 = text1.find('"',viewstate_start)
viewstate_string = text1[viewstate_start:end_ind2]

#POST request
payload = {"AC_xwTapCtl:AC_xwTapCtlCtl.xuWrqCtl:BillType":"PKT",
           "__EVENTTARGET":"",
           "__EVENTARGUMENT":"",
           "__LASTFOCUS":"",
           "__VIEWSTATE":viewstate_string,
           "__VIEWSTATEGENERATOR":"C0C9F6BC",
           "__VIEWSTATEENCRYPTED":"",
           "__EVENTVALIDATION":eventvalidation_string,
           "AC_xwTapCtl:AC_xwTapCtlCtl.xuWrqCtl:TagState":'VA',
           "AC_xwTapCtl:AC_xwTapCtlCtl.xuWrqCtl:TagNumber":'1234',
           "AC_xwTapCtl:AC_xwTapCtlCtl.xuWrqCtl:Next1":"Next >",
           "AC_xwTapCtl:scrollTop":'0',
           "AC_xwTapCtl:AC_xwTapCtlCtl.xuWrqCtl:Next2":"Next >",
           "AC_xwTapCtl:xwTap_txtFocus":"AC_xwTapCtl_AC_xwTapCtlCtl.xuWrqCtl_Next1",
           "AC_xwTapCtl_scrollTop":'0',
           "AC_xwTapCtl:AC_xwTapCtlCtl.xuWrqCtl:Next3":"Next >",
           "AC_xwTapCtl:xwTap_txtFocus":"AC_xwTapCtl_AC_xwTapCtlCtl.xuWrqCtl_Next2",
           "AC_xwTapCtl_scrollTop":"0"}

post = s.post(url, data=payload)
text = post.text

谢谢,-K。

最佳答案

在这个阶段,我可能会改用 beautifulsoup (pip install BeautifulSoup4) 来解析 html,以便更轻松地获取所有数据。因为它是 .NET(我认为),所以整个页面有一个表单,因此我们可以获取所有输入。

import requests
from bs4 import BeautifulSoup

s = requests.Session()

r = s.get('https://capp.arlingtonva.us/tap/AC_xwTapPay.aspx')
soup = BeautifulSoup(r.text)

# grab out all the fields
payload = {i['name']:i.get('value') for i in soup.findAll('input')}
# populate the select field
payload['AC_xwTapCtl:AC_xwTapCtlCtl.xuWrqCtl:BillType'] = 'PKT'

# and submit the next step
r = s.post('https://capp.arlingtonva.us/tap/AC_xwTapPay.aspx', data=payload)    

# then parse / build next request etc
soup = BeautifulSoup(r.text)
payload = {i['name']:i.get('value') for i in soup.findAll('input')}
payload['AC_xwTapCtl:AC_xwTapCtlCtl.xuWrqCtl:TagState'] = 'VA'
payload['AC_xwTapCtl:AC_xwTapCtlCtl.xuWrqCtl:TagNumber'] = 'blah'
r = s.post('https://capp.arlingtonva.us/tap/AC_xwTapPay.aspx', data=payload)    

# rinse and repeat as many times as required...
soup = BeautifulSoup(r.text)

关于Python 使用验证 token 向网站请求 GET 和 POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27514316/

相关文章:

python - 如何正确检查相机是否可用?

ruby-on-rails - Net::HTTP.post_form 抛出 EOFError?

firefox - 如何使用 POST 变量在 Firefox 附加组件中打开新选项卡?

http - GET方式发送的数据真的是有限的吗?

json - 在 SugarCRM 中使用 JSON 正文获取请求

python - 克隆临时文件夹中的git存储库时出现权限错误

python - 使用正则表达式和字典将列添加到数据框

python - python函数调用GRASS GIS模块和另一个同类python函数时发生错误

asp.net-mvc - 在 MVC 中使用 Ajax 和 jQuery 通过 Post 调用传递 HTML

php - 无法对来 self 的服务器 (php) 的某些 url 使用 file_get_contents()