<返回更多

Python一键查询10万个ip地址归属地

2019-09-25    
加入收藏

近期公司收到监管部门的通知:公司的金融软件在境外也能被使用。为了查明这个原因,我们从服务器的后台日志中,采集了近10万个国内外的ip地址,现在想要查询出这10万个ip地址的归属地,手动查询的话,效率太低,所以我决定使用Python来解决这个问题!!!

 

一:我们需要找一个可以使用的api接口

1. 打开浏览器,输入ip,可以查询到我们当前的ip地址,此时,相应的api接口也就出现了

 

 

10万个ip地址头疼吧?Python助你一键查询归属地

私信小编01 获取PDF,视频教程,以及交流答疑哦!

 

2. 按F12, 打开浏览器的开发界面,然后在上图的查询框中,输入一个ip地址,点击"查询",然后点击network---JS---点击左侧的Name--点击右侧的Preview, 此时,我们就可以看到服务器返回的结果了

 

10万个ip地址头疼吧?Python助你一键查询归属地

 

3. 点击上图中右侧的Header菜单, 我们将得到一个URL ,此URL就是我们要找的api接口了,此时,我们发现,只需要将ip地址改变下,就可以查询不同的ip地址的归属地了 https://open.onebox.so.com/dataApicallback=jQuery18305921599528683013_1562291824827&type=ip&src=onebox&tpl=0&num=1&query=ip&ip=60.187.173.10&url=ip&_=1562292144039

 

10万个ip地址头疼吧?Python助你一键查询归属地

 

二:读取文件

所有的ip地址我是保存在一个叫ip3.txt的文件中,每个ip地址单独占用一行,所以,在这里,我定义了一个函数,将所有的ip地址拿出来,合并成一个列表,便于后面的函数调用

 

#!python3
#coding=utf-8
import requests
import json
import os
import re
'''
ip地址查询
'''
def readfile():
 iplist = [] #定义一个空列表
 files = open('ip3.txt','r',encoding='utf-8') #读文件
 f = files.readlines() #得到一个列表
 for n in f:
 n1 = n.replace('n','') #去掉f列表中元素的换行符
 iplist.Append(n1) #合并成一个新的列表
 return iplist #返回一个包含了所有ip地址的列表
rf = readfile() #将函数实例化,便于调用

 

三:思路分析

ip3.txt这个文件我们已经处理完了,接下来就要看一个很关键的地方,我们如何去更好的处理浏览器返回的这个结果,如下图,这个结果可以看成是两部份组成:

jQuery18305921599528683013_1562291824827({0: "中国", 1: "浙江省", 2: "绍兴市", 3: "", 5: "电信", ip: "60.187.173.10", isLocalIp: false})

标记为红的地方,我们可以将其看成是一个字典,这样的话,字典取值就很简单了吧,其它没有用的内容,我们可以通过正则表达式将其过滤掉,有了这种思路,我们就可以继续写代码了

 

10万个ip地址头疼吧?Python助你一键查询归属地

四:继续写代码

 

def checkip():
 #读取每一个ip地址
 for n in rf: 
 try:
 print(n)
 #将ip地址作为变量传到api接口中
 api='https://open.onebox.so.com/dataApi?callback=jQuery183039083655956956864_1562117373170&type=ip&src=onebox&tpl=0&num=1&query=ip&ip=%s&url=ip&_=1562119610793'%n
 #向api接口发送一个请求
 response = requests.get(api).content.decode('utf-8')
 #使用正则,过滤到返回内容中没用的信息,只保留有用的信息,此时返回的结果为字符串
 filters = re.findall(r'((.*?))',response)[0]
 #将字符串转成字典
 getjs = json.loads(filters)
 print(getjs)
 #因为有些国外的ip地址是没有省份的,也就是没有键=1,所以这里要判断下
 if '1' in getjs.keys():
 #如果存在键为1, 则输出国家,省份,ip这三个信息
 print(getjs['0'],getjs['1'],getjs['ip'])
 with open('sum.csv','a',encoding='utf-8') as file:
 file.write(getjs['0'] + ',' + getjs['1'] + ',' + getjs['ip'] + 'n')
 else:
 #如果不存在键为1, 则输出国家,省份以空代替,ip这三个信息
 print(getjs['0'],getjs['ip'])
 with open('sum.csv','a',encoding='utf-8') as file:
 file.write(getjs['0'] + ',' + 'None' + ',' + getjs['ip'] + 'n')
 #有些ip地址可以查询不出来归属的,那么代码就会执行失败,所以这里用了try...execpet,将异常ip保存在error.csv文件中
 except:
 with open('error.csv','a',encoding='utf-8') as file:
 file.write(n + 'n')
checkip()

 

运行完代码之后,得到的结果如下图(如果发现用Excel打开,中文显示乱码的话,可以先用notepad打开,把编码格式改成ANSI,然后保存成excel格式)

 

 

10万个ip地址头疼吧?Python助你一键查询归属地

 

总结

整个代码加起来大概50行左右,我自己花了1个小时写的,这种做法,提高了我的工作效率,让我有更多的时间去学习新的知识。如果你觉得我写的内容对你有帮助的话,别忘了点击关注和订阅,有任何工作上的问题

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>