Python获取本地的IP和所在地

前言:今天有人问我说怎样模拟国外用户浏览网站,其实就是模拟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


相关文章

Python中的函数(二) 在上一篇文章中提到了Python中函数的定...
Python中的字符串 可能大多数人在学习C语言的时候,最先接触...
Python 面向对象编程(一) 虽然Python是解释性语言,但是它...
Python面向对象编程(二) 在前面一篇文章中谈到了类的基本定...
Python中的函数(一) 接触过C语言的朋友对函数这个词肯定非...
在windows下如何快速搭建web.py开发框架 用Python进行web开发...