【问题标题】:Using 'Requests' python module for POST request, receiving response as if it were GET使用 'Requests' python 模块进行 POST 请求,像 GET 一样接收响应
【发布时间】:2017-05-17 13:14:02
【问题描述】:

所以我正在尝试制作一个脚本来检查公共汽车的预订可用性。起始链接是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:-非常长的字符串-

__VIEWSTATEGENERATOR: 8D0E13E6

ctl00$MainContentPlaceHolder$rdbListReservationType:事件

ddlLocations: 213a1bc9-9218-4e98-9a7f-0f209008e437**

ddlArrivalMonth: 2017-06-16

ddlArrivalDay: 19

ddlNights: 1

ddlDepartureMonth:

ddlDepartureDay:

ddl设备:

ddlEquipmentSub:

ddlPartySize:2

ctl00$MainContentPlaceHolder$chkExcludeAccessible:开启

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 请求。我尝试将整数的有效负载值转换为字符串,我尝试删除空键:值对。没运气。试图弄清楚我错过了什么。

【问题讨论】:

  • 你能不能把requests.get()改成requests.post()
  • 由于缩进的方式,您发布的代码将无法运行。尝试创建一个正确的minimal working example,可以在没有错误的情况下执行。
  • 对不起,这是我的第一篇 SO 帖子,这不是我的 python 脚本中的缩进。让我尝试编辑它以正确显示。

标签: python python-requests


【解决方案1】:

在我看来,发生了两件事:

  1. @errata 是正确的,这应该是一个 POST 请求。您已经完成了一半。

  2. 但我注意到,它似乎将表单数据发布到 Home.aspx,而您在提交表单后看到的 URL 是该处理和后续重定向的结果。

您可以尝试将表单数据以 json 格式发布到 ./Home.aspx。

我通过 Postman 发现这几乎可以工作,但我必须指定内容类型才能获得正确的结果。

如果你需要知道如何在 .post() 方法中添加 header body 指令,看起来有一个很好的例子(虽然可能有点过时): adding header to python request module

另外,请查看 Postman。如果您既不熟悉请求又不熟悉 Python,至少这可以减轻一些反复试验的负担。

【讨论】:

  • 就是这样,非常感谢!在请求中包含标头,它就像一个魅力。
【解决方案2】:

你正在使用

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

但是,在响应中的 Location 之后也会导致 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

所有这些都可能导致请求最终将您的 POST 转换为 GET...

【讨论】:

  • 不幸的是,这并没有成功,仍然返回页面,就像我直接访问链接一样。
  • 感谢您进一步挖掘。那么,在您看来,有什么方法可以接收我正在寻找的正确 POST 响应?还是重定向搞砸了一切?
  • 老实说,我这辈子从来没有遇到过这样的问题,所以我不能在这个特定的时刻告诉你:)我可以试着在今天晚些时候检查一下......跨度>
  • 好的,如果我将 allow_redirects=False 添加到 .post 函数中,它会让我更近一步。它现在让我进入日程安排页面,只是在错误的日期!
猜你喜欢
  • 2015-08-04
  • 2014-07-13
  • 2020-11-09
  • 2015-06-11
  • 2022-01-17
  • 2013-03-12
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
相关资源
最近更新 更多