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