【问题标题】:Post request on api endpoint does not return dataapi端点上的post请求不返回数据
【发布时间】:2021-01-06 05:33:31
【问题描述】:

我目前正在尝试使用 API 和网站的标头,而不是创建网络抓取工具。我一直在尝试使用 Chrome 开发工具检查网站,并在发出 POST 请求时捕获network 选项卡下的信息。

到目前为止,我没有运气,只从端点获得<Response [200]>,但没有返回数据。

请指教我做错了什么。

下面是我的 Python 代码:

    import requests

    def get_data_from_api():
    search_keyword = 'money'
    api_endpoint = 'https://45bwzj1sgc-dsn.algolia.net/1/indexes/*/queries?x-algolia-agent=Algolia%20for%20JavaScript%20(4.2.0)%3B%20Browser'
    payload = {
        'x-xxxx-application-id': '45BWZJ1SGC', 
        'x-xxx-api-key': 'MTRkMGNlOGFhMWQ4YThmZDA0YmViNGY2M2ViYzBlMGMwNTBmMjllNjJmMDA4YmY1YzY3YzI2NzRmMzlhYThkM3RhZ0ZpbHRlcnM9JTVCJTVCJTIyc3VzX3B1YmxpYyUyMiUyQyUyMnN1c19jaGFubmVsX2FsbCUyMiUyQyUyMnN1c19jaGFubmVsX2ZlYXR1cmVkJTIyJTJDJTIyc3VzX2NoYW5uZWxfd2Vla2x5LW5ld3NsZXR0ZXIlMjIlMkMlMjJzdXNfY2hhbm5lbF9hbWElMjIlMkMlMjJzdXNfY2hhbm5lbF9saXZlc3RyZWFtJTIyJTJDJTIyc3VzX2NoYW5uZWxfc2hvdy1zdXMlMjIlMkMlMjJzdXNfY2hhbm5lbF9lbmdpbmVlcmluZyUyMiU1RCU1RCZhbmFseXRpY3NUYWdzPSU1QiUyMnN1cyUyMiU1RA=='
        }

    r = requests.post(api_endpoint, headers= payload, data=str(''' {"requests":[{"indexName":"OmniSearch_sus_production","query":"'''+search_keyword+'''","params":"attributesToSnippet=%5B%22body%3A80%22%2C%22searchable_comments%3A30%22%5D&page=0&hitsPerPage=10&filters=&facetFilters=%5B%5B%5D%5D&facets=%5B%22channel%22%5D&sortFacetValuesBy=count&clickAnalytics=true"}]} ''')) 

    print(r)

if __name__ == "__main__":
    get_data_from_api()

【问题讨论】:

  • 专业提示:将字典而不是字符串传递到 requests.post(data=...) 并让请求为您序列化它。这方式比手动将字典写成 JSON 更不容易出错。
  • @KirkStrauser 谢谢你的提示!!

标签: python api google-chrome-devtools


【解决方案1】:

你可以试试:

print(r.json())

【讨论】:

    【解决方案2】:

    r 是一个 response 对象。 你可以使用

    • r.content 获取二进制正文。
    • r.text获取字符串体
    • r.json()orjson.loads(r.content) 获取 json 正文

    通过here查看更多详情

    【讨论】:

      【解决方案3】:

      为了跟进我的评论,您可以在一些地方让 Python 为您完成艰苦的工作。考虑使用urllib.parse.urlencode 创建params 值的替代方案,然后让请求序列化您的数据结构:

      from urllib.parse import urlencode
      
      import requests
      
      
      def get_data_from_api():
          search_keyword = "money"
          api_endpoint = "..."
          headers = {
              "x-xxxx-application-id": "...",
              "x-xxx-api-key": "...",
          }
      
          params = {
              "attributesToSnippet": '["body:80","searchable_comments:30"]',
              "page": "0",
              "hitsPerPage": "10",
              "facetFilters": "[[]]",
              "filters": "",
              "facets": '["channel"]',
              "sortFacetValuesBy": "count",
              "clickAnalytics": "true",
          }
      
          r = requests.post(
              api_endpoint,
              headers=headers,
              data={
                  "requests": [
                      {
                          "indexName": "OmniSearch_sus_production",
                          "query": search_keyword,
                          "params": urlencode(params),
                      }
                  ]
              },
          )
      
          return r.json()
      

      快点,苹果派!现在是凌晨 2 点,有些东西坏了,每个人都惊慌失措!您宁愿对哪个版本的代码(功能相同)进行故障排除?

      我知道这并不能直接回答您的问题,但本着“当我们讨论这个主题时......”的精神来看待这个问题。

      【讨论】:

        猜你喜欢
        • 2015-02-02
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-10
        • 1970-01-01
        • 2015-08-14
        相关资源
        最近更新 更多