Python中如何使用IPIP.net免费IP地址数据的MySQL版本

ipip.net 提供了一份免费版本的 IP 地址数据库,但是提供的数据文件是自定义的文件格式,官方推荐的解析库是通过查询文件的方式,在项目中使用不是特别友好。因此做了一个小工具,可以将数据文件转成 MySQL 版本的数据库,这样就能直接 select 查询了。

项目地址:

免费版本包含运营商数据,国外地址的也只到国家,如果需要精确的数据,还是要付费购买。


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_ipend_ip字段上建立了索引,否则查询会很慢
  • IPIP.net的数据更新频繁,记得定期更新数据库

如果你用的是IPDB文件,他们官方提供了Python库直接读取,但你说要MySQL版本,所以需要这个导入查询的过程。

一句话建议:记得给IP字段建索引,不然查得慢。

原来楼主哥是「淡水网志」啊,久仰,经常搜到你的博客

其实做一份 sqlite3 的可能更实用一些

跟 maxmind 的 geoip 比呢?

友情提醒,之前有人在这发过解析后的 txt,被 ipip 警告了, 楼主注意。

收費版的要 7000+好貴啊

这 v 站的帖子删除不了……

免费版数据做的应该没问题吧

没用过这些,但是感觉 ipip.net 做得挺用心的

因为版权问题,麻烦删除一下这个帖子

太不尊重高总的辛苦采集分析了

回到顶部