ラベル GeoIP の投稿を表示しています。 すべての投稿を表示
ラベル GeoIP の投稿を表示しています。 すべての投稿を表示

2015年8月5日水曜日

pip コマンドを使って PyPI からパッケージをダウンロードしたり、ダウンロードしたものをインストールしたり

PyPI からのパッケージのダウンロードは https://pypi.python.org/pypi からたどったリンクをクリックするだけでできますが、今回は pip コマンドを使ってダウンロードしてみました。

また、ダウンロードしたものを同様に pip コマンドを使ってインストールしてみます。

ダウンロード/インストールするパッケージとして pygeoip を選んでいます。


環境

  • Ubuntu 14.04 (Trusty Tahr) Server
  • Python 3.4.0

PyPI からダウンロード

python3 用の pip をインストール

$ sudo apt-get install python3-pip

PyPI から pygeoip をダウンロード

$ pip3 install --download ./ pygeoip

カレントディレクトリにダウンロードされました。

$ ls -l
total 20
-rw-rw-r-- 1 worker worker 20296 Jul 27 22:05 pygeoip-0.3.2-py2.py3-none-any.whl

一応、チェックサム

$ md5sum pygeoip-0.3.2-py2.py3-none-any.whl
7c342cb0c745ec612071f197800ce4cc  pygeoip-0.3.2-py2.py3-none-any.whl

ダウンロードしたパッケージをインストール

/some/where/ に pygeoip-0.3.2-py2.py3-none-any.whl をダウンロードしたとします。

$ ls -l /some/where/
total 20
-rw-rw-r-- 1 worker worker 20296 Jul 27 23:31 pygeoip-0.3.2-py2.py3-none-any.whl

これを指定して pip でインストール

$ sudo pip3 install --no-index --find-links file:///some/where pygeoip
  • –no-index を付けることにより、指定したディレクトリ (/some/where/) に pygeoip が無い場合でも PyPI を使用しません。

pygeoip パッケージがインストールされました。

$ ls -l /usr/local/lib/python3.4/dist-packages/
total 8
drwxr-sr-x 3 root staff 4096 Jul 27 23:40 pygeoip
drwxr-sr-x 2 root staff 4096 Jul 29 12:54 pygeoip-0.3.2.dist-info

おまけ その1: geoip データファイルを利用して ip アドレスの国情報を取得

pygeoip を使うにはデータベースファイルが必要です。データベースファイルのインストール方法は「 GeoIP を使い、IP アドレスから国や場所の情報をコマンドラインで取得 」あたりを参照して下さい。

データベースファイルをインストールしたらこんな感じで使えます

$ python3
>>> import pygeoip
>>> gi = pygeoip.GeoIP('/usr/share/GeoIP/GeoIP.dat')
>>> gi.country_code_by_name('google.com')
'US'
>>> gi.country_name_by_addr('173.194.117.192')
'United States'

おまけ その2: ダウンロードしたパッケージを解凍

ダウンロードしたパッケージは unzip コマンドで普通に解凍できます。

$ unzip pygeoip-0.3.2-py2.py3-none-any.whl
  • 拡張子 .whl は unzip が認識しないようなので、タブ補完が効かないのでパッケージ名を直打ちする必要があります。

2014年12月6日土曜日

GeoIP を使い、IP アドレスから国や場所の情報を Python3 で取得

GeoIP を使い、IP アドレスから国や場所の情報を Python3 で取得する方法を調べてみました。

http://fishrimper.blogspot.jp/2014/11/geoip-ip.html ではコマンドラインで取得する方法でしたが、今回は Python3 です。

環境:
Ubuntu 14.04 (Trusty Tahr) Server

パッケージをインストール

$ sudo apt-get install python3-geoip
$ sudo apt-get install geoip-database-contrib
データベースファイルを更新
$ sudo geoip-database-contrib_update

python3-geoip パッケージには example が含まれていませんが、 python2.7 版の python-geoip パッケージや https://pypi.python.org/pypi/GeoIP/ からダウンロードできるソースコードには example が含まれているのでそちらもあわせて参照して下さい。

データベースファイルの場所を確認

$ ls -l /usr/share/GeoIP/
total 47120
-rw-r--r-- 1 root root  3756721 Dec  1 22:40 GeoIPASNum.dat
-rw-r--r-- 1 root root  4398436 Dec  1 22:40 GeoIPASNumv6.dat
lrwxrwxrwx 1 root root       31 Dec  6 17:28 GeoIPCity.dat -> /etc/alternatives/GeoIPCity.dat
-rw-r--r-- 1 root root   748606 Dec  3 06:43 GeoIP.dat
-rw-r--r-- 1 root root  1361009 Dec  3 06:43 GeoIPv6.dat
-rw-r--r-- 1 root root 18678957 Dec  3 06:57 GeoLiteCity.dat
-rw-r--r-- 1 root root 19295330 Dec  3 06:37 GeoLiteCityv6.dat

