Python - 使用requests发送POST消息

3
我使用Postman发送一条原始请求到捷星网站以获取航班详细信息。我想使用Python脚本以及requests库来完成相同的任务,但是我无法获得正确的响应。
以下是我在Postman中所做的事情: enter image description here 下面是我用于发送POST请求的简单脚本:
import requests
files = {'file': open('PostContent.txt', 'rb')}
if __name__ == "__name__"):
    url = "http://www.jetstar.com/"
    r = requests.post(url, files = files)
    print(r.text)

当我运行Python脚本时,总是得到欢迎页面而不是航班详细信息。我不确定出了什么错误?
注意:PostContent.txt 包含原始文本中的表单数据,当我搜索航班时。
我使用Chrome Dev Tool来捕获当我搜索特定航班日期时的POST请求。它是Headers中的表单数据。

PostContent.txt 的内容是什么? - Pablo Santa Cruz
嗨@PabloSantaCruz,我刚刚编辑了我的问题,希望对你更清晰! - OhMyGosh
请将PostContent.txt作为文本发布。 - wenzul
也许尝试使用urllib.urlencode(files)对POST数据进行编码;如果这不起作用,可以打开像Wireshark这样的数据包分析器,检查正在发送的数据的外观。 - Ryan
2个回答

2

尝试使用字典而不是文件。文件应该用于发布文件,而不是表单编码的发布,这可能是网站所期望的。

payload = {
   'DropDownListCurrency': 'SGD'
}
r = requests.post("http://httpbin.org/post", data=payload)

是的,@Pablo,你说得对!但是你知道如何在Python中将文本文件转换为字典吗?因为我也很新手! - OhMyGosh

2
您使用的 file 密钥不适用于此类型的请求。另外,您的示例代码不起作用!只需在此处粘贴有效代码即可...
import requests
import logging

logging.basicConfig(level=logging.DEBUG)

payload = {"__EVENTTARGET":"",
"__EVENTARGUMENT":"",
"__VIEWSTATE":"/wEPDwUBMGQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgEFJ01lbWJlckxvZ2luU2VhcmNoVmlldyRtZW1iZXJfUmVtZW1iZXJtZSDCMtVG/1lYc7dy4fVekQjBMvD5",
"pageToken":"",
"total_price":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$RadioButtonMarketStructure":"RoundTrip",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextBoxMarketOrigin1":"Nadi (NAN)",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextBoxMarketDestination1":"Melbourne (Tullamarine) (MEL)",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextboxDepartureDate1":"14/01/2015",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextboxDestinationDate1":"16/02/2015",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$DropDownListCurrency":"AUD",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextBoxMarketOrigin2":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextBoxMarketDestination2":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextboxDepartureDate2":"16/02/2015",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextboxDestinationDate2":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextBoxMarketOrigin3":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextBoxMarketDestination3":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextboxDepartureDate3":"27/12/2014",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextboxDestinationDate3":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextBoxMarketOrigin4":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextBoxMarketDestination4":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextboxDepartureDate4":"03/01/2015",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextboxDestinationDate4":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextBoxMarketOrigin5":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextBoxMarketDestination5":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextboxDepartureDate5":"10/01/2015",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextboxDestinationDate5":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextBoxMarketOrigin6":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextBoxMarketDestination6":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextboxDepartureDate6":"17/01/2015",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextboxDestinationDate6":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$DropDownListPassengerType_ADT":1,
"ControlGroupSearchView$AvailabilitySearchInputSearchView$DropDownListPassengerType_CHD":0,
"ControlGroupSearchView$AvailabilitySearchInputSearchView$DropDownListPassengerType_INFANT":0,
"ControlGroupSearchView$AvailabilitySearchInputSearchView$RadioButtonSearchBy":"SearchStandard",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextBoxMultiCityOrigin1":"Origin",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextBoxMultiCityDestination1":"Destination",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextboxDepartureMultiDate1":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextBoxMultiCityOrigin2":"Origin",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextBoxMultiCityDestination2":"Destination",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$TextboxDepartureMultiDate2":"",
"ControlGroupSearchView$AvailabilitySearchInputSearchView$DropDownListMultiPassengerType_ADT":1,
"ControlGroupSearchView$AvailabilitySearchInputSearchView$DropDownListMultiPassengerType_CHD":0,
"ControlGroupSearchView$AvailabilitySearchInputSearchView$DropDownListMultiPassengerType_INFANT":0,
"ControlGroupSearchView$AvailabilitySearchInputSearchView$numberTrips":2,
"ControlGroupSearchView$AvailabilitySearchInputSearchView$ButtonSubmit":""}

if __name__ == "__main__":
    url = "http://booknow.jetstar.com/Search.aspx"
    r = requests.post(url, data=payload)
    print(r.text)

你好 @wenzul,你是如何得到payload字典的?你是硬编码还是使用任何脚本来创建它的? - OhMyGosh
可能它可以与Scrapy一起使用。不确定。只需复制内容并通过正则表达式插入引号即可。 - wenzul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接