Python通过GeoIP获取IP信息(国家、城市、经纬度等)

news/2024/8/26 15:10:21

IP地址信息是非常重要的情报信息,通过IP可以定位到该IP所在的国家、城市、经纬度等。
获取IP信息的方式有很多,很多服务商都提供了相应的地址库或API接口服务。
如国内的ipip.net,国外的ip-api.com、maxmind.com等。
很多公司都是使用Maxmind网站的IP信息库,里面包含着IP的详细信息,有付费的也有免费的,收费与免费的区别就是精准度和覆盖率。

本文介绍下载及定时更新Maxmind的离线库用python通过GeoIP来获取IP信息

一、下载GeoLite2离线地址库

1、注册及申请License Key

下载地址库之前先要在Maxmind网站注册同意相应的协议并登陆。

1)注册

访问 https://dev.maxmind.com/geoip/geolite2-free-geolocation-data
Maxmiand注册导航
点击"Sign Up for GeoLite2" 根据输入框进行注册
Maxmiand注册表单
注意邮箱一定要正确,注册后会发邮件进行确认及修改密码。
根据注册的用户名和修改后的密码登陆就可以直接下载离线包了。
Maxmind账号信息
点击"Download Databases"进入到下载页面,可以看到提供了CSV及mmdb两种格式的离线库包,最近的更新时间为2021年11月02日。
MaxmiandGeoLite2地址库下载
由于IP地址信息是经常有变化的,Maxmind提供了geoipupdate工具来更新离线地址包。该工具使用需要申请账号和License Key

2)申请License Key

还是通过刚注册的引导页面,点击“Generate a License Key”
Maxmind生成License导航页
进如到页面后,点击“Generate new license key”
Generate new license key
License Key生成确定页
点击确定以后就会生成账号及License key
License key生成

2、下载并配置geoipupdate

https://github.com/maxmind/geoipupdate
这里有详细的安安装及配置说明

发行版本下载地址 https://github.com/maxmind/geoipupdate/releases
在这里插入图片描述

可以看到提供了各种平台的版本的下载链接,这里我们下载安装的是linux版本,点击下载“geoipupdate_4.8.0_linux_amd64.tar.gz”
在home目录下执行wget https://github.com/maxmind/geoipupdate/releases/download/v4.8.0/geoipupdate_4.8.0_linux_amd64.tar.gz 下载至home目录
tar -zxvf geoipupdate_4.8.0_linux_amd64.tar.gz 进行解压
cd geoipupdate_4.8.0_linux_amd64 目录执行ls -alh查看目录内容,发现有两个关键文件,一个是getipupdate命令执行文件,一个是GeoIP.conf配置文件
geoipupdate目录
将执行命令拷贝到命令文件夹

cp geoipupdate /usr/local/bin/

geoipupdate命令读配置文件默认为/usr/local/etc/GeoIP.conf将配置文件拷贝到/usr/local/etc/下

cp GeoIP.conf /usr/local/etc/
vi /usr/local/etc/GeoIP.conf

修改GeoIP.conf
如上图修改离线库文件目录及账号、LicenseKey,AccountID和LicenseKey就是开始在Maxmind网站上申请的。

3、运行geoipupdate命令并加入定时任务

执行geoipupdate命令,在目录下面产生了GeoLite2-City.mmdb、GeoLite2-Country.mmdb两个离线库文件。
GeoLite2离线库文件
创建Linux定时任务,每周自动更新一下离线库文件

crontab -e
0 0 * * 0 /usr/local/bin/geoipupdate

二、通过Python调用GeoIP获取IP信息

默认已经安装好了Flask环境,并激活了python虚拟环境。激活python虚拟环境安装Flask教程见http://xiejava.ishareread.com/posts/7f405b25/

1、安装geoip2

pip install geoip2

2、编写hello.py调用geoip2

vi hello.py

复制以下代码到hello.py

from flask import Flask
import geoip2.database

app = Flask(__name__)
reader=geoip2.database.Reader('/home/geoipupdate_4.8.0_linux_amd64/GeoLite2-City.mmdb')
@app.route("/")
def hello():
    return "Hello World!"

