Python中如何使用IPIP.net免费IP地址数据的MySQL版本
14 回复
好人 1024
要使用IPIP.net的免费IP地址数据MySQL版本,你需要先获取数据文件,然后导入到MySQL中,最后在Python中查询。这里给你一个完整的操作步骤和代码示例。
首先,去IPIP.net官网下载免费的IP地址库(通常是ipipfree.ipdb或CSV格式)。如果下载的是IPDB二进制文件,需要先用他们的工具或脚本转换成MySQL支持的格式(如CSV)。假设你已经有了一个CSV文件,结构类似:
start_ip, end_ip, country, province, city, ...
1. 创建MySQL表:
CREATE TABLE ipip_free (
id INT AUTO_INCREMENT PRIMARY KEY,
start_ip BIGINT UNSIGNED,
end_ip BIGINT UNSIGNED,
country VARCHAR(100),
province VARCHAR(100),
city VARCHAR(100),
INDEX idx_start_ip (start_ip),
INDEX idx_end_ip (end_ip)
);
2. 导入CSV数据:
使用MySQL的LOAD DATA INFILE命令或客户端工具导入。
3. Python查询代码:
这里用pymysql和IP转整数的方法来查询。
import pymysql
import socket
import struct
def ip_to_int(ip):
"""将IP地址转换为整数"""
return struct.unpack("!I", socket.inet_aton(ip))[0]
def query_ip_location(ip):
# 连接数据库
connection = pymysql.connect(
host='localhost',
user='your_username',
password='your_password',
database='your_database',
charset='utf8mb4'
)
ip_int = ip_to_int(ip)
try:
with connection.cursor() as cursor:
# 查询IP所在范围
sql = """
SELECT country, province, city
FROM ipip_free
WHERE %s BETWEEN start_ip AND end_ip
LIMIT 1
"""
cursor.execute(sql, (ip_int,))
result = cursor.fetchone()
if result:
return {
'country': result[0],
'province': result[1],
'city': result[2]
}
else:
return None
finally:
connection.close()
# 使用示例
if __name__ == '__main__':
location = query_ip_location('8.8.8.8')
print(location) # 输出: {'country': '美国', 'province': '', 'city': ''}
关键点:
- 将IP地址转为整数存储和比较,比字符串比较高效得多
- 确保在
start_ip和end_ip字段上建立了索引,否则查询会很慢 - IPIP.net的数据更新频繁,记得定期更新数据库
如果你用的是IPDB文件,他们官方提供了Python库直接读取,但你说要MySQL版本,所以需要这个导入查询的过程。
一句话建议:记得给IP字段建索引,不然查得慢。
原来楼主哥是「淡水网志」啊,久仰,经常搜到你的博客
其实做一份 sqlite3 的可能更实用一些
跟 maxmind 的 geoip 比呢?
友情提醒,之前有人在这发过解析后的 txt,被 ipip 警告了, 楼主注意。
收費版的要 7000+好貴啊
这 v 站的帖子删除不了……
免费版数据做的应该没问题吧
没用过这些,但是感觉 ipip.net 做得挺用心的
因为版权问题,麻烦删除一下这个帖子
太不尊重高总的辛苦采集分析了

