利用Python跑IP地址归属地
目录
1.前言
作为一个老新手,在工作中需要使用跑IP地址信息,于是就想用python写一个脚本。虽然代码还是不够看,但是在过程中遇到很多坑希望记录下来以后能及时避免。
2.获取IP库接口
因为需要的信息相对较详细,所以需要一个免费的、高效的、准确的IP地址信息库。网上一抹多但是实用的就只有那么几个,关键是有一些打着免费试用的幌子按个数卖钱的,真的太恶心了。会让你觉得你成功了,其实呢只是中途停下来让你加钱。
这里推荐良心商家马爸爸开的淘宝,真的是为数不多良心商家,提供免费地、好用地、准确的IP地址信息库,讲道理这波推荐我是认真地。唯一需要注意的是有一个accessKey参数在官网是不会提供的,我开始以为是需要购买的,在我心灰意冷后打算给马爸爸充钱的时候竟然发现这个key网上有。
连接如下:
http://ip.taobao.com/outGetIpInfo?ip=%s&accessKey=alibaba-inc
3.分析接口返回数据格式
详见下图,图 1是该网站提供的接口信息,有一点不准确,但是对最后的结果没有影响,根据图 2返回的信息使用脚本进行处理和存储。
方式是通过code字段判断或者msg字段的值判断是否查询成功,在将获取data字段的值提取保存下来。


4.排坑之路
要批量处理IP地址,就需要将被处理的IP保存到一个txt文件里,并且也需要将结果给保存到一个文件里。在python中处理文件的方法有很多,这里就不赘述,但其中有几个坑需要在这里记录一下。
以下代码是我处理接口返回数据的函数,其中需要注意的是结果的返回,由于对python还未掌握精髓,我一开始在return使用的是print直接打印。在这里需要注意,如果你这么设计你的函数,那么在输出结果的时候会在下一行返回一个None,如果有想了解原因的朋友请点击【Python进阶篇】python之函数的返回值。
# 处理IP地址库接口返回的数据
def get_ip_info(ip):
url = 'http://ip.taobao.com/outGetIpInfo?ip=%s&accessKey=alibaba-inc' % ip
header = {"user-agent": "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"}
result = requests.get(url,headers = header)
if result.json()['code'] == 0:
DetailedAddress = result.json()['data']
country = DetailedAddress['country']
privince = DetailedAddress['region']
city = DetailedAddress['city']
ipadd = DetailedAddress['ip']
ipIsp = DetailedAddress['isp']
return '该%s所在归属地国家:%s 省份: %s 城市:%s 运营商:%s' % (ipadd,country,privince,city,ipIsp)
else:
print('该%s地址无法查询到信息' % ip)
这是本人处理文件的函数,不知道有没有和我有一样的习惯,就是在找寻文件绝对路径的时候习惯右击,点击属性,然后在安全里复制文件的绝对路径,这样的话那你的代码应该会报一个错,报错内容如下,解决办法就是删除该路径重新敲一遍。其实搜索\u202A,要比搜索整段报信息结果要好得多,错具体原理请点击Python3之由通用字符名称“\u202A”。
OSError: [Errno 22] Invalid argument: '\u202aC:\\Users\\wangping01\\Desktop\\ipaddress.txt'
# 读取要查询的IP地址和将结果保存到指定的位置
def main():
for url in fileinput.input(r"D:\Microsoft VS Code\pythonProject\Day1-15\ip.txt"):
url = url.replace("\n", "") # 替换末尾的换行符
ipinfo = get_ip_info(url)
with open(r"C:\Users\administrator\Desktop\ipaddress.txt",'a',encoding='utf-8') as f:
f.write(ipinfo+"\n")
f.close
# print(get_ip_info(url))
5.具体代码
贴出代码就一个目的,希望有大佬和同仁们瞅见能指点一二,因为要跑的IP量太大,代码完全不够用。期待指导交流!
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
import fileinput
# 处理IP地址库接口返回的数据
def get_ip_info(ip):
url = 'http://ip.taobao.com/outGetIpInfo?ip=%s&accessKey=alibaba-inc' % ip
result = requests.get(url,headers = header)
if result.json()['code'] == 0:
DetailedAddress = result.json()['data']
country = DetailedAddress['country']
privince = DetailedAddress['region']
city = DetailedAddress['city']
ipadd = DetailedAddress['ip']
ipIsp = DetailedAddress['isp']
return '该%s所在归属地国家:%s 省份: %s 城市:%s 运营商:%s' % (ipadd,country,privince,city,ipIsp)
else:
print('该%s地址无法查询到信息' % ip)
# 读取要查询的IP地址和将结果保存到指定的位置
def main():
for url in fileinput.input(r"D:\Microsoft VS Code\pythonProject\Day1-15\ip.txt"):
url = url.replace("\n", "") # 替换末尾的换行符
ipinfo = get_ip_info(url)
with open(r"C:\Users\administrator\Desktop\ipaddress.txt",'a',encoding='utf-8') as f:
f.write(ipinfo+"\n")
f.close
# print(get_ip_info(url))
if __name__ == '__main__':
main()