日本に割り当てられているIPアドレスを表示するpythonスクリプトを作った
日本に割り当てられているIPアドレスを表示するpythonスクリプトを作りました。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # -*- coding: utf-8 -*- import sys import urllib2 from math import log try:     response = urllib2.urlopen("http://ftp.apnic.net/stats/apnic/delegated-apnic-latest") except urllib2.HTTPError, e:     sys.stderr.write("IPアドレスの一覧を取得できませんでした。")     sys.stderr.write(e.reason)     exit(e.code) text = response.read() for line in text.split("\n"):     if line.count("JP") and line.count("ipv4"):         try:             print u"%s/%d" % (line.split("|")[3], 32 - log(int(line.split("|")[4]), 2))         except IndexError:             pass | 
http://ftp.apnic.net/stats/apnic/delegated-apnic-latestにどの国にどんなIPアドレスが割り当てられているかがあるので、そこから取得します。
urllib2
pythonでhttpでファイルをダウンロードするのにはurllib2を使いました。
 ダウンロードするなら↓のように書くだけで出来てしまいます。
| 1 2 3 4 5 6 7 8 | import urllib2 try:     response = urllib2.urlopen("http://khws4v1.myhome.cx/") except urllib2.HTTPError, e:     print e.reason else:     print response.read | 
HTTPのエラーが発生すると例外(urllib2.HTTPError)が発生するのでexceptしておきましょう。
reasonでエラーの原因が文字列で、codeでHTTPステータスコードが取得できます。
レスポンスの中身はreadで取得できます。
string
split
string.split()は文字列を分割する関数です。
↓のようにすることで複数行の文字列を1行づつ処理できます。
| 1 2 3 4 5 6 7 8 | text = """ あいうえお かきくけこ さしすせそ """ for line in text.split("n"):     print line | 
count
string.count()は文字列の中に指定の文字(列)がいくつ含まれているかを調べる関数です。
1つも含まれていなければ0を返します。
pythonでは0はfalseを表すので、そのままif文の論理式に使えます。
ネットマスクの計算
ネットマスクの計算は面倒くさそうですが、実はそんなに難しくありません。
ダウンロードしてくるデータは↓のようになっています。
| 1 | apnic|JP|ipv4|43.230.52.0|1024|20150203|allocated | 
1024は43.230.52.0から1024個のIPアドレスが割り振られていることを示しており、ネットマスクは↓の計算式で出せます。
pythonではmathライブラリのlog関数で求められます。
| 1 2 3 | from math import log netmask = 32 - log(1024, 2) | 
