【问题标题】:How to get right JSON responce from POST request from PYTHON script如何从 PYTHON 脚本的 POST 请求中获得正确的 JSON 响应
【发布时间】:2019-01-16 06:45:53
【问题描述】:

任务是从特定网站的 POST 请求中获取 JSON 响应。

在浏览器中一切正常,如下所示。您可以自己模拟案例尝试开始在“开始位置”字段中输入文本。

要查看的网址:https://www.hapag-lloyd.com/en/online-business/schedules/interactive-schedule.html

Chrome Dev Tool Screen 1 - Request URL and Header

Chrome Dev Tool Screen 2 - POST data

JSON RESPONCE(一定是这样)

{"rows":[{"LOCATION_COUNTRYABBREV":"GE","LOCATION_BUSINESSPOSTALCODE":"","LOCATION_BUSINESSLOCATIONNAME":"BATUMI","LOCATION_BUSINESSLOCODE":"GEBUS","STANDARDLOCATION_BUSINESSLOCODE":"GEBUS","LOCATION_PORTTYPE":"S","DISPLAYNAME":""}]}

我的代码如下:

import requests

url = 'https://www.hapag-lloyd.com/en/online-business/schedules/interactive-schedule.html?_sschedules_interactive=_raction&action=getTypeAheadService'

POST_QUERY = 'batumi'

params = {
    'query': POST_QUERY,
    'reportname': 'FRTA0101',
    'callConfiguration': "[resultLines=10,readDef1=location_businessLocationName STARTSWITH,readDef2=location_businessLocode STARTSWITH,readClause1=location_businessLocode<>'' AND location_portType='S' AND stdSubLocation_string10='STD',readClause2=location_businessLocode<>'' AND location_portType<>'S' AND stdSubLocation_string10='STD',readClause3=location_businessLocode<>'' AND location_portType='S' AND stdSubLocation_string10='SUB',readClause4=location_businessLocode<>'' AND stdSubLocation_string10='SUB',readClause5=location_businessLocode='' AND stdSubLocation_string10='SUB',sortDef1=location_businessLocationName ASC,resultAttr1=location_businessLocationName,resultAttr2=location_businessLocode,resultAttr3=location_businessPostalCode,resultAttr4=standardLocation_businessLocode,resultAttr5=location_countryAbbrev,resultAttr6=location_portType]"
}
headers = {
    "Accept": "*/*",
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'en-EN,en;q=0.9,en-US;q=0.8,en;q=0.7',
    'Cache-Control': 'no-cache',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'DNT': '1',
    'Host': 'www.hapag-lloyd.com',
    'Origin': 'https://www.hapag-lloyd.com',
    'Pragma': 'no-cache',
    # 'Proxy-Connection': 'keep-alive',
    'Referer': 'https://www.hapag-lloyd.com/en/online-business/schedules/interactive-schedule.html',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}

print('Testing location: ', POST_QUERY)
var_cities = requests.post(url,data=params,headers=headers)
print(var_cities.content) #it does print some %$#%$

Python Print Content Screen

我的问题是“如何从 PYTHON 脚本的 POST 请求中获得正确的 JSON 响应”?

【问题讨论】:

  • 几乎解决了。这个特定的站点需要不同的方法,因为网页是由 JS 呈现的。将尝试 Selenium WebDriver 或 QT5。

标签: python json python-3.x post python-requests


【解决方案1】:

我认为使用 BeautifulSoup 是一个更好的选择。 试试这个

Python Convert HTML into JSON using Soup

【讨论】:

  • 没有有用的响应来解析。服务器返回带有有用数据的虚拟 HTML 而不是 JSON。
【解决方案2】:
print(var_cities.text)

这会将 html 作为字符串返回。这是你期望得到的回应吗?并将其转换为json,请查看上面的答案...

【讨论】:

  • var_cities.json() 不起作用,因为响应中没有 JSON 内容。这会返回一个异常“raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)"
  • 是的,但我没有在 html 中看到您希望的响应。所以我不确定问题是否只是格式?
  • 这是我对第一个人的回答:“服务器返回虚拟 HTML 而不是带有有用数据的 JSON。”
猜你喜欢
  • 2018-03-20
  • 2020-07-09
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多