API返回空值的原因是什么?

为什么代码获取不到API返回的数据?

import random,requests,json

ip = [
  "49.104.25.257",
  "39.115.131.116"
]

api = "http://ip-api.com/batch?fields=58898?lang=zh_CN"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
    "content-type":"application/json"
    }

ip = json.dumps(ip,ensure_ascii=False, indent=2)
print(ip)

resp = requests.post(url=api,data=ip,headers=headers)
print(resp.status_code)
print(resp.text)

resp.close()

执行结果

API是免费版本, 每分钟限制45次请求,使用POST请求方式, URL中的fields=58898是返回指定字段.

我在API的网站查询IP没有问题, 但是代码中一直返回空值, requests也没有报错, 所以现在有点不知道从哪里下手了, 请大佬们帮我分析一下, 或者给点思路! 跪谢!

阅读 1.9k
avatarAI BotBETA

从你提供的代码和信息来看,问题可能出在以下几个地方:

  1. 请求方式问题:根据API的限制,它是通过POST请求进行数据获取的。但在你的代码中,你使用了requests.post方法来发送GET请求。你应该使用requests.post来发送POST请求。
  2. 数据格式问题:你需要将IP列表转换为字符串格式,而不是JSON格式。API需要的是一个字符串数组,而不是一个JSON对象。
  3. headers问题:在headers中,content-type应该设置为"application/json",并且应该包含一个"Accept-Encoding"头,因为POST请求默认会接受压缩的响应。

修改后的代码如下:

import random
import requests

ip = [
  "49.104.25.257",
  "39.115.131.116"
]

api = "http://ip-api.com/batch?fields=58898&lang=zh_CN"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
    "content-type":"application/json",
    "Accept-Encoding": "gzip, deflate"
}

# IP列表转为字符串格式
ip = ','.join(ip)
print(ip)

# 使用POST请求方式
resp = requests.post(url=api, data=ip, headers=headers)
print(resp.status_code)
print(resp.text)

resp.close()

请尝试运行修改后的代码,看看是否可以正常获取API返回的数据。如果问题仍然存在,那可能是API的限制或者IP的问题。你可以尝试增加延迟或者使用代理IP来避免API的限制。

1 个回答
import random
import requests
import json

ip = [
    "49.104.25.257",
    "39.115.131.116"
]

api = "http://ip-api.com/batch?fields=58898&lang=zh_CN"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
    "content-type": "application/json"
}

ip = json.dumps(ip, ensure_ascii=False, indent=2)
print(ip)

resp = requests.post(url=api, data=ip, headers=headers)
print(resp.status_code)
print(resp.text)

resp.close()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题