python获取网站IP以及识别IP位置

在一次开发过程中,需要获取网站的IP,以及改IP所在的地址。
第一个想法就是使用第三方接口,但是想想,还是自己实现比较实在,网上百度了一下,还是有些教程,所以就写篇文章记录下如何实现。

获取IP

在我们访问网站时,大多实用的域名进行访问,但是在项目开发过程中,我需要获得网站域名所绑定的IP地址,因为项目中导入了requests库,就想百度下requests是否能够实现这个功能。
网站IP
经过一番搜索终于找到相关的信息,具体实现如下:

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']