利用Python2脚本获取亚太区任意国家的IP段

有时候我们需要得到一份某区域的IP段,例如防火墙上使用。通过APNIC的地址库得到数据,会比较准确权威,且IP库每天都在更新中。

import os  
import sys  
import socket  
import math  
import urllib  
import urllib2  
import struct  
import tempfile  

local_file = os.path.dirname(tempfile.mktemp()) + '/apnic_ip.txt'  

def _usage():  
    print 'Usage:'  
    print '\t%s <area> [Options]\n' % os.path.basename(sys.argv[0])  
    print 'area example: hk,jp,cn,us,sg etc..'  
    print 'Options:'  
    print ' -ipv4\t\tGet ipv4 address, default.'  
    print ' -ipv6\t\tGet ipv6 address.'  
    print ' -all\t\tGet all address info.'  
    print ' -new\t\tFrom internet get a new info.'  
    print ' -mask\t\teg: x.x.x.x/24, default.'  
    print ' -part\t\teg: x.x.x.x-x.x.x.x'  
    print '\nExample:'  
    print ' %s hk -new\t\t' % os.path.basename(sys.argv[0])  

def getApnicFile():  
    print 'Downloading files...'  
    try:  
        req = urllib2.Request('ftp://ftp.apnic.net/public/apnic/stats/apnic/delegated-apnic-latest')  
        response = urllib2.urlopen(req)  
        the_page = response.read()  
        fs = open(local_file,'w')  
        fs.write(the_page)  
        fs.close()  
    except:  
        print '[-] Download error!'
        return False  
    return True  

def viewPartInfo(location,itype):  
    fs = open(local_file,'r')  
    for line in fs:  
        if line[0] == '#':  
            continue  
        list = line.split('|')  
        if list[1] != location :  
            continue  
        if itype != 3:  
            if itype == 1:  
                if list[2] != 'ipv4':  
                    continue  
            elif itype == 2:  
                if list[2] != 'ipv6':  
                    continue  
            else:  
                if list[2] != 'ipv4':  
                    continue  
        else:  
            if list[2] == 'asn':  
                continue  
        if list[2] == 'ipv6':  
            print '%s/%s' % (list[3],list[4])  
        elif list[2] == 'ipv4':              
            iStart = socket.ntohl(struct.unpack('I',socket.inet_aton(list[3]))[0]) + 1  
            iEnd = iStart + int(list[4]) - 3  
            print '%s-%s' % (socket.inet_ntoa(struct.pack('I',socket.htonl(iStart))),socket.inet_ntoa(struct.pack('I',socket.htonl(iEnd))))  
    fs.close()  

def viewMaskInfo(location,types):  
    fs = open(local_file,'r')  
    for line in fs:  
        if line[0] == '#':  
            continue  
        list = line.split('|')  
        if list[1] != location:  
            continue  
        if itype != 3:  
            if itype == 1:  
                if list[2] != 'ipv4':  
                    continue  
            elif itype == 2:  
                if list[2] != 'ipv6':  
                    continue  
            else:  
                if list[2] != 'ipv4':  
                    continue  
        else:  
            if list[2] == 'asn':  
                continue  
        if list[2] == 'ipv6':  
            print '%s/%s' % (list[3],list[4])  
        elif list[2] == 'ipv4':  
            print '%s/%d' % (list[3],32-int(math.log(int(list[4]),2)))  
    fs.close()  

if __name__ == '__main__':  
    argLen = len(sys.argv)  
    if argLen < 2:  
        _usage()  
        sys.exit(0)  
    arg = sys.argv  
    single1 = 0  
    single2 = 0  
    itype = 1  
    iview = 1  
    for x in range(1,argLen):  
        if arg[x] == '-ipv4':  
            single1 += 1  
            itype = 1  
        if arg[x] == '-ipv6':  
            single1 += 1  
            itype = 2  
        if arg[x] == '-all':  
            single1 += 1  
            itype = 3  
        if arg[x] == '-new':  
            if not getApnicFile():  
                print '[-] Download new ip file failed!'  
            pass  
        if arg[x] == '-mask':  
            single2 += 1  
            iview = 1  
        if arg[x] == '-part':  
            single2 += 1  
            iview = 2  

    if single1 > 1:  
        print '[-] ipv4,ipv6,all only select one.\n'  
        sys.exit(0)  
    if single2 > 1:  
        print '[-] mask,part only select one.\n'  
        sys.exit(0)  
    if not os.path.exists(local_file):  
        if not getApnicFile():  
            sys.exit(0)  
    location = sys.argv[1].upper()  
    if iview == 2:  
        viewPartInfo(location,itype)  
    else:  
        viewMaskInfo(location,itype)

如上所示,我们执行脚本后可以得到列表,同时导出即可。

python china_ip.py cn > r.txt

我要评论!

想一个你喜欢的昵称。
给一个你的常用邮箱。
想和萌萌哒的TA们说点啥。
  • 很多时候因网络的问题,导致在进行pip命令安装模块时会有下载慢甚至是失败的可能,且可能性较大。为了解决国内的网络问题,我们很多时候会选择国内的镜像平台做为源,而在pip中如何自定义源呢? 首先我们看下官方的文档,如https://pip.pypa.io/en/latest/user_guide/#c...
  • 有些时候,为了方便多次使用同一个cookie的进行会话,需要将cookie保存下来,以便下次使用,这时就需要我们创建一个带有cookie的opener,在访问登录的url时,将登录后的cookie保存下来,然后利用这个cookie来操作。 当保存cookie到文件中后,我们可以直接从文件导入cook...
  • 有的网站需要登陆才能抓取到网站的数据,那么光模拟浏览器请求网站内容是还不够了,还需要能够模拟用户登陆网站,然后保留登陆状态,获取网站相关的内容。 想要成功模拟真实用户登陆,重点要找到登录时候提交表单都包含了哪些真实的数据。然后使用Python生成这些数据,携带在请求头信息当中,这样服务器就能当做正常...
  • urllib提供了一系列用于操作URL的功能,而urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应。 基本的网络请求示例 import urllib.request #请求百度网页 resu = urllib.request.u...
  • pip类似RedHat里面的yum,安装Python包非常方便。 python -m pip install --upgrade pip
微信扫一扫即可带走我!