获得ip地理信息的几种方法【最全】

简介: 第一种是利用纯真ip数据库,这个可以在网上找到很多,缺点是更新有点慢。 第二种是利用门户网站的接口 目前已知的有腾讯、新浪、网易、搜狐和Google提供IP地址查询API,但是找得到的只有腾讯、新浪和网易的,Google的貌似要用Google Maps所以没有研究。
第一种是利用纯真ip数据库,这个可以在网上找到很多,缺点是更新有点慢。

第二种是利用门户网站的接口

目前已知的有腾讯、新浪、网易、搜狐和Google提供IP地址查询API,但是找得到的只有腾讯、新浪和网易的,Google的貌似要用Google Maps所以没有研究。看了下国内的几个腾讯提供的是JavaScript的,网易提供的是XML,而新浪的有多种格式可以用,注意非XML的数据源都是GBK格式的,不管是JavaScript调用还是PHP调用都要转换一下编码,不然得到的是乱码。而更需要注意的是,如果一次性查询多个IP,使用门户网站的API来查询会非常缓慢,我大概写了个for循环试了下,不管是用PHP解析XML还是file_get_contents()函数获取内容,查询10次以上会变得非常缓慢,甚至可能超时。

腾讯的IP地址API接口地址:http://fw.qq.com/ipaddress,返回的是数据格式为:var IPData = new Array("123.124.2.85","","北京市","");,一个JavaScript的对象,目前还不知道如何输入IP查询。

新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js

新浪多地域测试方法:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=123.124.2.85

网易有道的IP地址查询接口:http://www.youdao.com/smartresult-xml/search.s?type=ip&q=123.124.2.85

使用JS代码进行调取腾讯的api接口
查看源代码打印帮
<script language="javascript" type="text/javascript" src="http://fw.qq.com/ipaddress"></script>
<script>document.write("你的IP是:"+IPData[0]+",来自:"+IPData[2]);</script>
//腾讯API的PHP调用方法
function getIpPlace(){
 $ip=file_get_contents("http://fw.qq.com/ipaddress");
 $ip=str_replace('"',' ',$ip);
 $ip2=explode("(",$ip);
 $a=substr($ip2[1],0,-2);
 $b=explode(",",$a);
 return $b;
}
$ip=getIpPlace();
print_r($ip);
//调用查询接口需要抓取网页,有三种方法,第一种是curl,第二种是
//file_get_contents,第三种fopen->fread->fclose,推荐第二种方法

/*
 *根据腾讯IP分享计划的地址获取IP所在地,比较精确
 */
function getIPLoc($queryIP){
$url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP;
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_ENCODING ,'gb2312');
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回
$result = curl_exec($ch);
$result = mb_convert_encoding($result, "utf-8", "gb2312"); // 编码转换,否则乱码
   curl_close($ch);
preg_match("@<span>(.*)</span></p>@iU",$result,$ipArray);
$loc = $ipArray[1];
return $loc;
}




//根据腾讯接口查询ip地址,使用file_get_contents抓去网页
function getIPLoc($queryIP){
$url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP;
$result = file_get_contents($url); 
$result = mb_convert_encoding($result, "utf-8", "gb2312"); // 编码转换,否则乱码
preg_match("@<span>(.*)</span></p>@iU",$result,$ipArray);
$loc = $ipArray[1];
return $loc;
}
//根据腾讯接口查询ip地址,使用fopen->fread->fclose抓去网页
function getIPLoc($queryIP){
$url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP;
$handle = fopen ("$url", "rb"); 
$result = ""; 
do { 
   $data = fread($handle, 1024); 
   if (strlen($data) == 0) { 
   break; 
   } 
   $result .= $data; 
} while(true); 
$result = mb_convert_encoding($result, "utf-8", "gb2312"); // 编码转换,否则乱码
preg_match("@<span>(.*)</span></p>@iU",$result,$ipArray);
$loc = $ipArray[1];
return $loc;
}



