获取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地址,于此同时,准备好抓包工具,以便对查询数据进行分析,此处,我开了2个抓包工具,一个是httpwatch网页抓包,一个是wireshark数据包分析。

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

 

看到绿色部分,采用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打开的字符和系统不符合,故无法显示汉字,

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

查看网页源代码

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

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

     将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地址就自动解析,此处不再写了。当然,这个用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 urllib,re, sys 
  10. def getip(ip= '114.114.114.114'): 
  11.     url  =  "http://ip.qq.com/cgi-bin/searchip" 
  12.     data =  "searchip1="+ip 
  13.  
  14.     html =  urllib.urlopen(url, data).read().decode("gb2312"
  15.     pat  =  re.compile(r'<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 urllib, re, simplejson 
  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' % ip 
  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'

效果如下图