說明:最近需要在python項目內使用IP定位所在城市的需求,沒有采用向外部ISP服務商API請求獲取信息的方案,則翻了翻,在搞Java時很多的方案,在Python端反而可選擇范圍很小。
# 示例查詢
ips = ["106.38.188.214", "203.93.215.16", "106.38.188.100",
"221.130.191.216", "47.98.14.174"]
一:geoip2?定位五個IP效果
二:ip2region 定位五個IP效果
問題說明:本文除了對比這兩個IP解釋器,同時還是為了使用當前的ip2region在Python環境的使用,因為ip2region在Python項目內無法安裝模塊,導致我花不少時間才搞定,大家走這個路線就好了,避免大家遇到同樣當不必要的其他阻礙。
1. 下載 ip2region 項目資源
我們主要采用的是離線模式的ip2region,首先手動從 GitHub 下載 ip2region 解析器
ip2region.xdb
數據庫文件: 點擊下載xdb_searcher.py
(官方解析器):點擊下載
?2.?創建ip2region工具類
工具類名稱大家自定義即可,我的類目:ip_utils_ip2region.py
import os
from utils.ip.xdbSearcher import XdbSearcher
from loguru import loggerclass IP2RegionInfo:"""todo 存儲 IP 解析出來的相關信息"""def __init__(self, country=None, province=None, city=None, isp=None):self.country = countryself.province = provinceself.city = cityself.isp = ispdef __str__(self):return f"{self.country},{self.province},{self.city},{self.isp}"class IP2RegionLoader:"""todo ip2region數據加載器-單例模式"""_searcher = None@classmethoddef get_searcher(cls):if cls._searcher is None:# 獲得指定文件的絕對路徑-本次模式使用的當前python函數所在文件夾的目錄db_path = os.path.join(os.path.dirname(__file__), "ip2region.xdb")if not os.path.exists(db_path):raise FileNotFoundError("請下載 ip2region.xdb 并修改路徑!")try:# 加載 xdb 數據庫cls._searcher = xdbSearcher.XdbSearcher(dbfile=db_path)logger.info("成功加載 ip2region.xdb 數據庫")except Exception as e:logger.error(f"加載數據庫時出錯: {e}")raisereturn cls._searcher@classmethoddef close_searcher(cls):if cls._searcher is not None:cls._searcher.close()cls._searcher = Nonelogger.info("已關閉 ip2region 數據庫搜索器")# 查詢 IP 地址的具體信息
def ip2region_location_ip(ip):try:searcher = IP2RegionLoader.get_searcher()result = searcher.search(ip)# 解析查詢結果:ip2region 返回的格式類似于 "國家|省份|城市|ISP"region_info = result.split('|')if len(region_info) < 4:logger.warning(f"IP {ip} 查詢結果格式異常: {result}")return IP2RegionInfo()# 構造 IP2RegionInfo 對象ip_info = IP2RegionInfo(country=region_info[0], province=region_info[2], city=region_info[3],isp=region_info[4])return ip_infoexcept Exception as e:logger.error(f"查詢 IP {ip} 時發生錯誤: {e}")return Noneif __name__ == '__main__':# 示例查詢ips = ["106.38.188.214", "203.93.215.16", "106.38.188.100", "221.130.191.216", "47.98.14.174"]for ip in ips:result = ip2region_location_ip(ip)if result:logger.info(f"IP {ip} 歸屬地信息: {result}")else:logger.error(f"IP {ip} 查詢失敗!")# 關閉搜索器IP2RegionLoader.close_searcher()
3.?資源文件關系目錄
三個文件的文件關系目錄,先跑起來,然后大家做自己的自定義哈,如圖所示:
OK,這樣就搞定了,直接運行即可,可以直接當成一個工具函數使用,祝各位編程順利
這是近一年來轉人工智能方向后,今年開始第三篇文章!
資源上傳到了這兒
我用夸克網盤分享了「python_ip2Region_code.rar」,點擊鏈接即可保存。打開「夸克APP」,無需下載在線播放視頻,暢享原畫5倍速,支持電視投屏。
鏈接:https://pan.quark.cn/s/25b5dbb70fff
提取碼:VJQT