精华内容
参与话题
问答
  • 1、下载库geoip2 ,代码为: pip install geoip2 2、下载离线地图库 GeoLite2-City.mmdb ,下载地址为: 官网地址 ... 选择你想用的数据库,进行下载。 3、代码部分: import geoip2.database ...print("IP

    1、下载库geoip2 ,代码为:

    pip install geoip2 
    

    2、下载离线地图库 GeoLite2-City.mmdb ,下载地址为:

    官网地址

    注册完成后,点击下载资料库进入下载界面:
    在这里插入图片描述
    选择你想用的数据库,进行下载。

    3、代码部分:

    import geoip2.database
    
    ip = input()
    
    reader = geoip2.database.Reader('./GeoLite2-City.mmdb')
    data = reader.city(ip)
    
    print("IP Address: ", ip)
    print("国家: ", data.country.names['zh-CN'])  # names['zh-CN']转换为中文
    print("省份: ", data.subdivisions.most_specific.names['zh-CN'])
    print("城市: ", data.city.names['zh-CN'])
    print("纬度: ", data.location.latitude)  # 位置
    print("经度: ", data.location.longitude)
    print("时区:",data.location.time_zone)
    

    #问题:
    我在测试武汉地区的IP时,发现定位显示的城市名字是洪山、江夏这种区的名字,不知道怎么才能改成显示武汉。求解答。

    展开全文
  • 由于离线查询ip需要全球IP的分布数据,所以我直接选择了一个免费离线查询ip的数据包, GeoLite2-City.mmdb MMDB即Maxmind DB,是一个设计用于存储IPv4和IPv6的数据信息的数据库,mmdb文件是一个二进制格式的文件,它...

    安装库和数据准备

    由于离线查询ip需要全球IP的分布数据,所以我直接选择了一个免费离线查询ip的数据包,
    GeoLite2-City.mmdb
    MMDB即Maxmind DB,是一个设计用于存储IPv4和IPv6的数据信息的数据库,mmdb文件是一个二进制格式的文件,它使用一个二分查找树加速IP信息的查询。

    格式说明

    {
        continent => {                    //大洲
            code        => string,        //大洲代码,如AS,可能为空
            names       => {              //大洲名称
                en      => string,        //大洲英文名称,如Asia,可能为空
                zh_CN   => string,        //大洲中文名称,如亚洲,可能为空
            },
        },
        country   => {                    //国家
            iso_code    => string,        //国家iso代码,如CN,可能为空
            names       => {              //国家名称
                en      => string,        //国家英文名称,如China,可能为空
                zh_CN   => string,        //国家中文名称,如中国,可能为空
            },
        },
        subdivisions => {                 //省份
            iso_code    => string,        //省iso代码省ISO代码,如44,可能为空
            names       => {              //省份名称
                en      => string,        //省份英文名称,如Guangdong,可能为空
                zh_CN   => string,        //省份中文名称,如广东,可能为空
            },
        },
        city      => {                    //城市
            id          => int,           //城市id,如440000,可能为空
            names       => {              //城市名称
                en      => string,        //城市英文名称,如Guangzhou,可能为空
                zh_CN   => string,        //城市中文名称,如广州,可能为空
            },
        },
        location  => {                    //地理位置
            latitude    => double,        //纬度,可能为空
            longitude   => double,        //经度,可能为空
            time_zone   => string,        //时区,可能为空
        },
        isp       => {                    //运营商
            id          => int,           //运营商id,可能为空
            names       => {              //运营商名称
                zh_CN   => string,        //运营商中文名称,如电信,可能为空
        },
    }
    

    为了读取这个包的数据需要安装一个模块:pip install geoip2
    为了布局窗口安装一个模块:pip install tkinter

    代码如下

    import tkinter
    import pygeoip,geoip2.database
    
    
    class FindLocation(object):
        def __init__(self):
            self.gi = geoip2.database.Reader("./GeoLite2-City.mmdb")
            # 创建主窗口,用于容纳其它组件
            self.root = tkinter.Tk()
            # 给主窗口设置标题内容
            self.root.title("全球定位ip位置(离线版)")
            # 创建一个输入框,并设置尺寸
            self.ip_input = tkinter.Entry(self.root, width=30)
    
            # 创建一个回显列表
            self.display_info = tkinter.Listbox(self.root, width=50)
    
            # 创建一个查询结果的按钮
            self.result_button = tkinter.Button(self.root, command=self.find_position, text="查询")
    
        # 完成布局
        def gui_arrang(self):
            self.ip_input.pack()
            self.display_info.pack()
            self.result_button.pack()
    
        # 根据ip查找地理位置
        def find_position(self):
            # 获取输入信息
            self.ip_addr = self.ip_input.get()
            aim = self.gi.city(self.ip_addr)
            # 为了避免非法值,导致程序崩溃,有兴趣可以用正则写一下具体的规则,我为了便于新手理解,减少代码量,就直接粗放的过滤了
            try:
    
                # 获取目标城市
                city = aim.city.name
                # 获取目标国家
                country = aim.country.name
                # 获取目标经度
                longitude = aim.location.longitude
                # 获取目标纬度
                latitude = aim.location.latitude
            except:
                pass
    
            # 创建临时列表
            the_ip_info = ["所在纬度:" + str(latitude), "所在经度:" + str(longitude), "所在城市:" + str(city), "所在国家或地区:" + str(country), "需要查询的ip:" + str(self.ip_addr)]
            # 清空回显列表可见部分,类似clear命令
            for item in range(10):
                self.display_info.insert(0, "")
    
            # 为回显列表赋值
            for item in the_ip_info:
                self.display_info.insert(0, item)
            # 这里的返回值,没啥用,就是为了好看
            return the_ip_info
    
    
    def main():
        # 初始化对象
        FL = FindLocation()
        # 进行布局
        FL.gui_arrang()
        # 主程序执行
        tkinter.mainloop()
        pass
        
    if __name__ == "__main__":
        main()
    

    效果如下

    将py文件转为.exe文件

    1. 安装pyinstaller

      pip install pyinstaller

    2. 将.py转换为.exe
      (1) 进入文件夹,运行cmd
      (2)pyinstaller -F -w localip.py
      -w表示运行.exe是弹出命令行窗口
      更改exe文件的图标
      自定义打包出来的exe文件图标,需要使用-i参数,同时需要准备一个ico格式的图片
      pyinstaller -F --icon=1234.ico localip.py
      1234.ico为当前路径下的图标文件,在其他位置需要加上路径
      (3)运行测试
      生成的.exe文件在dist文件夹内
      将数据库文件GeoLite2-City.mmdb拷贝到dist文件夹中
      运行可执行文件(.exe)
    展开全文
  • VC查询IP地理位置

    2013-06-13 20:01:43
    用VC实现解析纯真IP数据库,提供查询ip地理位置,并能反向查询地理位置所有的IP地址,支持多关键字查询. 如下: F:\>Getip.exe /c 北京 国际 61.135.152.0 -- 61.135.152.255 北京市海淀区 理想国际大厦新浪公司 61...
  • Wireshark配置显示IP地理位置信息

    千次阅读 2019-12-26 20:34:45
    通过配置wireshark显示出IP地址蕴含的地理位置等信息

    本章跟大家介绍一下wireshark中IP地理位置信息配置的方法和原理,作为我的专栏《wireshark从入门到精通》中的一篇。

    在Wireshark中实用的设置和使用技巧汇总那一章节最后,我提到可以配置wireshark查看IP的地理位置等信息,如图1:
    在这里插入图片描述
    图1
    针对图1提出以下三个问题:

    • 如何配置wireshark进行地理位置的显示?
    • 可以看到有的地址是可以显示IP的地理位置信息,例如64.233.189.139,这样的IP被称之为非保留的IP地址。有的地址不可以显示地理位置信息,例如192.168.0.114,这样的IP被称之为保留IP。两者有什么区别呢?
    • AS number又是什么?

    如何配置wireshark进行地理位置的显示

    选择Wireshark 编辑->首选项->Name Resolution,如图2:
    在这里插入图片描述
    图2中红框1部分我在前述已经说明,不在赘述。由于wireshark天然支持GeoIP这种IP数据库文件,只要在红框2的位置添加IP数据库的文件路径即可,其他类型的IP数据库格式并不支持。该种GeoIP数据库文件的官方下载地址,见这里,我在CSDN 也上传了一份较为早期的版本供下载验证,这里。由于早期版本IPV4和IPv6是分开的,因此有6个文件,最新的GeoLite2将两者合并只有三个文件。也通过下载CSV文件直观的查看IP地址和其地理位置信息的映射关系表。除了这三个免费的数据库之外,你会发现 MaxMind 公司网站上还提供了很多的数据库来记录非保留 IP 地址其他方面的信息,包括该 IP 是否是代理,该 IP 是否是匿名 VPN,该 IP 可能对应的域名等等更多方面的信息。但是这些数据库都是收费的,从中可以看出非保留 IP 之所以有这方面的信息是因为非保留 IP 地址通常作为一项服务具有连续性,比如该 IP 地址对应的域名在一两年之内不会发生变化。因此像 MaxMind 就收集了这方面的信息制作成库,同时提供操作的 API。值得注意的是,在数据从 HTTP 逐渐全面过度到 HTTPS 时代,IP 数据库作为分析加密数据一个重要的方面,会显得越来越重要。

    配置完成之后重启一下wireshark就能够解析IP地址的地理位置信息了,整体的配置还是非常的简单。接下来解释一下前面提到的一些基本概念。

    保留 IP 和非保留 IP

    IP 地址用于标示网络中的一台主机,可以分为A、B、C、D、E 这几个类别,区段划分如下:

    • A 类地址:1.0.0.0~126.255.255.255
    • B 类地址:128.0.0.0~191.255.255.255
    • C 类地址:192.0.0.0~223.255.255.255
    • D 类地址:224.0.0.0~224.255.255.255
    • E 类地址:255.0.0.0~255.255.255.255

    A、B、C 三类地址是比较是常见的,D、E 主要用于组播和广播以及研究用途。你会发现 0.0.0.0~0.255.255.255 以及 127.0.0.0~127.255.255.255 这些段的缺失,因为这两段的 IP 有着特殊的用途,均为保留的 IP 段。保留的 IP 段还有很多,像 192.168.1.1 这样的局域网 IP 也属于保留的 IP。因此从这个方面来看 IP 的划分还可以分类两类,即保留的 IP 和非保留的 IP。

    图 3 简单罗列一下IPV4中保留的 IP,摘自维基百科,这里
    enter image description here
    图3
    通过图 3 可以看出保留的 IP 有很多,A、B、C、E 四种类别都有涉及,那么这些 IP 地址在什么情况下使用呢?

    以局域网 为例,选择哪一段保留 IP 地址作为局域网的 ip 地址是跟该局域网内部所容纳设备数量相关的。例如我查看我自己4G手机 上网的 ip 地址就 172.25.81.205,为 B 类 IP 地址,172 这个网段所能容纳的 ip 地址数量为 1048576,手机的 IP 地址是由核心网进行分配的。对于一些小的基站以及核心网设备来说来说百万级别的 IP 应该是完全够用了,如果不够用也可以使用 10 网段的。大公司使用的 ip 地址往往为 10 网段, A 类 IP 地址,例如 10.33.188.106。对于数十万员工级别的公司,各种设备的 IP 很可能超过百万,而 10 网段所能够容纳的 IP 个数在 16777216,这就足够用了。多数学校机房配置的 ip 地址为 192.168.1.115这种形式,192.168 网段能够容纳的 ip 为 655365。而一个学校的机房通常在 10000 以内台,也是够用的。

    以下四点就是我总结的保留 IP 常见的一些作用:

    • 首先全球的 IPV4 地址有限也就 2^32 个,前一段时间IPV4已经正式耗尽。当年为了缓解 IP 地址紧张的问题,相应的解决方法有 IPV6 地址,以及 NAT 转换。但是由于早期 IPV6 并没有普及,主要是老的设备不支持 IPV6 协议栈。因此 NAT 转换是常见的技术手段。NAT 地址转换就是将 192.168.1.115 这样的保留 IP 地址转换为非保留的 IP,192.168.1.115 这样的地址也被称为私网 IP。因此我们看到保留 IP 的第一个作用就是缓解 IP地址资源紧张,不同的局域网可以同时使用同一个保留的 IP。而类似于这样的保留 IP 都是作为客户端的地址。通常来说服务器的 IP都是非保留的 IP,同一时间内,全球唯一的,因为服务器的数量相对于客户端来说还是很少的。当然也是有服务器使用 NAT 等技术的,使用了保留IP。
    • 类似于 255.255.255.255/32 这样的 IP 地址是有着特定的用途的,用于广播。我们知道局域网的广播地址是 MAC 为 ff:ff:ff:ff:ff:ff,在 IP 层的广播地址为 ff.ff.ff.ff。当然 D 类和 E 类的多数 IP地址主要被预留出来。
    • 像 127.0.0.0–127.255.255.255 地址段分配给了本机,通常我们的本地默认回环地址的 IP 就是 127.0.0.1,在本机上测试编写好的网站都是访 http://127.0.0.1:9600/ 这样的地址。通过浏览器访问 http://127.0.0.1:9600/,该流量并不会经过网卡。可以看出操作系统对于 127.0.0.1 这样的 IP数据报文的处理是比较特殊的。
    • 正如前面所提到的 IP 资源有限,同时 IP 地址也是收费的,每年使用者需要向 IP 分配机构缴纳一定的使用费用。因此 IP 数量越少,越节省,这也就是我们 4G 上网 IP 是保留的 IP,家中的宽带也是保留的 IP,学校公司网络多数使用的都是保留IP,只在广域网出口处使用 NAT 将其转换为全局的 IP。

    除了保留 IP,剩下的就是非保留 IP 了。由于保留 IP 同一时间内全球不唯一,因此无法根据保留 IP 定位出其经纬度。而对于非保留 IP 来说,通常也可以被称为公网 IP,由于一段时间内基本不会变化,因此可以统计其经纬度。

    AS Number

    从图 1 中可以看出,该数据库不仅呈现了经纬度,城市等信息,还呈现了 AS Number。AS number 的全称是 Autonomous System (AS) Numbers,也就是自治系统编号。那自治系统又是什么呢?互联网可以认为是由大大小小的自治系统来组成,以中国电信为例,所有的中国电信宽带用户就组成了一个自治系统,当然电信也可能由多个自治系统。同理中国移动和中国联通也有同样的自治系统,全世界的电信运营商,每一家都是一个自治系统。为了管理这些自治系统,需要给每一个自治系统进行统一的编号,那么相应的编号就是 AS number。

    那么由谁来负责这样的编号,世界上由一个组织叫做 IANA,它下面的下属机构几乎管理着互联网相关的一切。这就包括 AS number 的分配,IP 地址的分配等等。在这里可以知道,IANA 将 AS Number 先分配给区域的网络管理机构,由这些机构处理各属辖区的分配和申请工作,例如在这个页面上可以找到著名的电信 AS Number 4134 就是由 APNIC 这样一个亚洲的管理机构进行管理分配的。同时这个页面也给出了 AS Number 的作用,就是用于路由选择协议。

    举个例子来说,很多大型网游都有电信区,联通区域等,通常电信宽带用户会选择电信区,联通宽带用户会选择联通区,这样做的目的是相比交叉选择的情况网速会更快一些。原因在于游戏的电信区是游戏公司部署在电信自治系统的服务器,也就是其 IP 地址是电信的。当电信的宽带用户访问电信区时候,相当于电信这个自治系统内部的通信,而当联通的宽带用户访问电信区游戏服务器的时候,相当于数据在电信这个自治系统和联通这个自治系统之间进行通信。

    网络中通信的基础是 IP 地址,用来表示网络中的唯一一台主机,端口用以表示具体的应用程序。如果通信的层次上升到自治系统之间的话,如上述所描述,自治系统之间通信的基础就是这个 AS Number。当联通的宽带用户访问电信区时候,数据要从联通的自治系统中发出来,首先要找到电信自治系统,关键就是在于联通的边界路由器的路由表中存储了电信的 AS Number,就给数据下一步指明了方向。

    从这里我们可以看出不同自治系统之间需要边界路由器通过 AS Numbe 建立起连接,而自治系统内部通常不需要,所以速度上会有一定的差别。另外像三大运营商之间是竞争关系,用户的体验在于网速、时延,那么中国电信在转发数据报文的时候,肯定是优先电信自己内部的报文,对于联通的报文优先级肯定要靠后的。从这个角度来说,就不难明白为什么游戏要分区了。当然游戏的这个例子是用户主动区选择电信,联通或者移动。再举一个例子说明用户是如何被动选择的。

    对于百度这样的搜索引擎服务上,服务器都是几十万甚至上百万数量级的。为了让用户在速度上有更好的体验,肯定也是希望电信宽带用户访问百度部署在电信自治系统的服务器 IP 的,这个时候就需要 DNS 解析服务器判断请求的 IP 的 AS number,来决定 DNS 应该返回哪一个自治系统的 IP 了。因此可以看出百度在三大运营商的自治系统内都有服务器的部署。

    以上就是对于wireshark如何配置解析IP地址以及 IP 相关概念的一些概述,主要是讲述了保留 IP 和非保留 IP 概念,AS number 的概念,希望通过本文,对你有所启发。

    本文为CSDN村中少年原创文章,未经允许不得转载,博主链接这里。

    展开全文
  • IP地理位置查询系统

    2008-11-11 09:08:16
    IP地理位置查询系统 利用IP地址进行IP地理位置查询。
  • 使用hadoop实现IP归属地的统计,为分析用户的地区分布提供数据

        转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/40585565

        更多相关hadoop内容访问:http://blog.csdn.net/xiaojimanman/article/category/2640707 

        对于博客 http://blog.csdn.net/xiaojimanman/article/details/40372189 中的计算结果 key-value (ip,出现次数),统计下各个地区运营商下的IP个数,通过这个计算结果,可以分析出用户的地理位置分布情况,为决策提供数据支持。


    需求描述:

        根据IP归属地,对IP进行分组求和,将结果输出到文件中。


    数据格式:

        此次的数据格式相对比较简单,就是博客 http://blog.csdn.net/xiaojimanman/article/details/40372189 的结果数据,一行数据格式为:

    ip地址空格分隔符出现次数 例: 192.168.1.1 25


    需求分析:

         在实现mapreduce程序之前,需要考虑的一个问题就是IP地址和归属地之间的转换问题。我这里采用的是百度的阿拉丁接口,接口获取方法,在百度首页输入"IP",就会出现阿拉丁界面。如下图所示:


         通过对该部分的网络请求分析,获取地址 http://opendata.baidu.com/api.php?query=122.49.34.58&co=&resource_id=6006&t=1414563340538&ie=utf8&oe=gbk&format=json&tn=baidu&_=1414563341538 可以获取IP的归属地,该接口返回的数据格式如下图所示:


        可以通过HttpClient模拟浏览器访问该地址,分析返回结果,获取该IP地址对应的归属地。如果自己有IP库,这一步就会简单很多。


        IP个归属地中间的对应关系解决了,就需要设计mapreduce的实现问题。

        map的输入就是一行原始记录,首先需要对记录进行拆分,取得IP地址,在通过上面提到的接口,查询该IP的归属地;map的输出结果是key为IP归属地,value为出现次数,一行记录就是1 。输出结果如下图所示:



        reduce就需要对同一个key下的记录求和即可,输出结果是key为IP归属地,value为出现次数,如下图所示:



        这一篇博客在mapreduce方面和上两篇没有太大的区别,所以这里也不再详细的阐述了,这一篇主要的目的就是在mapreduce程序中使用第三方的接口。需求分析就到此为止,下面就看具体的代码实现。


    代码实现:

        ip归属地查询代码

    /**
     * @Description: ip归属地查询
     */
    package com.lulei.crawl.ip;
    
    import java.io.IOException;
    import java.util.Date;
    import java.util.HashMap;
    
    import org.apache.commons.httpclient.HttpException;
    
    import com.lulei.crawl.CrawlBase;
    import com.lulei.util.DoRegex;
    
    /**
     * @author lulei
     * 这里继承了自己的封装类,在类CrawlBase中实现了网络数据的获取,并将网页源代码存储在pageSourceCode中
     */
    public class IPInfo extends CrawlBase{
    	private String ip;
    	private String location;
    	//第三方接口地址
    	private static String ipUrl = "http://opendata.baidu.com/api.php?query=%ip%&co=&resource_id=6006&t=%t1%&ie=utf8&oe=gbk&format=json&tn=baidu&_=%t2%";
    	private static long timeDifference = 1000L;
    	private static HashMap<String, String> params;
    	private static String locationRegex = "\"location\":\"(.*?)\"";
    	
    	//伪装浏览器
    	static {
    		params = new HashMap<String, String>();
    		params.put("Referer", "http://www.baidu.com");
    		params.put("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36");
    	}
    	
    	public IPInfo(String ip) throws HttpException, IOException {
    		long t1 = new Date().getTime();
    		long t2 = t1 + timeDifference;
    		this.ip = ip;
    		//组装请求地址
    		String url = ipUrl.replaceAll("%ip%", ip)
    									 .replaceAll("%t1%", t1 + "")
    									 .replaceAll("%t2%", t2 + "");
    		//获取网页源代码,具体的实现,这里就不详细的介绍,自己可以写简单的HttpClient实现此功能 
    		readPageByGet(url, "utf-8", params);
    		//解析源代码,获取归属地
    		setLocation();
    	}
    	
    	/**
    	 * @author lulei
    	 * 解析源代码,获取归属地
    	 */
    	private void setLocation() {
    		this.location = DoRegex.getFirstString(getPageSourceCode(), locationRegex, 1);
    	}
    	
    	public String getIp() {
    		return ip;
    	}
    	public String getLocation() {
    		return location;
    	}
    
    	/**
    	 * @param args
    	 * @throws IOException 
    	 * @throws HttpException 
    	 */
    	public static void main(String[] args) throws HttpException, IOException {
    		// TODO Auto-generated method stub
    		String ip = "122.49.34.58";
    		IPInfo ipinfo = new IPInfo(ip);
    		System.out.println("ip:" +ip );
    		System.out.println("归属地:" + ipinfo.getLocation());
    	}
    }
    

        对一行记录的分析类

     /**  
     *@Description: 一行记录分析
     */ 
    package com.mapreduce.log;  
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    
    import com.lulei.crawl.ip.IPInfo;
      
      
    public class LogLine {
    	private String ip;
    	private String location;
    	private boolean right = true;
    	private IntWritable one = new IntWritable(1);
    	
    	public LogLine(String textLine) {
    		//检验一行日志数据是否符合要求,如不符合,将其标识为不可用
    		if (textLine == null || "".equals(textLine)) {
    			this.right = false;
    			return;
    		}
    		String []strs = textLine.split(" ");
    		if (strs.length < 2) {
    			this.right = false;
    			return;
    		}
    		//ip地址在第一个位置
    		this.ip = strs[0];
    		setLocation();
    	}
    	
    	private void setLocation() {
    		try {
    			IPInfo ipInfo = new IPInfo(this.ip);
    			this.location = ipInfo.getLocation();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block  
    			e.printStackTrace();
    			//如果出现网络错误,将此IP的归属地设置成“未知”
    			this.location = "未知";
    		} 
    	}
    
    	/**
    	 * @return
    	 * @Author:lulei  
    	 * @Description: map输出key
    	 */
    	public Text getMapKey() {
    		return new Text(this.location);
    	}
    	
    	/**
    	 * @return
    	 * @Author:lulei  
    	 * @Description: map输出value
    	 */
    	public IntWritable getMapValue() {
    		return this.one;
    	}
    
    	public boolean isRight() {
    		return right;
    	}
    	
    }
    

        mapreduce程序实现类

     /**  
     *@Description: IP归属地统计mapreduce实现   
     */ 
    package com.mapreduce.log;  
    
    import java.io.IOException;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.conf.Configured;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.Mapper;
    import org.apache.hadoop.mapreduce.Reducer;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
    import org.apache.hadoop.util.Tool;
    import org.apache.hadoop.util.ToolRunner;
    
    public class IPLocationMapReduce extends Configured implements Tool{
    
    	/**
    	 *@Description: IP归属地统计map 
    	 *@Author:lulei  
    	 *@Version:1.1.0
    	 */
    	public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
    
    		@Override
    		protected void map(LongWritable key, Text value, Context context)
    				throws IOException, InterruptedException {
    			LogLine logLine = new LogLine(value.toString());
    			if (logLine.isRight()) {
    				context.write(logLine.getMapKey(), logLine.getMapValue());
    			}
    		}
    		
    	}
    	
    	/**
    	 *@Description: IP归属地统计reduce
    	 *@Author:lulei  
    	 *@Version:1.1.0
    	 */
    	public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
    
    		@Override
    		protected void reduce(Text key, Iterable<IntWritable> values, Context context)
    				throws IOException, InterruptedException {
    			int sum = 0;
    			//对values进行求和操作
    			for (IntWritable value : values) {
    				sum += value.get();
    			}
    			context.write(key, new IntWritable(sum));
    		}
    		
    	}
    
    	@Override
    	public int run(String[] arg0) throws Exception {
    		Configuration conf = new Configuration();
    		@SuppressWarnings("deprecation")
    		Job job = new Job(conf);
    		job.setJobName("ipcount");
    		job.setInputFormatClass(TextInputFormat.class);
    		
    		//将输出设置为TextOutputFormat
    		job.setOutputFormatClass(TextOutputFormat.class);
    		job.setOutputKeyClass(Text.class);
    		job.setOutputValueClass(IntWritable.class);
    		
    		//Mapper Combiner Reducer
    		job.setMapperClass(Map.class);
    		job.setCombinerClass(Reduce.class);
    		job.setReducerClass(Reduce.class);
    		
    		//输入 输出路径
    		FileInputFormat.addInputPath(job, new Path(arg0[0]));
    		FileOutputFormat.setOutputPath(job, new Path(arg0[1]));
    		
    		job.waitForCompletion(true);
    		
    		return job.isSuccessful() ? 0 : 1;
    	}
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub 
    		//这里没有对输入的参数做验证
    		try {
    			int res = ToolRunner.run(new Configuration(), new IPLocationMapReduce(), args);
    			System.exit(res);
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    

    上传运行:

        打包、上传、运行这些步骤这里就不再详细介绍,具体可以参照博客 http://blog.csdn.net/xiaojimanman/article/details/40184581 最后一部分。

        对于自己写的数据的输出结果如下图所示:


         到此一个完整的mapreduce程序就完成了,关于hadoop的学习,自己还将继续~


    展开全文
  • php自定义函数通过淘宝IP接口获取IP地理位置
  • 利用IP得到地理位置信息 在现在这样的信息化社会,人们在访问互联网时总会留下痕迹。其中最多的就是IP数据 怎么样来利用IP数据来分析用户数据呢?其中最好挖掘的肯定非地理位置信息莫属了 地理位置信息有很多用途,...
  • 易语言IP地理位置查询模块源码系统结构:初始化,地理位置查询,GetLong,GetLong3,GetString,GetArea,Ord,ip2long,long2ip,销毁, ======程序集1 || ||------_启动子程序 || ||------_临时子程序 || || ======地理位置
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 结合易语言彗星HTTP应用模块,读取网页源码取本机ip地理位置。.版本 2 .程序集 窗口程序集1 .子程序 _按钮2_被单击 .局部变量 address, 文本型 .局部变量 ip, 文本型 ip = 彗星HTTP读文本 ...
  • 易语言显ip地理位置源码系统结构:取文本中间内容, ======窗口程序集1 || ||------_按钮2_被单击 || ||------取文本中间内容
  • IP地址及域名IP地理位置查询工具 (PHP版) V1.0 目录: 1、demo.html -------- 为测试外部调用功能演示页; 2、ip.php -------- ip地址查询页; 3、ip_js.php -------- 外部调用程序页面; 4、qqwry.php ---...
  • 最新世界 IPV4 持有者 与 地理位置地址对应库
  • 1、搜索IP地址的地理位置; 2、查询域名所绑定主机的IP地址详细信息; 3、外部调用功能; 目录: 1、demo.html -------- 为测试外部调用功能演示页; 2、ip.php -------- ip地址查询页; 3、ip_js.php --...
  • ip地理位置查找

    2012-01-06 09:21:55
    function postionFind($ip)  {  $ch = curl_init();  $url = "http://www.ip138.com/ips.asp?ip=$ip&action=2";  curl_setopt($ch, CURLOPT_URL, $url);  curl_setopt($ch, CUR
  • IP地理位置API

    2020-07-01 03:34:44
    IP地理位置API 检测来自用户的地理位置信息可为您提供巨大的优势:改进的转换,更好的细分和分析,以及提供更多相关的内容。 有许多付费服务可以提供地理位置信息,但是它们往往成本太高或缺乏有价值的信息。 IP ...
  • vbs ip查询小偷,可以获得ip地理位置的代码
  • IP地理位置查询模块.rar
  • 在论坛中闲逛,无意中发现腾讯的ip接口。还是挺有意思的。大家可以利用下,这个IP接口所查询到的还是比较准确,我发给几个朋友测试了一下都是正确的,毕竟是腾讯的东西。
  • 一个Html静态页面查IP地理位置,ajax~~~~~~~~~
  • 高德获取ip地理位置

    千次阅读 2017-08-08 11:52:39
    /** * 获取IP的实际地理位置 * 传入一个对象,并且对象里有ip元素 */ protected function getLocation($lists) { // 高德key $gdKey = [ 'sdfssdfdsfsdfsdfsdfsdfsdfsdfsdfs',
  • ASP利用IP138获IP地理位置

    千次阅读 2013-10-20 20:29:43
    可直接调用IP138数据来获取IP位置,可扩展使用淘宝地址库等数据进行应用 Function getipweizhi(ipstr) dim url,html,dlwz urlstr="http://www.ip138.com/ips1388.asp?ip="& ipstr &"&action=2"  '要获取的网页...

空空如也

1 2 3 4 5 ... 20
收藏数 1,948
精华内容 779
关键字:

ip地理位置