我正在寻找一种方法来分析带有位置数据的大量IP地址列表。这个列表大约有10000000个条目。
目前,我正在使用maxmind的geoap2模块。原始代码可以查找单个IP地址条目,并使用国家代码打印结果,如下所示:
import geoip2.database
reader = geoip2.database.Reader('./GeoLite2-Country_20210330/GeoLite2-Country.mmdb')
response = reader.country('80.80.80.80')
print('response.country.iso_code: {}'.format(response.country.iso_code))
reader.close()
我试图找到一种方法来扩展这个脚本,通过遍历csv文件一次搜索更多的条目。我写了一段代码,但并没有按我的意愿工作。Python似乎不喜欢我传递列表的方式。
import geoip2.database
from csv import reader
import csv
read_db = geoip2.database.Reader('./GeoLite2-Country_20210330/GeoLite2-Country.mmdb')
with open('SrcIP.csv', 'r') as file1:
csv_read = csv.reader(file1, delimiter=' ', quotechar='|')
for row in csv_read:
response = read_db.country(', '.join(row))
print(response) #note 1
print('response.country: {}'.format(read_db.country)) #note 2
注1:如果我直接打印响应变量,它会在数据库中搜索IP地址范围,并打印每个IP地址的所有可用信息。结果,每一行的输出都变得过多。
注2:此行将限制输出仅为国家代码。但是,它返回的每一行都有错误,如下所示:
response.country:<绑定方法Reader.country of<位于0x7fe26a752c40的geoap2.database.Reader对象>gt;
我想我已经设法解决了自己的问题。我把代码改成:
import geoip2.database
import csv
read_db = geoip2.database.Reader('./GeoLite2-Country_20210330/GeoLite2-Country.mmdb') #read database
with open('SrcIP.csv', 'r') as file1:
csv_read = csv.reader(file1, delimiter=' ', quotechar='|')
for row in csv_read:
response = read_db.country(', '.join(row))
filtered_res = response.country.iso_code
print(filtered_res)
让我知道你的想法。我将结果与给定的IP地址进行了交叉检查,国家代码似乎是正确的。