Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@uranux_jp

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

More than 1 year has passed since last update.

はじめに

アクセスログをみてアクセス元の国名を調べることがあります。
アクセスログは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の教科書

2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?