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 点,有东西坏了,每个人都惊慌失措!您希望对哪个版本的代码(功能相同)进行故障排除?
我知道这并没有直接回答您的问题,但本着“当我们讨论这个问题时...”的精神来理解这个问题。
我目前正在尝试使用网站的 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 点,有东西坏了,每个人都惊慌失措!您希望对哪个版本的代码(功能相同)进行故障排除?
我知道这并没有直接回答您的问题,但本着“当我们讨论这个问题时...”的精神来理解这个问题。