关闭

根据IP查询地址的方式

标签: python数据库ip查询地址
168人阅读 评论(0) 收藏 举报
分类:
我在网上简单查了查,通过IP获取地址的方式有以下两种,**目前我只用到了IP4**。如果大家有别的方法可以评论下,我好学习下。
  • 通过调用第三方的API,如阿里,新浪等
  • 下载IP数据库来自己建立IP数据库。

第三方API:

如通过新浪的API查询,这种方法比较简单,缺点是如果你查询量比较大的话,可能会被禁用一段时间的IP。

http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip=221.11.2.3&format=json

返回结果
{"ret":1,"start":-1,"end":-1,"country":"\u4e2d\u56fd","province":"\u9655\u897f","city":"\u897f\u5b89","district":"","isp":"","type":"","desc":""}

自建IP数据库进行查询

    通过下载第三方收集的IP数据库来建立自己的IP数据库。这种方法好处是不受访问限制,坏处是更新比较麻烦(可能是我找的IP数据库下载下来是客户端吧)需要抓包分析以后才能自动更新。由于时间问题,我只找到了[纯真](http://www.cz88.net/)IP数据库,这个更新还是比较频繁的。我下载的时候最后更新的时间是8月25日,已经有446903个IP段了。

    下载下来的客户端解压安装,然后打开以后,点击解压即可获得文本的IP段地址信息。

这里写图片描述

txt截取如下

1.24.136.0      1.24.147.255    内蒙古鄂尔多斯市 联通
1.24.148.0      1.24.159.255    内蒙古乌海市 联通
1.24.160.0      1.24.167.255    内蒙古包头市 联通
1.24.168.0      1.24.175.255    内蒙古锡林郭勒盟 联通
1.24.176.0      1.24.183.255    内蒙古阿拉善盟 联通
1.24.184.0      1.24.187.255    内蒙古乌海市 联通
1.24.188.0      1.24.191.255    内蒙古包头市 联通
1.24.192.0      1.24.199.255    内蒙古乌兰察布市 联通
1.24.200.0      1.24.215.255    内蒙古呼和浩特市 联通
1.24.216.0      1.24.218.255    内蒙古乌兰察布市 联通
1.24.219.0      1.24.219.255    内蒙古巴彦淖尔市 联通

然后写程序解析以后放入到数据库中就行了。放入的时候注意IP保存的方式。
为了方便查询,我采用的是用无符号的int存储的。

CREATE TABLE `ip_address` (
  `startip` int(10) unsigned NOT NULL,
  `endip` int(10) unsigned NOT NULL,
  `info` varchar(500) DEFAULT NULL,
  KEY `ip_range_index` (`startip`,`endip`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

mysql有一个inet_aton函数可以将IP字符串转化为整型(IP4是4个字节的数据, 如果自己写的话写转化的话,可以把”A.B.C.D”的IP地址转换通过位移的方式转化为32位长整数).

IP4 to Int 转化方法

(A * 256³) + (B * 256²) + (C * 256) + (D)
或者
(int(A) << 24) + (int(B) << 16) + (C) << 8) + int(D)

mysql> select inet_aton('255.255.255.255');
+------------------------------+
| inet_aton('255.255.255.255') |
+------------------------------+
|                   4294967295 |
+------------------------------+
1 row in set (0.04 sec)

插入数据(我是用Python写的),用什么方法解析都可以,只要注意IP类型即可。

for line in open('/Users/alvin/ip.txt'):
    if line and line != '':
        line = line.split()
        sql = 'insert into ip_address values(inet_aton(%s),inet_aton(%s),%s)'
        params = (line[0],line[1],' '.join(line[3:]))
        # todo insert

查询数据

select info from ip_address where INET_ATON('211.144.5.46') between startip and endip

result: 北京
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1912次
    • 积分:39
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:5篇
    • 译文:0篇
    • 评论:0条
    文章分类