在一次开发过程中,需要获取网站的IP,以及改IP所在的地址。
第一个想法就是使用第三方接口,但是想想,还是自己实现比较实在,网上百度了一下,还是有些教程,所以就写篇文章记录下如何实现。
获取IP
在我们访问网站时,大多实用的域名进行访问,但是在项目开发过程中,我需要获得网站域名所绑定的IP地址,因为项目中导入了requests
库,就想百度下requests
是否能够实现这个功能。
经过一番搜索终于找到相关的信息,具体实现如下:
1 | import requests |
2 | req = requests.get('url',stream = True) |
3 | ip_and_port = req.raw._connection.sock.getpeername() #返回元组,(ip, port) |
4 | text = req.text |
这样就可以在一次请求获得所有想要的信息。
获取IP所在地理位置
刚才的需求解决了,那么得到IP
,我就想获得IP地址所在的位置如:国家
、城市
等等,本想这个功能应该只能调用第三方接口了吧,但是谷歌一下,发现python中有实现这个功能的库geoip2,简单的浏览下它的官网,发现他们实现这个功能就是基于数据库比对,可以实现以下功能:
- IP位置查询
- IP是否高匿,解析真实地址
- 域名查询
- 连接方式查询
- ASD查询
- ISP查询
这些功能的实现重要依靠相应的数据库匹配进行实现的,我们的使用方法也很简单,geoip2
支持两种方式匹配数据库,一种是使用在线的数据库,但是考虑到对方的库在国外,可能耗时较大,所以选择将数据库下载下来,进行使用,下面的例子以查询IP所在位置进行记录。
先安装geoip2
库
1 | pip install geoip2 |
然后,数据库下载地址(包括db和csv两种格式,建议下载db格式的,如果你要看其中内容可以下载csv):
http://dev.maxmind.com/geoip/geoip2/geolite2
下面用代码说话:
1 | import geoip2.database |
2 | def get_address(ip): |
3 | reader = geoip2.database.Reader('./dbs/GeoLite2-City.mmdb') #这里参数为刚才下载数据库的位置 |
4 | respone = reader.city(ip) |
5 | Country = respone.country.name #获取国家 |
6 | Province = response.subdivisions.most_specific.name #获取省 |
7 | City = response.city.name #获取市 |
8 | Longitude_And_Latitude = 'Longitude:{},Latitude:{}'.format(response.location.longitude, response.location.latitude) #获取经纬度 |
这样就可以获取到IP的所在位置了,这里返回的结果为英文,如果想要返回中文的话,选择地区即可,如获取国家的中文名称response.country.names['zh-CN']
。