ホームページ  >  記事  >  バックエンド開発  >  DNS ログを分析し、訪問したドメイン名をランク付けする Python スクリプト

DNS ログを分析し、訪問したドメイン名をランク付けする Python スクリプト

WBOY
WBOYオリジナル
2016-06-16 08:41:574793ブラウズ

少し前にDNSのドメイン名アクセスランキング(top100)を調べたいという依頼があり、仕方なくDNSログをゆっくり解析してみました。練習する。

1. 元のデータ分析:

まず、元のデータ ファイル、つまり DNS ログの内容を確認します。以下は、抽出されたいくつかの代表的なログです。2×8.2×1.2×.1×5 は、対応する数字であり、私は消去しました。それ。 。

コードをコピー コードは次のとおりです:

13-08-30 03:11:34,226 情報: クエリ: – |1×3.2×8.2×0.2×0|config.dengluqi.net||config.34245.com.;127.0.0.1;||A|成功| +|–G——- qr rd ra |1|

13-08-30 03:11:34,229 情報: クエリ: – |1×3.2×8.2x.2×8|p19.qhimg.com|default|2×8.2×1.2x.1×5;|デフォルト;|A|成功|+|—w— qr aa rd ra |8061|

13-08-30 03:11:34,238 情報: クエリ: – |1×3.2×8.x.9x|shu.taobao.com|デフォルト|2×8.2×1.2x.1×5;|デフォルト;|A|成功|+|—w— qr aa rd ra |59034|

13-08-30 03:11:34,238 情報: クエリ: – |1×3.2×8.2×7.1×2|cncjn.phn.live.baofeng.net|デフォルト|2×8.2×1.2x.17x; |デフォルト;|A|成功|+|—w— qr aa rd ra |3004|


中央のログが | で区切られていることがわかります。shu.taabao.com は、必要なデータ ドメイン名です。ドメイン名訪問の統計については、各ドメイン名の 1 つのレコードが 1 つの訪問としてカウントされます。これから 2 つの点を決定できます:

a) 区切り文字として | を使用します

b) 2 番目のフィールド ドメインはターゲット データであり、キー値、つまり辞書のキーとして使用します

c)domain[key] には、対応するドメイン名へのアクセス数が保存されます

2. スクリプトのアイデア:

a) DNS ログは一定の間隔で自動的に切り取られ、gz ファイルに圧縮されるため、最初に gzip.open を使用して gz ファイルを開き、ここで gz ライブラリをインポートする必要があります。

b) 要件は、一定期間のドメイン名ランキングを検索することであるため、一定期間フィルタリングする必要があります。ここでは通常の方法を使用してフィルタリングするため、通常のライブラリをインポートします。

c) ソート。結果はソートされ、topXX の結果が出力されます。それらは辞書に保存され、辞書はランダムであるため、適切なソート方法と辞書の反復項目が必要です。ちょうどいいです。

3. スクリプトの作成:

一般的なポイントを理解すれば、スクリプトを書くのは非常に簡単になります。

コードは次のとおりです:

コードをコピー コードは次のとおりです:

#シアシェロによる書き込み
gzip をインポート
インポートリ
file = gzip.open("e:python_programsqueries.log.CBN-XA-1-3N3.20130803160052.gz")
ドメインリスト= {}
print "時刻の形式は 13-08-04 19:1{1,2,3,4,5} "
time = raw_input("分析したい時間を入力してください")
True の場合:
line = file.readline()
そうでない場合は行:
休憩
if re.search(time,line):
ドメイン = line.split(‘|’)[2]
Domain_list 内のドメインの場合:
ドメインリスト[ドメイン] += 1
それ以外:
ドメインリスト[ドメイン] = 1
カウント = 0
for v insorted(domain_list.iteritems(),key =lambda x:x[1],reverse=True):
print v[1],v[0]
#上位 20 位のドメインのみを出力します
カウント > 20:
休憩
カウント += 1
raw_input("終了する単語を入力してください")
file.close

スクリプトの内容について説明します。queries.log.CMN-CQ.20130830031330.gz は、主にドメイン フィールドをキーとして使用する、ドメイン[キー]を使用する特定のターゲット ファイルです。アクセス数を保存します。

その後、辞書の iteritems メソッドを呼び出して並べ替え用のイテレータを生成し、最後に上位 100 位のドメイン名を入力します。

最後の raw_input (「終了する単語を入力してください」) は、win7 でテストしたためです。デフォルトでは、この行は結果を観察するために追加されています。Linux では削除できます。

ここで少し厄介なのは、時間フィルタリングが通常のフィルタを使用するため、入力が通常である必要があり、面倒なことです。

3.

を実行します。

長々と話してきたので、まずは簡単にその効果を見てみましょう。

上位 20 位のドメイン名が正常に出力されていることがわかります。

4. 概要:

対応する要件は概ね達成されていますが、多くのファイルは適切に処理されません。たとえば、データ量が多い場合、定期的なフィルタリング期間を使用するとパフォーマンスに影響します。同時に、最終的な辞書の並べ替え方法をコピーした同僚に感謝します〜

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。