对POST请求使用“Requests”python模块,接收响应就像获取响应一样
因此,我试图制作一个脚本来检查公交车的预订可用性。这方面的起始链接是 在保留框中,需要选择以下内容: 预订:白天有导游的徒步旅行,奥哈拉湖巴士 公园:Yoho湖奥哈拉 抵达日期:6月16日 聚会人数:2人 输入这些选项后,将进入下一页: 我的理解是,如果我向第二个链接发送一个包含正确数据的POST请求,它将返回我正在查找的页面 如果在选择正确参数时查看开发工具网络信息,则表单数据为: __事件目标: __事件参数: __VIEWSTATE:-真正的长字符串- __VIEWSTATEGENERATOR:8D0E13E6 ctl00$MainContentPlaceHolder$rdbListReservationType:事件 地址:213a1bc9-9218-4e98-9a7f-0f209008e437** 到达月份:2017-06-16 抵达日期:19 晚上:1 离港月份: 出发日: 设备: DDL设备分包: 参加派对:2 ctl00$MainContentPlaceHolder$chkeExcludeAccess:打开 ctl00$MainContentPlaceHolder$imageButtonCalendar.x:64 ctl00$MainContentPlaceHolder$imageButtonCalendar.y:56 所以我写的代码是:对POST请求使用“Requests”python模块,接收响应就像获取响应一样,python,python-requests,Python,Python Requests,因此,我试图制作一个脚本来检查公交车的预订可用性。这方面的起始链接是 在保留框中,需要选择以下内容: 预订:白天有导游的徒步旅行,奥哈拉湖巴士 公园:Yoho湖奥哈拉 抵达日期:6月16日 聚会人数:2人 输入这些选项后,将进入下一页: 我的理解是,如果我向第二个链接发送一个包含正确数据的POST请求,它将返回我正在查找的页面 如果在选择正确参数时查看开发工具网络信息,则表单数据为: __事件目标: __事件参数: __VIEWSTATE:-真正的长字符串- __VIEWSTATEGENERAT
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、 文本最终只是第二个链接,就好像没有输入任何参数一样——就好像我只是向链接发送了一个普通的GET请求。我尝试将整数的有效负载值转换为字符串,我尝试删除空的key:value对。不走运。试图找出我遗漏了什么。您正在使用
r = requests.get(r"https://reservation.pc.gc.ca/Yoho-LakeO'Hara?Calendar", data=payload)
而不是
r = requests.post(r"https://reservation.pc.gc.ca/Yoho-LakeO'Hara?Calendar", data=payload)
深入研究您的问题,我发现您正在调用的URL实际上是重定向到另一个URL,返回HTTP响应302:
$ curl -I "https://reservation.pc.gc.ca/Yoho-LakeO'Hara"
HTTP/1.1 302 Found
Cache-Control: private
Content-Length: 77273
Content-Type: text/html; charset=utf-8
Location: https://reservation-pc.fjgc-gccf.gc.ca/GccfLanguage.aspx?lang=eng&ret=https%3a%2f%2freservation.pc.gc.ca%3a443%2fYoho-LakeO%27Hara
Server: Microsoft-IIS/8.0
Set-Cookie: ASP.NET_SessionId=qw4p4e2zxjxx0c2zyq014p45; path=/; secure; HttpOnly
Set-Cookie: CookieLocaleName=en-CA; path=/; secure; HttpOnly
X-Powered-By: ASP.NET
X-Frame-Options: SAMEORIGIN
Date: Wed, 17 May 2017 14:22:53 GMT
但是,根据响应中的位置也会导致302:
$ curl -I "https://reservation-pc.fjgc-gccf.gc.ca/GccfLanguage.aspx?lang=eng&ret=https%3a%2f%2freservation.pc.gc.ca%3a443%2fYoho-LakeO%27Hara"
HTTP/1.1 302 Found
Cache-Control: private
Content-Length: 179
Content-Type: text/html; charset=utf-8
Location: https://reservation.pc.gc.ca:443/Yoho-LakeO'Hara?gccf=true
Server: Microsoft-IIS/8.0
Set-Cookie: ASP.NET_SessionId=rbcuvexfg4fb340ixtcjd1qy; path=/; secure; HttpOnly
Set-Cookie: _gc_lang=eng; domain=.fjgc-gccf.gc.ca; path=/; secure; HttpOnly
X-Powered-By: ASP.NET
X-Frame-Options: SAMEORIGIN
Date: Wed, 17 May 2017 14:24:55 GMT
所有这些可能最终导致请求将您的帖子转换为GET…在我看来,有两件事正在发生: @勘误表是正确的,这应该是一个POST请求。你已经走到一半了 但我注意到,它似乎将表单数据发布到Home.aspx,而您在提交表单后看到的URL是该处理和后续重定向的结果 您可以尝试将表单数据作为json发布到./Home.aspx 通过《邮递员》我发现这几乎奏效了,但我必须指定内容类型才能得到正确的结果 如果您需要知道如何向.post方法添加标题和正文说明,这里似乎有一个很好的示例,但可能有些过时:
还有,fwiw,看看邮递员。如果您都不熟悉请求,也不熟悉Python,至少这可能会给您带来一些尝试和错误的负担。您可以尝试更改请求吗。get to requests.Post使用缩进的方式,您发布的代码将无法运行。请尝试创建一个可以无错误执行的正确的脚本。对不起,这是我的第一篇SO文章,这不是我python脚本中的缩进。让我试着编辑它以正确显示。不幸的是,这没有起到作用,仍然返回页面,就像我直接访问链接一样。感谢进一步挖掘。那么,在你看来,有什么方法可以得到我想要的正确的帖子回复吗?或者重定向会把一切都搞砸吗?老实说,我一生中从未遇到过这样的问题,所以我不能在这个特殊的时刻告诉你:我今天晚些时候可以试着检查一下……好吧,如果我在.post函数中添加allow_redirects=False,我会更进一步。它现在让我进入日程安排页面,只是在错误的日期!就是这样,非常感谢!在请求中包含标题,它就像一个符咒。