注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

笑遍世界@网易博客

明天还会在路上……

 
 
 

日志

 
 
关于我

Stay hungry, stay foolish. 工作用脑,生活用心! 走过山重水复,必然迎来柳暗花明! 受苦的人没有悲观的权利,远征的人没有流泪的资格。 Live each day as if we should die tomorrow.

网易考拉推荐
 
 

Python获取本地的IP和所在地  

2011-08-16 00:05:05|  分类: 编程技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
前言:今天有人问我说怎样模拟国外用户浏览网站,其实就是模拟IP。我说用代理是可以容易实现的。凡是遇到国内互联网做国际化时,可能都需要做到这样的测试,看看海外同胞访问我们网站是什么样子。想当年在阿里巴巴国际网站时,我们也是需要模拟这样的,不过当时我对这个需求不强,所以也没刻意去实现。用个SSH代理啥的,浏览器设置一下,是可以好做的,记得以前写过一篇文章,见:免费使用Amazon EC2实现更通畅的互联网访问

正文:由于前言中的故事,我忽然想看看网上有没有获取客户端IP以及根据IP得到具体的IP所在地的API,当然容易找到的,否则那么多小网站都写着“欢迎来自上海电信的笑遍世界”,这么容易实现的。所以用Python做了简单的小程序。我使用了腾讯的API来获得IP,使用网易有道的API来获得IP所在地。(因为感觉上腾讯的IP库比较强大,也发现网易有道的IP所在地信息比较详细,所以取二者的长处实验了一下)我的Python小程序返回结果为:
your ip is:124.78.242.245
you are here:上海市黄浦区 电信
腾讯,网易,新浪,搜狐都提供了IP地址转换为实际地址的接口.结合这些门户网站api接口你就可以找到浏览者准确地址了。
下面是几个门户网站的IP查询地址和API接口。
腾讯:http://fw.qq.com/ipaddress 返回格式为 javascript格式对象. 形如: var IPData = new Array(“124.204.70.160″,”",”北京市”,”");
可以在页面中引入js文件 直接调用。
<script lang ge="javascript" type="text/javascript" src="http://fw.qq.com/ipaddress" charset="gb2312"> </script>
<script>document.write("你的IP是:"+IPData[0]+",来自:"+IPData[2]);</script>
搜狐: http://pv.sohu.com/cityjson 也是浏览器 js 调用的。返回 var returnCitySN = {“cip”: “124.204.70.160″, “cid”: “110000″, “cname”: “北京市”}; 的格式。
新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js
返回var remote_ip_info = {“ret”:1,”start”:”124.205.0.0″,”end”:”124.205.136.255″,”country”:”\中\国”,”province”:”\北\京”,”city”:”\北\京”,”district”:”",”isp”:”\电\信\通”,”type”:”",”desc”:”"};
新浪多地域测试方法:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=124.204.70.160
网易有道IP地址查询:http://www.yo?o.com/smartresult-xml/search.s?type=ip&q=124.204.70.160

下面是获取IP和IP所在地的Python小程序(适用于Python3版本)。
主要的注意点有两点:
1.要对API调用的返回对象根据encoding来做decode;
2.就是正则表达式了,哎,再次遇到,发现它真的很好很强大啊。

#! /usr/bin/python3
# -*- coding: utf-8 -*-

'''
Created on 2011-8-15

@author: Jay Ren  笑遍世界
'''

import re
import urllib.reqst

def get_reponse_from_url(url):
    req = urllib.reqst.Reqst(url)
    encoding = 'gbk'
    try:
        doc = urllib.reqst.urlopen(req).read()
#        print(doc.decode(encoding))
        return doc.decode(encoding)
    except Exception as e:
        print("urlopen Exception : %s" %e)

def get_ip_and_location():
    url_ip_qq = "http://fw.qq.com/ipaddress"
    url_location_yo?o = "http://www.yo?o.com/smartresult-xml/search.s?type=ip&q="
    re_ip = "((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))"
    str_ip = get_reponse_from_url(url_ip_qq)
    ip = re.search(re_ip, str_ip).group(1)
#    print("ip="+ip.group(1))
    print("your ip is:"+ip)
    url_location_yo?o += ip
    str_location = get_reponse_from_url(url_location_yo?o)
    re_location = '<location>(.*)</location>'
    location = re.search(re_location,str_location).group(1)
    print("you are here:"+location)

if __name__ == '__main__':
    get_ip_and_location()


参考资料:http://www.oophper.com/html/particle/partpage_49.php
  评论这张
 
阅读(2272)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017