/********注:
1.使用file_get_contents和fopen必须空间开启allow_url_fopen。方法:编辑php.ini,设置allow_url_fopen = On,allow_url_fopen关闭时fopen和file_get_contents都不能打开远程文件。
2.使用curl必须空间开启curl。方法:windows下修改php.ini,将extension=php_curl.dll前面的分号去掉,而 且需要拷贝ssleay32.dll和libeay32.dll到C:\WINDOWS\system32下;Linux下要安装curl扩展*****/
//新浪查询ip接口  第五个第六个是地理信息
function getiploc($IP_ip){
$IP_str = @file_get_contents('http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip='.$IP_ip); 
        if(!empty($IP_str)){    
            $IP_tmp = explode("    ", $IP_str);
            $IP_city = iconv("GBK", "UTF-8", $IP_tmp[5]);
return  $IP_city;
}


  
//有道API的PHP调用方法
$url = "http:www.youdao.com/smartresult-xml/search.s?type=ip&q=".$ip;
$doc = new DOMDocument();
   $doc->load($url);
   $smartresult = $doc->getElementsByTagName("product");
   foreach($smartresult as $product)
   {
      $locations = $product->getElementsByTagName("location");
      $location = $locations->item(0)->nodeValue;
   }
   if($location != "")
   {
       echo $i.".".$ip;
       echo "  来自".$location."的网友";
   }
   else
   {
       echo $i.".".$ip;
       echo "  来自火星的网友";
   }
public function sinaIPApi($ip){
   $str = file_get_contents("http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip=".$ip);
   $str = iconv("gbk", "utf-8//IGNORE", $str);
   preg_match_all("/[\x{4e00}-\x{9fa5}]+/u",$str,$get);
   $add = implode('',$get[0]);
   return $add;
}
//$get是一个非常棒的二维数组

其中有道和新浪的是我自己写的,新浪API也可以像腾讯API那样用file_get_contents()函数获取完地址后使用一连串的字符串函数处理,我写的函数使用正则表达式从新浪的返回结果中提供包含中文的字符串,并且分段存入一个二维数组,这个可能只是针对新浪的API有用并且存在bug。举个例子查询学校分配给我的IP地址后var_dump()一下函数里面的$get变量得到以下结果: array(1) { [0]=> array(6) { [0]=> string(6) "中国" [1]=> string(6) "北京" [2]=> string(6) "北京" [3]=> string(9) "教育网" [4]=> string(6) "学校" [5]=> string(18) "中国地质大学" } },而函数输出的结果则是“中国北京北京教育网学校中国地质大学”,希望我的思路和方法能对别人有用。

最后再次提醒,如果是WordPress请使用第一种方法,否则使用API同时查询所有留言者的真实地址会让PHP超时的,希望各路大牛有更好的方法,至于限制显示和显示方式等神马的都是WordPress应用问题,同时对于Java和C#来说思路也是一样的,这些后续的问题等我考完试再细说。

目录
相关文章
|
算法 JavaScript Java
使用强大的离线IP地址定位库ip2region获取城市信息
ip2region - 准确率99.9%的离线IP地址定位库,0.0x毫秒级查询,ip2region.db数据库只有数MB,提供了java、php、c、python、nodejs、golang、c#等查询绑定和Binary,B树,内存三种查询算法。
使用强大的离线IP地址定位库ip2region获取城市信息
Java 通过IP获取对应的国家省份城市经纬度(离线文件方案)
一. 除了调用接口查询城市, 还可以通过离线文件查询城市, 使用GeoLite2 City库 二. 离线库下载地址: https://dev.maxmind.com/geoip/geoip2/geolite2/ 点击如下位置下载压缩文件 文件解压后有一个文件名为GeoLite2-City.
|
5月前
|
搜索推荐 数据挖掘 定位技术
IP地址在市场数据分析中的帮助
IP地址在市场分析中扮演关键角色:定位用户地理位置以优化广告与销售策略;追踪用户行为以提升体验和个性化营销;识别欺诈行为,保障网络安全;分配网络资源,改善服务效率;辅助深入市场调研。同时,企业须确保数据隐私与合规性。
|
2月前
|
定位技术
获取本地IP以及地理位置
获取本地IP以及地理位置
|
3月前
|
Rust 监控 算法
基于circom、snarkjs实现零知识证明不透漏具体地理位置的区域监控
文章介绍了如何使用circom和snarkjs工具基于零知识证明算法Groth16实现不泄露具体地理位置的区域监控系统,详细说明了开发环境搭建、电路设计、计算和证明过程,并提供了相应的命令和代码示例。
42 0
|
6月前
|
数据采集 缓存 监控
通过动态IP解决网络数据采集问题
通过动态IP解决网络数据采集问题
109 1
|
JSON 定位技术 数据格式
GeoJSON区县级地理数据信息拼接使用说明
GeoJSON区县级地理数据信息拼接使用说明
642 0
|
6月前
住宅ip在数据抓取的时候起到了什么作用?
随着科技的进步和互联网的发展,越来越多的企业在业务上都需要用到代理,那么住宅ip在数据抓取的时候起到了什么作用?那么小编接下来就跟大家介绍一下
53 0
住宅ip在数据抓取的时候起到了什么作用?
|
Java 定位技术 数据库
通过ip获取地理位置信息
通过ip获取地理位置信息
602 0
|
数据安全/隐私保护
使用易路代理yiluproxy时,出现不是自己选定的城市该怎么办?
使用易路代理yiluproxy时,出现不是自己选定的城市该怎么办?