本文共 2646 字,大约阅读时间需要 8 分钟。
获取ip地址解析归属地
- 版本V1.0
- 时间2013-04-29
- 版权GPL
- 作者itnihao
- 邮箱 itnihao@qq.com
- 博客 http://itnihao.blog.51cto.com
- 如需重新发行,请注明以上信息,谢谢合作
本文目的:
通过分析ip地址归属地解析过程,分享探究问题的基本步骤,逐步认识基础知识的重要。
声明一下:
基于本人知识视野,个人理解能力的限制,文中难免有不当之处,敬请理解。
大家都知道,网上有很多可以查询ip地址归属地的网站,ip138,淘宝,qq等各大网站都提供这种查询,下面以QQ为例,来探究一下如何通过命令行来查询获取归属地的问题。
打开网站,输入要查询的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 "浏览器标识"
-
-
- IP=114.114.114.114
- 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转换
- iconv -f gb2312 -t utf-8
- 因此命令变为
-
-
- IP=114.114.114.114
- 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>\(.*\) \(.*\)<\/span><\/p>/\1\2\3/g"
运行结果如下
需求基本搞定,然后是细节完善,写成一个脚本,可以接参数ip地址就自动解析,此处不再写了。当然,这个用python写也许会更好。
这里提供的仅仅是一种思路,解决问题的思路,而解决问题之前,需要具备一定的基础知识
这里需要的知识:
- 1.能用抓包工具进行抓包,并进行数据包分析
- 2.熟悉curl命令
- 3.熟悉sed,grep等命令进行文本过滤
- 4.其他知识整合能力
完毕,谢谢阅读!
祝大家五一节快乐!
附录一个ip地址归属地解析的python版
-
-
-
-
-
-
-
-
- import urllib,re, sys
- def getip(ip= '114.114.114.114'):
- url = "http://ip.qq.com/cgi-bin/searchip"
- data = "searchip1="+ip
-
- html = urllib.urlopen(url, data).read().decode("gb2312")
- pat = re.compile(r'<span>(.*)</span></p>')
- result= re.findall(pat, html)
- print ip +": " + result[0].encode("utf-8").replace(' ', '')
- #getip('8.8.8.8')
- getip()
-
- taobao版本
-
-
-
-
-
-
-
-
- import urllib, re, simplejson
-
-
- html= urllib.urlopen('http://ip.qq.com').read()
- pat = re.compile('red">([0-9]+.[0-9]+.[0-9]+.[0-9]+)</span>')
- ip = re.findall(pat, html)
-
- ip = ip[0]
-
- url = 'http://ip.taobao.com/service/getIpInfo.php?ip=%s' % ip
- f = urllib.urlopen(url).read()
- s= simplejson.loads(f)
-
- print ip+": "+s['data']['country']+s['data']['area']+s['data']['region']+s['data']['city']+s['data']['isp']
效果如下图
转载地址:http://ewedx.baihongyu.com/