所以我试图制作一个检查公交车预订可用性的脚本.起始链接是
https://reservation.pc.gc.ca/.
在保留框中,需要选择以下内容:
>预订:日间使用(带导游的徒步旅行,奥哈拉湖巴士)
>公园:Yoho-Lake O’Hara
>抵达日期:6月16日
>派对规模:2
输入这些选项后,将转到以下页面:https://reservation.pc.gc.ca/Yoho-LakeO’Hara?Calendar
我的理解是,如果我使用正确的数据向第二个链接发送POST请求,它应该返回我正在寻找的页面
如果我在选择正确的参数时查看开发工具网络信息,表单数据是:
__EVENTTARGET:
__EVENTARGUMENT:
__VIEWSTATE: -reallllly long string-__VIEWSTATEGENERATOR: 8D0E13E6
ctl00$MainContentPlaceHolder$rdbListReservationType: Events
ddlLocations: 213a1bc9-9218-4e98-9a7f-0f209008e437**
ddlArrivalMonth: 2017-06-16
ddlArrivalDay: 19
ddlNights: 1
ddlDepartureMonth:
ddlDepartureDay:
ddlEquipment:
ddlEquipmentSub:
ddlPartySize:2
ctl00$MainContentPlaceHolder$chkExcludeAccessible: on
ctl00$MainContentPlaceHolder$imageButtonCalendar.x: 64
ctl00$MainContentPlaceHolder$imageButtonCalendar.y: 56
所以我写的代码是:
import requests
payload = {
'__EVENTTARGET': '',
'__EVENTARGUMENT': '',
'__VIEWSTATE':-reallly long string-,
'__VIEWSTATEGENERATOR': '8D0E13E6',
'ctl00$MainContentPlaceHolder$rdbListReservationType': 'Events',
'ddlLocations': '213a1bc9-9218-4e98-9a7f-0f209008e437',
'ddlArrivalMonth': 2017-06-16,
'ddlArrivalDay': 19,
'ddlNights': 1,
'ddlDepartureMonth': '',
'ddlDepartureDay': '',
'ddlEquipment': '',
'ddlEquipmentSub': '',
'ddlPartySize': 2,
'ctl00$MainContentPlaceHolder$chkExcludeAccessible': 'on',
'ctl00$MainContentPlaceHolder$imageButtonCalendar.x': 64,
'ctl00$MainContentPlaceHolder$imageButtonCalendar.y': 56
}
r = requests.get(r"https://reservation.pc.gc.ca/Yoho-LakeO'Hara?Calendar", data=payload)
print r.text
r.text最终只是第二个链接,好像没有输入任何参数 – 好像我只是向链接发送了一个普通的GET请求.我尝试将整数的有效负载值转换为字符串,我尝试删除空键:值对.没运气.试图找出我所缺少的东西.
最佳答案 在我看来,有两件事情在继续:
> @errata是正确的,这应该是一个POST请求.你差不多到了一半.
>我注意到的是,它似乎将表单数据发布到Home.aspx,并且在提交表单后看到的URL是该处理和后续重定向的结果.
您可以尝试将表单数据作为json发布到./Home.aspx.
我通过Postman发现这几乎有用,但我必须指定内容类型才能获得正确的结果.
如果你需要知道如何向.post()方法添加标题和正文指令,看起来这里有一个很好的例子(尽管可能稍微过时了):
adding header to python request module
另外,fwiw,看看Postman.如果您对请求缺乏经验并且在Python中使用它,那么至少这可能会带来一些试验和错误的负担.