获取ip地址解析归属地

 




  1. 版本V1.0 
  2. 时间2013-04-29 
  3. 版权GPL 
  4. 作者itnihao 
  5. 邮箱 itnihao@qq.com 
  6. 博客 http://itnihao.blog.51cto.com 
  7. 如需重新发行,请注明以上信息,谢谢合作 

本文目的:

     通过分析ip地址归属地解析过程,分享探究问题的基本步骤,逐步认识基础知识的重要。

声明一下:

     基于本人知识视野,个人理解能力的限制,文中难免有不当之处,敬请理解。

 

    大家都知道,网上有很多可以查询ip地址归属地的网站,ip138,淘宝,qq等各大网站都提供这种查询,下面以QQ为例,来探究一下如何通过命令行来查询获取归属地的问题。

http://ip.qq.com/cgi-bin/index 打开网站,输入要查询的ip

IP归属地怎么实现的java ip地址归属地数据库_python

    输入要查询的ip地址,于此同时,准备好抓包工具,以便对查询数据进行分析,此处,我开了2个抓包工具,一个是httpwatch网页抓包,一个是wireshark数据包分析。

IP归属地怎么实现的java ip地址归属地数据库_ip地址_02

    通过分析数据包,可以看到如下信息

IP归属地怎么实现的java ip地址归属地数据库_php_03

 

IP归属地怎么实现的java ip地址归属地数据库_IP归属地怎么实现的java_04

看到绿色部分,采用post提交数据,提交的内容为searchip1=114.114.114.114

OK,此处已经找出规律了,查询采用post提交叫,内容为searchip1=X.X.X.X

那么,可以采用curl进行浏览器模拟提交数据了,命令格式如下

curl  URL  -d  "post提交内容"  -e  "refer地址"  -A "浏览器标识"




  1. #!/bin/bash
  2.  
  3. IP=114.114.114.114
  4. curl http://ip.qq.com/cgi-bin/searchip -d "searchip1=$IP" -e "http://ip.qq.com/cgi-bin/index" -A "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; QQDownload 718; .NET CLR 2.0.50727)"

     说明:由于curl打开的字符和系统不符合,故无法显示汉字,

IP归属地怎么实现的java ip地址归属地数据库_IP归属地怎么实现的java_05

可以将结果保存为html,通过浏览器打开,将会看到解析的地址结果。

IP归属地怎么实现的java ip地址归属地数据库_IP归属地怎么实现的java_06

查看网页源代码

IP归属地怎么实现的java ip地址归属地数据库_html_07

     到这里,已经替代了浏览器直接访问,初步取得成果。

     事情并未到此结束,下面继续解决字符编码问题

     将gh2312字符转换为Utf-8标准字符,借助系统iconv转换




  1. iconv  -f gb2312 -t utf-8 

 

  1. 因此命令变为
  2. #!/bin/bash 
  3.  
  4. IP=114.114.114.114 
  5. curl http://ip.qq.com/cgi-bin/searchip -d "searchip1=$IP" -e "http://ip.qq.com/cgi-bin/index" -A "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; QQDownload 718; .NET CLR 2.0.50727)" | iconv  -f gb2312 -t utf-8| grep "<p>.*"|sed "s/<p>\(.*\).*<span>\(.*\)&nbsp;\(.*\)<\/span><\/p>/\1\2\3/g"

 

运行结果如下

IP归属地怎么实现的java ip地址归属地数据库_html_08

    需求基本搞定,然后是细节完善,写成一个脚本,可以接参数ip地址就自动解析,此处不再写了。当然,这个用python写也许会更好。

   这里提供的仅仅是一种思路,解决问题的思路,而解决问题之前,需要具备一定的基础知识

这里需要的知识:




  1. 1.能用抓包工具进行抓包,并进行数据包分析 
  2. 2.熟悉curl命令 
  3. 3.熟悉sed,grep等命令进行文本过滤 
  4. 4.其他知识整合能力 

完毕,谢谢阅读!

      祝大家五一节快乐!

附录一个ip地址归属地解析的python版

 




  1. #!/usr/bin/env python
  2. # coding=utf8
  3. # Filename: monitor_idc.py
  4. # Last modified: 2013-04-23 16:54
  5. # Author: itnihao
  6. # Mail: itnihao@qq.com
  7. # Description:
  8.  
  9. import
  10. def getip(ip= '114.114.114.114'): 
  11. "http://ip.qq.com/cgi-bin/searchip"
  12. "searchip1="+ip 
  13.  
  14. "gb2312") 
  15. '<span>(.*)</span></p>') 
  16.     result= re.findall(pat, html) 
  17. print ip +": " +  result[0].encode("utf-8").replace('&nbsp;', '') 
  18. #getip('8.8.8.8') 
  19. getip()
  20.  



  1. taobao版本
  2. #!/usr/bin/env python
  3. # coding=utf8
  4. # Filename: get_out_ip.py
  5. # Last modified: 2013-04-28 17:02
  6. # Author: itnihao
  7. # Mail: itnihao@qq.com
  8. # Description:
  9.  
  10. import
  11.  
  12. #获取出口ip地址
  13. html=  urllib.urlopen('http://ip.qq.com').read() 
  14. pat =  re.compile('red">([0-9]+.[0-9]+.[0-9]+.[0-9]+)</span>') 
  15. ip  = re.findall(pat, html) 
  16.  
  17. ip =  ip[0] 
  18. #获取ip地址归属地解析
  19. url  =   'http://ip.taobao.com/service/getIpInfo.php?ip=%s'
  20. f  =  urllib.urlopen(url).read() 
  21. s=  simplejson.loads(f) 
  22.  
  23. print ip+": "+s['data']['country']+s['data']['area']+s['data']['region']+s['data']['city']+s['data']['isp'] 

效果如下图

IP归属地怎么实现的java ip地址归属地数据库_html_09

 


转载于:https://blog.51cto.com/itnihao/1189770