LoginSignup
1
3

More than 3 years have passed since last update.

PythonでCSVのIPアドレスリストを取り込み国名を付与する

Last updated at Posted at 2019-05-04

はじめに

アクセスログをみてアクセス元の国名を調べることがあります。
アクセスログはCSVで出力されているので、今まではそれを見てIPアドレスを Cisco TALOS や Linux の「geoiplookup」コマンドで手打ちして調べていました。流石にそれは効率が悪すぎるのでCSVファイルを取り込み自動で全部調べて国名を付与してまたCSVファイルをして出力する Python プログラムを作りました。

環境と準備作業

環境について

Winodws 10 Pro + Visual Studio Code で実施しました。
python のバージョンは Python 3.6.1 です。

geoip2 モジュールのインストール

Python でIPアドレスから国名を調べようとすると geoip2 がインストールする必要があります。「pip install geoip2」コマンドを実行する必要がありますが Windows でも環境変数に python のパスが通っていればこのコマンドが動きます。PowerShell のコンソールを立ち上げてコマンドを打ったら無事 geoip2 のインストールができました。
powershell2.png

GeoLite2 データベースのダウンロード

MAXMIND 社のサイトから IPアドレスのデータをダウンロードしてきます。
GeoLite2 Free Downloadable Databases

「GeoLite2 Country」の「MaxMind DB binary, gzipped」をダウンロード、解凍して Python スクリプトがあるフォルダに置きます。tar.gz ファイルは Windows の標準の解凍ツールでは解凍できないので 7zip を使用しました。

CSV ファイルについて

下記のようなタイトル行の無い「日時」「アクセス元IPアドレス」の2列のみで構成された CSV ファイルを想定しています。

iplist.csv
2018/1/1 0:00,1.1.1.1
2018/2/1 0:00,2.1.1.1
2018/3/1 0:00,3.1.1.1
2018/4/1 0:00,4.1.1.1
2018/5/1 0:00,5.1.1.1
2018/6/1 0:00,6.1.1.1
2018/7/1 0:00,7.1.1.1
2018/8/1 0:00,8.1.1.1
2018/9/1 0:00,9.1.1.1

IPアドレスの国名を求めるスクリプト

まず IPアドレスから国名を求める関数を作成します。ソースの CSV ファイルを取り込み1行ずつこの関数を実行して、結果を付加して CSV ファイルとして出力します。

geoiplookup
## モジュールの読み込み
import geoip2.database
import csv


## GeoIPデータベースとCSVファイルのパス設定
geoip_db_path = "GeoLite2-Country_20190430/GeoLite2-Country.mmdb"
source_file_path = "iplist.csv" 
result_file_path = "result.csv"


## IPアドレスから国名を求める関数
def ipaddrlookup(ipaddress):
    reader = geoip2.database.Reader(geoip_db_path)
    response = reader.country(ipaddress)
    countoryname = response.country.names["en"]
    return countoryname


## IPアドレスリストの取り込み
source_file = open(source_file_path, encoding = "ansi") 
source_reader = csv.reader(source_file)
source_list = list(source_reader)


## 出力ファイルをオープン
result_file = open(result_file_path, "w", newline="")
result_writer = csv.writer(result_file)


## 取り込んだCSVファイルのIPアドレスから国名を求める
for row in source_list:
    outputdata = [row[0]]
    outputdata.append(row[1])
    outputdata.append(ipaddrlookup(row[1]))
    result_writer.writerow(outputdata)


## 出力ファイルをクローズ
result_file.close()

出力される CSV ファイル

下記のように「日時」「アクセス元IPアドレス」列の後に「アクセス元国名」の列が付加された CSV ファイルが出力されます。

result.csv
2018/1/1 0:00,1.1.1.1,Australia
2018/2/1 0:00,2.1.1.1,France
2018/3/1 0:00,3.1.1.1,Singapore
2018/4/1 0:00,4.1.1.1,United States
2018/5/1 0:00,5.1.1.1,Ukraine
2018/6/1 0:00,6.1.1.1,United States
2018/7/1 0:00,7.1.1.1,United States
2018/8/1 0:00,8.1.1.1,United States
2018/9/1 0:00,9.1.1.1,United States

参考情報

参考サイト

GeoLite2でサクッとできるIPアドレスの国判定
windows10でpipが使えるようになるまで(python3.6)

参考書籍

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
実践力を身につける Pythonの教科書

1
3
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3