GeoIP モジュールでは必要に応じてこれらのファイルを直接オープンして使います。

GeoIP.dat から位置情報を取得

GeoIP インスタンス作成
$ python3
>>> import GeoIP
>>> gi = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE)

GeoIP.GEOIP_MEMORY_CACHE を指定しましたが、GeoIP.GEOIP_STANDARD とか他にもいろいろあり、メモリをより多く使うが高速だったり、ファイルから読み出すのでメモリをそれほど使わないが低速だったりそれぞれ長所、短所があるようです。 詳しくは https://github.com/maxmind/geoip-api-c に書かれてます。

上では GeoIP.new() でインスタンスを作成しましたが、この場合はデフォルトで /usr/share/GeoIP/GeoIP.dat を使うようです。

GeoIP.open() で明示的にデータベースファイルを指定することもできるようです。

>>> gi = GeoIP.open('/usr/share/GeoIP/GeoIP.dat', GeoIP.GEOIP_MEMORY_CACHE)

データベースのエディションを確認

>>> gi.database_edition
'GeoIP Country Edition'

データベースの情報を確認

>>> gi.database_info
'GEO-106FREE 20141202 Build 1 Copyright (c) 2014 MaxMind Inc All Rights Reserved'

IP アドレスから国コード取得

>>> gi.country_code_by_addr('173.194.38.66')
'US'

ホスト名から国コード取得

>>> gi.country_code_by_name('google.com')
'US'

IP アドレスから国名取得

>>> gi.country_name_by_addr('173.194.38.66')
'United States'

ホスト名から国名取得

>>> gi.country_name_by_name('google.com')
'United States'

GeoIPCity.dat から位置情報を取得

GeoIP インスタンス作成
$ python3
>>> import GeoIP
>>> gi = GeoIP.open('/usr/share/GeoIP/GeoIPCity.dat', GeoIP.GEOIP_MEMORY_CACHE)

データベースのエディションを確認

>>> gi.database_edition
'GeoIP City Edition, Rev 1'

データベースの情報を確認

>>> gi.database_info
'GEO-533LITE 20141202 Build 1 Copyright (c) 2014 MaxMind Inc All Rights Reserved'
IP アドレスから位置情報取得
>>> from pprint import pprint
>>> pprint(gi.record_by_addr('173.194.38.66'))
{'area_code': 650,
 'city': 'Mountain View',
 'country_code': 'US',
 'country_code3': 'USA',
 'country_name': 'United States',
 'dma_code': 807,
 'latitude': 37.4192008972168,
 'longitude': -122.05740356445312,
 'metro_code': 807,
 'postal_code': '94043',
 'region': 'CA',
 'region_name': 'California',
 'time_zone': 'America/Los_Angeles'}

GeoIP.dat とは異なり、GeoIPCity.dat の場合は一括で情報を取得するようです。

ホスト名から位置情報取得
>>> pprint(gi.record_by_name('google.com'))
{'area_code': 650,
 'city': 'Mountain View',
 'country_code': 'US',
 'country_code3': 'USA',
 'country_name': 'United States',
 'dma_code': 807,
 'latitude': 37.4192008972168,
 'longitude': -122.05740356445312,
 'metro_code': 807,
 'postal_code': '94043',
 'region': 'CA',
 'region_name': 'California',
 'time_zone': 'America/Los_Angeles'}

データベースの更新

http://fishrimper.blogspot.jp/2014/11/geoip-ip.html と同様に、しばらく経過するとデータベースが古くなり正確な情報を取得できなくなるはずなので、こまめに $ sudo geoip-database-contrib_update を実行すると最新の GeoIP データベースに更新できるようです。


その他

データベースファイルには GeoIPASNum.dat というものもあったのですが、 example が無く使い方がわからなかったので調べてみました。

GeoIP インスタンス作成
$ python3
>>> import GeoIP
>>> gi = GeoIP.open('/usr/share/GeoIP/GeoIPASNum.dat', GeoIP.GEOIP_MEMORY_CACHE)

データベースのエディションを確認

>>> gi.database_edition
'GeoIP ASNum Edition'

データベースの情報を確認

>>> gi.database_info
'GEO-117 20141201 Build 1 Copyright (c) 2014 MaxMind Inc All Rights Reserved'
ヘルプを確認
>>> help(gi)
Help on GeoIP object:

class GeoIP(builtins.object)
 |  GeoIP database object
 |
 |  Methods defined here:
... snip ...

gi インスタンスが持っているメソッドなどの情報をヘルプで確認できます。