@app.route("/getip/<ip>")
def getip(ip):
    ipinfo=reader.city(ip)
    ipinfo_json={'country':ipinfo.country.name,'city':ipinfo.city.name,'location':[ipinfo.location.longitude,ipinfo.location.latitude]}
    return ipinfo_json

if __name__ == "__main__":
    app.run(host='0.0.0.0',port=8080)

3、运行hello.py

(flask_web) [root@localhost flask_web]# python hello.py
 * Serving Flask app 'hello' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on all addresses.
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://192.168.1.18:8080/ (Press CTRL+C to quit)

注意:如果linux开启了防火墙请关闭防火墙,或放开192.168.1.18

4、验证

通过浏览器访问 http://192.168.1.18:8080/getip/128.101.101.101
验证IP信息
可以看到返回IP的国家、城市、经纬度等信息。

至此,本文介绍了如何注册并下载GeoIP离线数据包,并通过官方提供的geoipupdate进行定期更新数据。还介绍了如何通过Python调用GeoIP获取IP信息。

作者博客:http://xiejava.ishareread.com/


http://www.niftyadmin.cn/n/595129.html

相关文章

c++ 读取内存数据 基址_什么是物理地址?不知道没关系,今天程序员带你认识各种内存地址...

物理地址就是内存单元的绝对地址&#xff0c;物理地址0x0000就表示内存条的第一个存储单元&#xff0c;0x0010(16进制)就表示内存条的第17个存储单元&#xff0c;一个存储单元是1byte(8bit)。你问为什么是1byte&#xff1f;一个内存条是由若干个黑色的内存颗粒构成的。每一个内…

JS 将框架子窗口中的内容存放到父页面的div中

//index.htm<html><head><meta http-equiv"Content-Type" content"text/html; charsetgb2312"><title>新建网页 1</title><script language"javascript">function getFrameBody(){ //将框架子窗口中的内…

tensorflow 旋转图片_tensorflow: a Implementation of rotation ops (旋转的函数实现方法)

tensorflow 旋转矩阵的函数实现方法关键字: rot90, tensorflow1. 背景在做数据增强的操作过程中, 很多情况需要对图像旋转和平移等操作, 针对一些特殊的卷积(garbo conv)操作,还需要对卷积核进行旋转操作.在tensorflow中似乎没有实现对4D tensor的旋转操作.严格的说: tensorflo…

CentOS7下配置Supervisor自启动的两种方法

很多网友留言问如何配置Supervisor 自启动&#xff0c;现将如何在CentOS7下配置Supervisor自启动的两种方法整理如下&#xff1a; 一、方法一 直接将启动命令加入到/etc/rc.d/rc.local中&#xff08;简单但不推荐&#xff09; vi /etc/rc.d/rc.local在现有的内容后面加入sup…

使用View Model从表现层分离领域模型

Model-View-Controller(模型-视图-控制器&#xff0c;MVC) 模式将你的软件组织并分解成三个截然不同的角色&#xff1a; Model 封装了你的应用数据、应用流程和业务逻辑。 View 从 Model 获取数据并格式化数据以进行显示。 Controller 控制程序流程&#xff0c;接收输入&…

frameset frame iframe

总结了frameset 的一些使用技巧&#xff0c;供大家参考哦&#xff0c;还是先剖析一下框架吧&#xff01; ■ 框架标记 <FRAMESET> <FRAME> <NOFRAMES> <IFRAME> 欲明白本篇【HTML彻底剖析】之标记分类&#xff0c;请看 【标记一览】。 也请先明白围…

python元类单例_深刻理解Python中的元类(metaclass)以及元类实现单例模式

在看一些框架源代码的过程中碰到很多元类的实例&#xff0c;看起来很吃力很晦涩&#xff1b;在看python cookbook中关于元类创建单例模式的那一节有些疑惑。因此花了几天时间研究下元类这个概念。通过学习元类&#xff0c;我对python的面向对象有了更加深入的了解。这里将一篇写…

pan 密码 看透spring mvc:源代码分析与实践_知识卡片组件分析法

组件分析法Artifact Analysis左下角1-5数字编号&#xff0c;设计应用所处的阶段&#xff1a;第1阶段&#xff1a;规划、范围界定和定义&#xff0c;用于探索和定义项目参数第2阶段&#xff1a;探索、综合和设计内涵&#xff0c;主要是使用设计人种学产生拟真效果&#xff0c;从…