判斷一個(gè)IP是不是china的IP

用調(diào)網(wǎng)站的API的方法來(lái)判斷

用網(wǎng)站名和ip地址的接口不太一樣

http://ip.cn/index.php?ip=www.hao123.com
http://www.ip.cn/110.84.0.129

源碼


class location_ipdotcn():

    '''

    build the mapping of the ip address and its location.

    the geo info is from www.ip.cn

    need to use PhantomJS to open the URL to render its JS

    '''



    def __init__(self, ip):

        '''

        Construction of location_ipdotcn class.

        '''

        self.ip = ip

        self.api_url = 'http://www.ip.cn/index.php?ip=%s' % ip



    def get_geoinfo(self):

        dcap = dict(DesiredCapabilities.PHANTOMJS)

        dcap["phantomjs.page.settings.userAgent"] = (

            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/29.0 ")

        driver = webdriver.PhantomJS(

            executable_path='/usr/local/bin/phantomjs',

            desired_capabilities=dcap)

        driver.get(self.api_url)

        text = driver.find_element_by_xpath('//div[@id="result"]').text       

        res = text.split('\n')[2]      

        res2 = res.split(' ')       

        driver.quit()
        return res2



    def get_region(self):

        return self.get_geoinfo()[3]



    def get_isp(self):

        return self.get_geoinfo()[2]





if __name__ == '__main__':

    ip = 'www.hao123.com'

    iploc = location_ipdotcn(ip)

    print iploc.get_region()

    print iploc.get_isp()

用官方網(wǎng)站的范圍來(lái)計(jì)算是否中國(guó)區(qū)域的IP

cvs文件只保存了開(kāi)始的IP地址和劃分的個(gè)數(shù)

#/usr/bin/python
#coding: utf-8
import csv
import socket
global_ip_dict = [[[] for col in range(256)] for row in range(256)]

#input:112.0.0.0|4194304
#output:addr1,addr2,addr3,addr4,ip_num
def analyseLine(ip_line):
    #ip_str_list = ip_line.split(',')
    ip_str,ip_num = ip_line[0],int(ip_line[1])
    ip_addr = ip_str.split('.')
    if len(ip_addr) < 4:
        return 0,0,0,0,0
    addr1,addr2,addr3,addr4 = int(ip_addr[0]),int(ip_addr[1]),int(ip_addr[2]),int(ip_addr[3])
    return addr1,addr2,addr3,addr4,ip_num

#input:
#output:True,global_ip_dict.
def init_ip_dict():
    global global_ip_dict
    with open('cn.csv', 'rb') as f:
        reader = csv.reader(f)        
        for row in reader:
            addr1,addr2,addr3,addr4,number_sum = analyseLine(row)
            if number_sum == 0:
                continue

            offset = 0
            while number_sum > 0:
                if number_sum >= 65536:
                    start,end,number = 0,65535,65536
                else:
                    start = addr3*256 + addr4
                    end = start + number_sum -1
                    number = number_sum
                    global_ip_dict[addr1][addr2+offset].append({'start':start,'end':end,'number':number})
                    number_sum -= 65536
                    offset += 1
    return True

#input:ip string,*.*.*.* or domain name
#output:True,is china IP;False,is not china IP
def determineChinaIP(ip):
    global global_ip_dict

    ip_addr = ip.split('.')
    if ip_addr[0].isdigit() == False:
        ip_address = socket.gethostbyname(ip)
        print 'gethostbyname is'
        print ip_address
        ip_addr = ip_address.split('.')
    addr1,addr2,addr3,addr4 = int(ip_addr[0]),int(ip_addr[1]),int(ip_addr[2]),int(ip_addr[3])

    if len(global_ip_dict[addr1][addr2]) == 0:
        return False
    addr_value = addr3*256+addr4
    for item in global_ip_dict[addr1][addr2]:
        if addr_value >= item['start'] and addr_value <= item['end']:
            return True        
    return False


if __name__=="__main__":    
     init_ip_dict()
     for addr1 in range(100,256):
        for addr2 in range(100,256):
            ip_str = '%s.%s.5.5' % (addr1,addr2)
            if determineChinaIP(ip_str):
                print '%s :china ip' % ip_str
            else:
                print '%s :not china ip' % ip_str
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容