ヘルプに出てくるメソッドのうち、使用するデータベースによって使えるものが限られるようですが、 GeoIPASNum.dat の場合は以下が使えました。

IP アドレスから AS 番号取得
>>> gi.name_by_addr('173.194.38.66')
'AS15169 Google Inc.'

AS 番号を取得できるようです。

ホスト名から AS 番号取得
>>> gi.name_by_name('google.com')
'AS15169 Google Inc.'

2014年11月29日土曜日

GeoIP を使い、IP アドレスから国や場所の情報をコマンドラインで取得

GeoIP を使い、IP アドレスから国や場所の情報をコマンドラインで取得する方法を調べてみました。

以下、今回は手探りで調べた内容が特に多いので「ようです」という表現ばかりになってますがご容赦下さい。

環境:
Ubuntu 14.04 (Trusty Tahr) Server

geoip-bin パッケージをインストールすると geoiplookup コマンドを使えるようになります

$ sudo apt-get install geoip-bin

たとえば、google.com の IP は 173.194.38.66 で、この IP を使っている国の情報は以下のように取得できます。

$ geoiplookup 173.194.38.66
GeoIP Country Edition: US, United States

ホスト名でもいけます。

$ geoiplookup google.com
GeoIP Country Edition: US, United States
-v オプションで GeoIP データファイルの日付やビルド番号を確認することができます
$ geoiplookup google.com -v
GeoIP Country Edition: GEO-106FREE 20140407 Build
GeoIP Country V6 Edition: GEO-106FREE 20140407 Build

実際の IP アドレスの国情報は時の経過と共に変化していきますが、データベースは 2014/04/07 のものでかなり古いです。どうやら、Ubuntu 14.04 が リリースされた時点のもので、それ以降更新されていないようです。

このあたりのデータベースファイルを利用しているようです。

$ ls -l /usr/share/GeoIP/
total 3844
-rw-r--r-- 1 root root  827301 Apr  7  2014 GeoIP.dat
-rw-r--r-- 1 root root 3105495 Apr  7  2014 GeoIPv6.dat

geoip-database-contrib パッケージをインストールすることでデータベースファイルを更新することができるようになるようです。

$ sudo apt-get install geoip-database-contrib

データベースファイルを更新

$ sudo geoip-database-contrib_update

データベースファイルの日付が最近のものになりました。データベースの種類も増えてます。

$ geoiplookup google.com -v
GeoIP Country Edition: GEO-106FREE 20141104 Build 1 Copyright (c) 2014 MaxMind Inc All Rights Reserved
GeoIP City Edition, Rev 1: GEO-533LITE 20141104 Build 1 Copyright (c) 2014 MaxMind Inc All Rights Reserved
GeoIP ASNum Edition: GEO-117 20141116 Build 1 Copyright (c) 2014 MaxMind Inc All Rights Reserved
GeoIP Country V6 Edition: GEO-106FREE 20141104 Build 1 Copyright (c) 2014 MaxMind Inc All Rights Reserved
GeoIP ASNum V6 Edition: GEO-117 20141116 Build 1 Copyright (c) 2014 MaxMind Inc All Rights Reserved

データベースファイルはこんな感じになりました。

$ ls -l /usr/share/GeoIP/
total 47136
-rw-r--r-- 1 root root  3720710 Nov 17 04:29 GeoIPASNum.dat
-rw-r--r-- 1 root root  4358378 Nov 17 04:29 GeoIPASNumv6.dat
lrwxrwxrwx 1 root root       31 Nov 29 19:34 GeoIPCity.dat -> /etc/alternatives/GeoIPCity.dat
-rw-r--r-- 1 root root   773056 Nov  6 04:25 GeoIP.dat
-rw-r--r-- 1 root root  1378157 Nov  6 04:25 GeoIPv6.dat
-rw-r--r-- 1 root root 18707382 Nov  6 05:02 GeoLiteCity.dat
-rw-r--r-- 1 root root 19316419 Nov  6 04:19 GeoLiteCityv6.dat

表示される情報も増えました。

$ geoiplookup 173.194.38.66
GeoIP Country Edition: US, United States
GeoIP City Edition, Rev 1: US, CA, California, Mountain View, 94043, 37.419201, -122.057404, 807, 650
GeoIP ASNum Edition: AS15169 Google Inc.

経度と緯度の情報も表示されてますが、あまり正確ではありません。

MAXMIND 社 の有料データベースを使うともっと高精度な位置情報を調べることができるようです。

しばらく経過するとデータベースが古くなり正確な情報を取得できなくなるはずなので、こまめに $ sudo geoip-database-contrib_update を実行すると最新の GeoIP データベースに更新できるようです。