為什么我的代碼無法獲取API返回的數據?如何解決這個問題?

為什么我的代碼無法獲取API返回的數據?如何解決這個問題?

python代碼無法獲取API返回數據的排查與解決

本文將分析一個使用requests庫調用ip-api.com API時返回空值的Python代碼案例,并提供解決方案。

問題描述

以下代碼嘗試使用POST請求獲取ip-api.com的批量IP信息,但始終返回空值:

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請求,fields=58898 用于指定返回字段。雖然直接在API網站上查詢IP沒有問題,但代碼卻始終返回空值,且requests庫未報錯。

問題分析與解決方案

仔細檢查代碼和API文檔后,發現問題在于URL的查詢參數設置。原始代碼中,URL為:

api = "http://ip-api.com/batch?fields=58898?lang=zh_cn"

多個查詢參數之間應該使用&連接,而不是連續使用?。正確的URL應為:

api = "http://ip-api.com/batch?fields=58898&lang=zh_CN"

此外,建議將lang參數設置為zh_CN,以確保返回中文數據。 同時,HTTP Header中的User-Agent和content-type應該使用標準的命名方式,首字母大寫。

以下是修改后的完整代碼:

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

通過修改URL和HTTP Header,即可成功獲取API返回數據。此例說明了細微的語法錯誤可能導致api調用失敗,強調了仔細檢查URL和參數的重要性。

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享