分析攻击IP来源地并画出饼图

本文介绍了一个使用Python编写的工具,该工具能够批量获取IP地址的地理位置信息,并利用Plotly生成国家、地区及城市的分布饼图。

此文中的API将台湾列为国家,非本人立场,台湾属于中国,台湾岛生活的人不一定!
上码:

#!/usr/bin/python
#coding=utf-8

'''
http://ip-api.com/json/ip
'''


import plotly  
import plotly.plotly  
import plotly.graph_objs as abcc  
import plotly.plotly  

class Piecharts:  
    def __init__(self):  
        print "饼图生成中"  

    def makePiecharts(self,labels,values,filename):  
        trace = abcc.Pie(labels = labels,values= values)  
        plotly.offline.plot([trace],filename=filename) 


import requests
import sys

try:
    iplist = sys.argv[1]
except:
    print "IP list not given or some other error!"
countrylist = {}
regionlist = {}
citylist = {}

with open(iplist) as f:
    for ip in f.readlines():
        if ip.strip() != '':
            url = 'http://ip-api.com/json/' + ip.strip()
            try:
                result = requests.get(url)
                jsontext = result.json()
            except:
                print "Error: Data not retrieved!"
                continue
            status = jsontext['status']
            if status == 'fail':
                print "%s failed!" % ip.strip()
                continue
            mline = jsontext['as']
            city = jsontext['city']
            country = jsontext['country']
            countryCode = jsontext['countryCode']
            isp = jsontext['isp']
            lat = jsontext['lat']
            lon = jsontext['lon']
            org = jsontext['org']
            query = jsontext['query']
            region = jsontext['region']
            regionName = jsontext['regionName']
            timezone = jsontext['timezone']
            zipcode = jsontext['zip']

            if not country in countrylist:
                countrylist[country] = 0
            else:
                countrylist[country] += 1

            if not regionName in regionlist:
                regionlist[regionName] = 0
            else:
                regionlist[regionName] += 1

            if not city in citylist:
                citylist[city] = 0
            else:
                citylist[city] += 1
            try:
                print ip.strip() + '--' + country + '--' + regionName
            except:
                print "Special character!"
    print countrylist

    #country
    labels = [i for i in countrylist]  
    value = [countrylist[i] for i in countrylist]  
    drive = Piecharts()  
    drive.makePiecharts(labels,value,"country.html")  

    #region
    labels = [i for i in regionlist]  
    value = [regionlist[i] for i in regionlist]  
    drive = Piecharts()  
    drive.makePiecharts(labels,value,"region.html") 

    #city
    labels = [i for i in citylist]  
    value = [citylist[i] for i in citylist]  
    drive = Piecharts()  
    drive.makePiecharts(labels,value,"city.html") 

gevent协程并发版

#!/usr/bin/python
# coding=utf-8

'''
http://ip-api.com/json/ip
'''


import plotly
import plotly.graph_objs as abcc
import plotly.plotly


class Piecharts:
    def __init__(self):
        print u'饼图生成中'

    def makePiecharts(self, labels, values, filename):
        trace = abcc.Pie(labels=labels, values=values)
        plotly.offline.plot([trace], filename=filename)


import requests
import sys

try:
    iplist = sys.argv[1]
except:
    print "IP list not given or some other error!"
countrylist = {}
regionlist = {}
citylist = {}


def locater(url):
    try:
        result = requests.get(url)
        jsontext = result.json()
    except:
        print "Error: Data not retrieved!"
        return
    status = jsontext['status']
    if status == 'fail':
        print "%s failed!" % ip.strip()
        return
    mline = jsontext['as']
    city = jsontext['city']
    country = jsontext['country']
    countryCode = jsontext['countryCode']
    isp = jsontext['isp']
    lat = jsontext['lat']
    lon = jsontext['lon']
    org = jsontext['org']
    query = jsontext['query']
    region = jsontext['region']
    regionName = jsontext['regionName']
    timezone = jsontext['timezone']
    zipcode = jsontext['zip']

    if not country in countrylist:
        countrylist[country] = 0
    else:
        countrylist[country] += 1

    if not regionName in regionlist:
        regionlist[regionName] = 0
    else:
        regionlist[regionName] += 1

    if not city in citylist:
        citylist[city] = 0
    else:
        citylist[city] += 1
    try:
        print ip.strip() + '--' + country + '--' + regionName
    except:
        print "Special character!"


from gevent import monkey
monkey.patch_socket()
from gevent import pool
import gevent

pool = pool.Pool(40)
glist = []
with open(iplist) as f:
    for ip in f.readlines():
        if ip.strip() != '':
            url = 'http://ip-api.com/json/' + ip.strip()
            glist.append(pool.spawn(locater, url))
    gevent.joinall(glist)

    # country
    labels = [i for i in countrylist]
    value = [countrylist[i] for i in countrylist]
    drive = Piecharts()
    drive.makePiecharts(labels, value, "country.html")

    # region
    labels = [i for i in regionlist]
    value = [regionlist[i] for i in regionlist]
    drive = Piecharts()
    drive.makePiecharts(labels, value, "region.html")

    # city
    labels = [i for i in citylist]
    value = [citylist[i] for i in citylist]
    drive = Piecharts()
    drive.makePiecharts(labels, value, "city.html")

饼图效果:
这里写图片描述

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值