微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

api端点上的发布请求不返回数据

如何解决api端点上的发布请求不返回数据

我目前正在尝试使用 API 和网站标头,而不是创建网页抓取工具。我一直在尝试使用 Chrome Dev Tools 检查网站,并在发出 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 值的替代方案,然后让请求序列化您的数据结构:

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 点,有些东西坏了,每个人都惊慌失措!您更愿意对哪个版本的代码(功能相同)进行故障排除?

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。