近期公司收到监管部门的通知:公司的金融软件在境外也能被使用。为了查明这个原因,我们从服务器的后台日志中,采集了近10万个国内外的ip地址,现在想要查询出这10万个ip地址的归属地,手动查询的话,效率太低,所以我决定使用Python来解决这个问题!!!
一:我们需要找一个可以使用的api接口
1. 打开浏览器,输入ip,可以查询到我们当前的ip地址,此时,相应的api接口也就出现了
私信小编01 获取PDF,视频教程,以及交流答疑哦!
2. 按F12, 打开浏览器的开发界面,然后在上图的查询框中,输入一个ip地址,点击"查询",然后点击network---JS---点击左侧的Name--点击右侧的Preview, 此时,我们就可以看到服务器返回的结果了
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
二:读取文件
所有的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})
标记为红的地方,我们可以将其看成是一个字典,这样的话,字典取值就很简单了吧,其它没有用的内容,我们可以通过正则表达式将其过滤掉,有了这种思路,我们就可以继续写代码了
四:继续写代码
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格式)
总结
整个代码加起来大概50行左右,我自己花了1个小时写的,这种做法,提高了我的工作效率,让我有更多的时间去学习新的知识。如果你觉得我写的内容对你有帮助的话,别忘了点击关注和订阅,有任何工作上的问题