Post api 端点上的请求没有 return 数据

Post request on api endpoint does not return data

我目前正在尝试使用网站的 API 和 headers,而不是创建网络抓取工具。我一直在尝试使用 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()

你可以试试看:

print(r.json())

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

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

通过 here

查看更多详细信息

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

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()

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

我知道这并没有直接回答您的问题,但本着“当我们讨论这个问题时...”的精神来理解这个问题。