悠米是只猫

悠米是只猫

使用Python筛选特定国家的IP地址

2025-01-11

引言

随着互联网的发展,数据交换变得越来越频繁。在某些情况下,我们可能需要获取特定国家或地区的IP地址列表用于网络安全、数据分析或是地理定位服务。本文将介绍如何利用Python脚本从公共资源中下载并筛选出中国的IPv4和IPv6地址,并保存到独立文件中。

准备工作

首先,我们需要确保安装了requests库,这是Python的一个HTTP库,可以用来发送HTTP请求。如果尚未安装,可以通过pip进行安装:

pip install requests

下载数据

我们将要使用的数据来自APNIC(亚太互联网络信息中心),它提供了最新的IP分配记录。以下是一个名为download_file的函数,它尝试从给定的URL下载文件,并处理可能出现的下载失败情况。

import requests

def download_file(url, filename, max_retries=3):
    retries = 0
    while retries < max_retries:
        print("开始下载文件...")
        response = requests.get(url)
        if response.status_code == 200:
            with open(filename, 'wb') as file:
                file.write(response.content)
            print(f"文件下载成功: {filename}")
            return True
        else:
            retries += 1
            print(f"文件下载失败,状态码: {response.status_code},正在重试({retries}/{max_retries})")
    print("达到最大重试次数,放弃下载")
    return False

这段代码会尝试最多三次下载指定的文件。如果下载成功,则将内容写入本地文件;否则,它会在达到最大重试次数后放弃。

筛选IP地址

下载完成后,接下来的任务是从下载的数据中筛选出中国的IP地址。这通过filter_ip_addresses_for_country函数完成,它读取下载的文本文件,根据国家代码过滤出对应的IP地址,并将结果分别写入两个不同的输出文件中,一个用于IPv4地址,另一个用于IPv6地址。

def filter_ip_addresses_for_country(input_filename, output_v4_filename, output_v6_filename, country_code='CN'):
    print("开始筛选IP地址...")
    ipv4_addresses = []
    ipv6_addresses = []

    try:
        with open(input_filename, 'r') as file:
            for line in file:
                parts = line.strip().split('|')
                if len(parts) > 6 and parts[1] == country_code:
                    if parts[2] == 'ipv4':
                        start_ip = parts[3]
                        num_ips = int(parts[4])
                        prefix_length = 32 - (num_ips).bit_length() + 1
                        ipv4_addresses.append(f"{start_ip}/{prefix_length}")
                    elif parts[2] == 'ipv6':
                        start_ip = parts[3]
                        prefix_length = parts[4]
                        ipv6_addresses.append(f"{start_ip}/{prefix_length}")

    except FileNotFoundError:
        print(f"文件未找到: {input_filename}")
        return

    # Write IPv4 addresses to the output file
    with open(output_v4_filename, 'w') as file:
        for address in ipv4_addresses:
            file.write(address + '\n')

    # Write IPv6 addresses to the separate output file
    with open(output_v6_filename, 'w') as file:
        for address in ipv6_addresses:
            file.write(address + '\n')

    print(f"筛选完成,结果已保存到: {output_v4_filename} 和 {output_v6_filename}")

执行流程

最后,当脚本作为主程序运行时,它会调用上述两个函数来执行整个任务流:先下载最新数据,再从中筛选出中国的IP地址。

if __name__ == "__main__":
    url = "http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest"
    input_filename = "delegated-apnic-latest"
    output_v4_filename = "all_cn.txt"
    output_v6_filename = "all_cn_ipv6.txt"

    if download_file(url, input_filename):
        filter_ip_addresses_for_country(input_filename, output_v4_filename, output_v6_filename)

结论

通过这篇博客文章,我们学习了如何编写Python脚本来自动化地获取和处理IP地址数据。这个过程不仅有助于了解网络编程的基础知识,而且还能帮助解决实际问题,如安全分析、流量监控等。希望这篇文章能够为读者提供有价值的参考和启发。