ip位置查询脚本

Zss 发表于:

之前查看到自己的server上nginx的连接日志上有7000多个不同的客户端公网ip,感觉很好奇,为什么这么多,平时应该很少访问的才对,难道总是给搜索引擎给搜索了吗???

记得之前在百度上提交过网站的信息,不知道是不是有一定影响,想着把这个7000多个ip都查询一下位置,挺好奇看一看这些公网ip都来自一些什么地方

随便找了一个查看ip位置的网站,http://ip.chinaz.com/  —》站长工具

抓包分析了一下是抓包为post请求,请求的参数是ip,但是url中直接使用get请求带ip是一样的,使用get比较方便所以直接使用http://ip.chinaz.com/{IP}加get请求来访问直接得到html

使用xpath筛选一下ip的位置信息就好了,最后将重复位置去除

将文件中7000多个ip依次读取,创建多个进程来进行请求与写入

最后发现这些地区分布的有点离谱,全世界到处都是的???贴出一部分,接近一千个不同的地方。。。

湖南省郴州市
河北省张家口市 阿里云
浙江省杭州市 网易云数据中心
北京市 CNISP会员(尚未分配)
泰国 3BB宽频TRIPLETNET-TH网络
上海市长宁区
安徽省淮南市 移动
北京市 联通数据中心
陕西省西安市 联通
英国 伦敦DigitalOcean数据中心
美国 密苏里州堪萨斯城WholeSale互联网股份有限公司
美国 纽约
江苏省镇江市 移动
山东省淄博市临淄区 联通
辽宁省抚顺市新抚区 /顺城区联通
黑龙江省大庆市 电信
江苏省盐城市 移动
新疆阿克苏地区 联通
俄罗斯 海参崴市
美国 德克萨斯州达拉斯QuadraNet数据中心
印度 Hathway网络用户
新加坡 电信SINGNET
内蒙古 电信
新加坡 DigitalOcean数据中心
日本 东京都品川区Linode数据中心
上海市 鹏博士长城宽带
河南省郑州市 移动
印度 马哈拉施特拉邦孟买Amazon数据中心
贵州省贵阳市花溪区 联通
江苏省徐州市 电信
安徽省合肥市巢湖市 电信
加拿大 多伦多市Rogers Cable通信公司
北京市 好维高科通讯有限公司
北京 腾讯云
美国 圣何塞DCS机房
德国 纽伦堡Hetzner Online公司
安徽省芜湖市 电信
沙特阿拉伯 GulfNet KSA
西藏昌都地区 G
广东省广州市 移动数据上网公共出口
山东省 电信
台湾省 新世纪资通股份有限公司
湖北省荆州市 联通
美国 里斯敦市
塞内加尔
韩国 延世大学(原州校区)
内蒙古 阿里云
江苏省苏州市常熟市 电信
北京市海淀区 北龙中网(北京)科技有限公司(BGP)
广东省佛山市 迅雷离线服务器
北京市 奇虎360科技有限公司
广东省东莞市 华为企业数据中心(EDC)
美国 加利福尼亚州洛杉矶县洛杉矶市QuickPacket有限公司
广东省广州市 移动
广东省佛山市 移动
山东省青岛市 阿里云BGP数据中心

#coding:utf-8
import requests,os,sys
from lxml import etree
from multiprocessing import Pool

def read_ip():
    with open('ip.log','r') as f:
        ip = f.readlines()
    return ip

def get_loc(ip):
    url = 'http://ip.chinaz.com/{}'.format(ip)
    rsp = requests.get(url).text
    xml = etree.HTML(rsp)
    result = xml.xpath('//*[@id="leftinfo"]/div[3]/div[2]/p[2]/span[4]/text()')[0]
    data = '%18s:%35s\n'%(ip,result)
    print(data)
    with open('ip_loc.log','a+') as f:
        f.write(data)

def format_loc():
    data1 = []
    with open('ip_loc.log','r') as f:
        data = f.readlines()
        for i in data:
            try:
                a = i.split(':')[1]
                if a not in data1:
                    data1.append(a)
                    with open('set_loc.log','a+')as f1:
                        f1.write(a)
            except:pass
if __name__ == '__main__':
    pool = Pool(10)
    ip_list = read_ip()
    if os.path.isfile('ip_loc.log'):
        os.remove('ip_loc.log')
    for i in ip_list:
       pool.apply_async(get_loc,(i.strip(),))
    pool.close()
    pool.join()
    format_loc()