当前位置: 首页 > 知识库问答 >
问题:

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

尚河
2023-12-12

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

import random,requests,jsonip = [  "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也没有报错, 所以现在有点不知道从哪里下手了, 请大佬们帮我分析一下, 或者给点思路! 跪谢!

共有2个答案

松高歌
2023-12-12
import randomimport requestsimport jsonip = [    "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()
荣俊杰
2023-12-12

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

  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 randomimport requestsip = [  "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的限制。

 类似资料:
  • PHP手册说,如果锁定成功,调用flock将返回TRUE,否则返回FALSE。若文件被其他进程阻塞,那个么flock应该等到它被解锁(因为我们不使用LOCK_NB)。文档中没有超时,超时会中断等待,所以显然flock将无限等待,直到获得锁为止。 但是有时我在我的多线程脚本中从flock()得到FALSE。那是什么原因呢?

  • (免责声明:人们通过facebook、firebase等请求询问使用异步操作时数据为空/不正确时,会产生很多问题。我提出这个问题的目的是为每个从android异步操作开始的人提供一个简单的答案。) 我试图从我的一个操作中获取数据,当我使用断点或日志调试它时,值就在那里,但当我运行它时,它们总是空的,我该如何解决这个问题呢? 火力基地 脸书 等。

  • 当然在文件结束或输入错误发生时返回,但这是否意味着没有更多的数据可用? 使用

  • 问题内容: 我在运行我的应用程序时遇到了此类错误。它偶尔会发生,所以我不知道此错误产生于我的代码中的确切原因。该异常不会告诉任何明确的细节。 一段堆栈跟踪。 请问有人帮助过这个错误吗?我正在使用jboss 6,seam 2,jsf 2和richfaces 3。 问题答案: 在JBoss Wiki中 对此进行了回答。这里是相关的: 许多持久性框架(Hibernate2 / OBJ)“随机”打开和关闭

  • 问题内容: 当我尝试运行程序时,出现以下错误 请帮忙 问题答案: 从Javadoc: 如果Java虚拟机找不到声明为native的方法的适当本机语言定义,则抛出该异常。 这是与JNI相关的错误。loadJacobLibrary试图加载名为jacob-1.14.3-x86的本机库,但在java.library.path定义的路径上找不到该库。启动JVM时,应将此路径定义为系统属性。例如 在Windo

  • 在这里抛出RejectedExecutionException是否有其他原因? java.util.concurrent.RejectedExecutionException:任务java.util.concurrent.FutureTask@4194a5f0被java.util.concurrent.ThreadPoolExecutor@41a36e90拒绝[终止,池大小=0,活动线程=0,排队