使用’请求’python模块进行POST请求,接收响应就好像它是GET一样

所以我试图制作一个检查公交车预订可用性的脚本.起始链接是
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中使用它,那么至少这可能会带来一些试验和错误的负担.

点赞