WebサイトやWebアプリケーションがどのような技術で作られているか気になったことはありませんか?競合サイトの分析、技術トレンドの調査、あるいは単なる知的好奇心から、特定のサイトが使用しているCMS、プログラミング言語、サーバー、JavaScriptライブラリなどを知りたくなる場面は多々あります。
従来、これを調べるにはブラウザのデベロッパーツールを開いてHTMLソースコードやHTTPヘッダーを丹念に確認する必要がありましたが、Wappalyzerというツールを使えば、これらの情報を簡単に、そして網羅的に取得できます。Wappalyzerはもともとブラウザ拡張機能として有名ですが、その強力な技術検出エンジンをPythonプログラムから利用できるライブラリ、それがpython-wappalyzer
です。
このブログ記事では、python-wappalyzer
ライブラリに焦点を当て、そのインストール方法から基本的な使い方、結果の解釈、さらには応用的な活用法まで、詳細に解説していきます。このライブラリを使えば、複数のWebサイトの技術スタック情報をプログラムで効率的に収集・分析することが可能になります。
Wappalyzerとは?
Wappalyzerは、WebサイトやWebアプリケーションで使用されている様々な技術(テクノロジー)を識別するためのツールです。以下のような多岐にわたる情報を検出できます。
- CMS(コンテンツ管理システム): WordPress, Joomla, Drupal など
- プログラミング言語: PHP, Python, Ruby, Java など
- Webサーバー: Nginx, Apache HTTP Server, IIS など
- JavaScriptフレームワーク/ライブラリ: React, Angular, Vue.js, jQuery など
- UIフレームワーク: Bootstrap, Foundation など
- データベース: MySQL, PostgreSQL, MongoDB など
- アナリティクスツール: Google Analytics, Adobe Analytics など
- Eコマースプラットフォーム: Shopify, Magento, WooCommerce など
- CDN(コンテンツ配信ネットワーク): Cloudflare, Amazon CloudFront, Akamai など
- その他: フォントスクリプト, SEOツール, コンテナ技術 (Dockerなど), PaaS/IaaS (AWS, Azureなど)
Wappalyzerは、WebページのHTMLソースコード、HTTPヘッダー、JavaScript変数、Cookie、URLパターンなどを分析し、既知の技術パターン(フィンガープリント)と照合することで、これらの技術を特定します。これらの技術パターンは、technologies.json
(または類似のファイル)に定義されており、コミュニティによって継続的に更新されています。
もともとはブラウザ拡張機能として提供され、閲覧中のページの技術情報を手軽に確認できることから、多くのWeb開発者、デザイナー、マーケターに利用されています。python-wappalyzer
は、このWappalyzerの検出ロジックをPython環境で利用できるようにしたものです。
python-wappalyzer のインストール
python-wappalyzer
ライブラリのインストールは、Pythonのパッケージインストーラであるpip
を使って簡単に行えます。ターミナルまたはコマンドプロンプトを開き、以下のコマンドを実行してください。
あるいは、Python 3 を明示的に指定する場合は次のようにします。
注意点:
- 現在のバージョンの `python-wappalyzer` は Python 3.6 以上 が必要です。古いPython 2をサポートしていた最終バージョンは 0.2.2 でした。
- このライブラリは内部で
lxml
ライブラリを使用しています。lxml
のインストールが環境によっては難しい場合があります。もしlxml
をインストールできない環境であれば、依存関係なしでインストールし、必要なパッケージを手動でインストールする方法も提供されていますが、HTML解析の精度が落ちる可能性があります。
インストールが正常に完了すれば、Pythonスクリプトからライブラリをインポートして使用する準備が整います。
基本的な使い方
python-wappalyzer
の基本的な使い方は非常にシンプルです。主に以下のステップで構成されます。
- 必要なクラス (
Wappalyzer
,WebPage
) をインポートする。 Wappalyzer
のインスタンスを作成する。最新の技術定義ファイルを使用するのが一般的です。- 分析したいWebページのURLを指定して
WebPage
オブジェクトを作成する。 Wappalyzer
インスタンスのanalyze
関連メソッドを使って分析を実行する。- 結果(検出された技術のセットや詳細情報)を取得する。
以下に具体的なコード例を示します。
単純な技術セットの取得
カテゴリ情報付きで取得
各技術がどのカテゴリに属するかを知りたい場合は、analyze_with_categories
メソッドを使用します。
バージョンとカテゴリ情報付きで取得
検出された技術のバージョン情報(判明した場合)とカテゴリ情報を同時に取得するには、analyze_with_versions_and_categories
メソッドを使用します。
これらの基本的な使い方をマスターすれば、単一のWebサイトの技術スタックを手軽に調査できます。
コアコンポーネントの理解
python-wappalyzer
ライブラリの中心となるのは、Wappalyzer
クラスと WebPage
クラスです。
Wappalyzer クラス
このクラスは、技術検出エンジンそのものです。主な役割は以下の通りです。
- 技術定義のロード:
technologies.json
(またはそれに類するファイル)を読み込み、解析して、検出ルールのデータベースを構築します。 - 分析の実行:
WebPage
オブジェクトを受け取り、ロードされた技術定義に基づいて分析を実行します。分析メソッド (analyze
,analyze_with_categories
など) を提供します。 - インスタンス生成:
Wappalyzer.latest()
: インターネット上から最新の技術定義ファイルをダウンロードしてWappalyzer
インスタンスを生成します。常に最新の情報で分析したい場合に推奨されます。Wappalyzer.create()
: ライブラリに同梱されている技術定義ファイルを使用してインスタンスを生成します。オフライン環境や、特定のバージョンの定義ファイルで固定したい場合に使用します。- カスタム定義ファイルの利用: 特定の技術定義ファイルパスを指定してインスタンスを生成することも可能です(後述)。
WebPage クラス
このクラスは、分析対象となるWebページを表します。特定のHTTPライブラリ(例: requests
, aiohttp
)から独立した、シンプルなWebページの表現を提供します。主な役割は以下の通りです。
- コンテンツの保持: WebページのURL、HTMLコンテンツ、HTTPヘッダー、スクリプトタグ、メタタグなどの情報を保持します。
- インスタンス生成:
WebPage.new_from_url(url, ...)
: 指定されたURLからWebページを取得し、必要な情報(HTML、ヘッダーなど)を抽出してWebPage
オブジェクトを生成します。内部でHTTPリクエストを行います。タイムアウト (timeout
) や User-Agent (user_agent
)、SSL証明書の検証有無 (verify
) などを指定できます。WebPage.new_from_html(url, html, ...)
: ローカルに保存されたHTMLファイルなど、既にHTMLコンテンツを持っている場合に、URLとHTML文字列からWebPage
オブジェクトを生成します。HTTPヘッダー情報も辞書として渡すことができます。
- 情報のアクセス:
Wappalyzer
が分析に必要な情報(例:webpage.html
,webpage.headers
,webpage.scripts
など)へのアクセスを提供します。
これらのクラスが連携することで、指定されたWebページの情報(WebPage
)を、技術定義データベース(Wappalyzer
内)と照合し、使用されている技術を特定する、というプロセスが実現されます。
結果の解釈
python-wappalyzer
が返す結果は、使用する分析メソッドによって形式が異なりますが、基本的には検出された技術に関する情報が含まれます。
analyze() の結果
最もシンプルな analyze()
メソッドは、検出された技術名のセット (Set) を返します。
セットなので、順序は保証されず、重複する技術名は含まれません。単純にどの技術が使われているかだけを知りたい場合に便利です。
analyze_with_categories() の結果
このメソッドは、技術名をキーとし、その技術が属するカテゴリのリストを値とする辞書 (Dictionary) を返します。
各技術がどのような役割を果たしているか(例: CMSなのか、Webサーバーなのか)を理解するのに役立ちます。一つの技術が複数のカテゴリに属することもあります(例: NginxはWebサーバーでもあり、リバースプロキシでもある)。
analyze_with_versions_and_categories() の結果
最も詳細な情報を返すのがこのメソッドです。技術名をキーとし、カテゴリリストとバージョンリスト(検出できた場合)を含む辞書を値とする辞書 (Dictionary) を返します。
バージョン情報は常に検出できるとは限りません。検出ロジックがバージョン特定のパターンを見つけられなかった場合、'versions'
リストは空 ([]
) になります。バージョン情報が分かると、例えば特定のバージョンの脆弱性調査などに繋げることができます。
結果を解釈する際には、特にバージョン情報が常に正確であるとは限らない点に注意が必要です。Wappalyzerはパターンマッチングに基づいて推測するため、Webサイト側で意図的に情報を隠蔽していたり、特殊なカスタマイズが施されていたりすると、誤った結果や不完全な結果になる可能性があります。
結果を表形式で表示する例
取得した詳細結果を表形式で見やすく表示するPythonコード例です。(tabulate
ライブラリが必要です: pip install tabulate
)
このコードを実行すると、以下のような見やすい表が出力されます。
Technology | Categories | Detected Versions |
---|---|---|
Python | Programming languages | N/A |
Django | Web frameworks | N/A |
Cloudflare | CDN, Security | N/A |
Memcached | Cache tools | N/A |
PostgreSQL | Databases | N/A |
Google Font API | Font scripts | N/A |
※ 上記の表はあくまで表示例であり、実際の検出結果とは異なる場合があります。
応用的な使い方と機能
基本的な使い方以外にも、python-wappalyzer
はいくつかの応用的な機能を提供しています。
ローカルHTMLファイルの分析
Webサイトから直接取得する代わりに、ローカルに保存されたHTMLファイルや、プログラムで生成したHTMLコンテンツを分析することも可能です。WebPage.new_from_html()
を使用します。
カスタム技術定義ファイルの利用
特定のバージョンの技術定義ファイルを使いたい場合や、自作の定義ファイルを使いたい場合は、Wappalyzer
インスタンス生成時にファイルパスを指定できます。
リクエストパラメータのカスタマイズ
WebPage.new_from_url()
を使用する際に、HTTPリクエストの挙動をカスタマイズできます。
- タイムアウト設定:
timeout
引数で秒数を指定します (デフォルトは30秒)。 - User-Agent設定:
user_agent
引数でカスタムUser-Agent文字列を指定できます。デフォルトはライブラリ固有のものです。 - SSL証明書検証の無効化:
verify=False
を指定すると、SSL証明書の検証をスキップします(セキュリティリスクがあるため注意が必要です)。 - プロキシ設定:
proxies
引数に辞書形式でプロキシ情報を渡すことができます (例:{'http': 'http://proxy.example.com:8080', 'https': 'https://proxy.example.com:8080'}
)。
コマンドラインインターフェース (CLI)
簡単な分析であれば、Pythonスクリプトを書かずにコマンドラインから直接実行することも可能です。
これにより、検出された技術情報がJSON形式で標準出力に出力されます。いくつかのオプションも利用可能です。
--update
: 最新の技術定義ファイルをダウンロードして使用します。--user-agent <AGENT>
: カスタムUser-Agentを指定します。--timeout <SECONDS>
: リクエストのタイムアウト時間を指定します。--no-verify
: SSL証明書の検証をスキップします。
ユースケース
python-wappalyzer
は、その自動化能力により、様々な分野で活用できます。
- 競合分析: 競合他社のWebサイトがどのような技術スタックで構築されているかを調査します。これにより、競合の技術選定の傾向、強みや弱み(例: 古いバージョンのライブラリを使用しているなど)を把握し、自社の戦略立案に役立てることができます。例えば、特定のECプラットフォームやCRMを利用している競合が多い場合、それが業界標準となっている可能性を示唆します。
- 市場調査・技術トレンド分析: 特定の業界や分野の多数のWebサイトを分析し、広く使われている技術(プログラミング言語、フレームワーク、CMSなど)のシェアやトレンドを把握します。例えば、新しいJavaScriptフレームワークの採用率がどのように変化しているかなどを追跡できます。
- セキュリティリサーチ: 特定の技術(例: 特定バージョンのCMSやライブラリ)を使用しているWebサイトのリストを作成し、既知の脆弱性を持つ可能性のあるサイトを特定する初期調査に利用できます。ただし、倫理的な観点と法律を遵守し、許可なく脆弱性スキャンなどを行うべきではありません。
- リードジェネレーション: 特定の技術(例: 特定のマーケティングオートメーションツール、CRM、Eコマースプラットフォームなど)を使用している企業をリストアップし、自社製品やサービスの潜在顧客リストを作成するのに役立ちます。例えば、特定のCRMを使用している企業に対して、連携可能な自社ツールを提案するなどのアプローチが考えられます。
- 開発・移行計画: 自社で管理している複数のWebサイトの技術スタックを定期的に棚卸しし、古くなった技術のアップデート計画や、新しい技術への移行計画を立てる際の基礎データとして活用します。
- 学術研究: Web技術の普及度や変遷に関する研究において、大規模なWebサイト群の技術データを収集・分析するためのツールとして利用できます。
Pythonライブラリであるため、他のデータ処理ライブラリ(Pandasなど)やデータベース、Webフレームワーク(Flask, Djangoなど)と組み合わせることで、より高度な分析やアプリケーション開発が可能です。例えば、収集した技術データをダッシュボードで可視化したり、特定の技術変化をトリガーに通知を送るシステムなどを構築できます。
制限事項と考慮点
python-wappalyzer
は非常に便利なツールですが、利用にあたってはいくつかの制限事項と考慮点を理解しておく必要があります。
- 検出精度: Wappalyzerの検出は、HTML、ヘッダー、スクリプトなどに含まれる既知のパターンに基づいています。サイト側がこれらのパターンを意図的に隠蔽したり、標準的でない実装をしていたりする場合、技術を検出できなかったり、誤った技術を検出したりする可能性があります。特に、高度にカスタマイズされたシステムや、バックエンドだけで動作する技術の検出は難しい場合があります。バージョン情報も常に正確とは限りません。
- 動的コンテンツへの対応: JavaScriptによって動的に生成・変更されるコンテンツに含まれる技術パターンは、単純なHTML取得だけでは検出できない場合があります。ライブラリは基本的なスクリプトタグのsrc属性なども見ますが、複雑なSPA(Single Page Application)などで後からロードされるライブラリなどは見逃す可能性があります。(より高度な分析には、ヘッドレスブラウザなどが必要になる場合があります。)
-
技術定義ファイルの更新依存: 検出能力は、Wappalyzerの技術定義ファイル(
technologies.json
)の網羅性と最新性に依存します。新しい技術や、既存技術の新しいバージョンに対応するパターンが定義ファイルに追加されるまで、それらを検出することはできません。Wappalyzer.latest()
を使用することで最新の定義を利用できますが、それでもタイムラグは存在します。 - パフォーマンス: 多数のWebサイトを分析する場合、各サイトへのHTTPリクエストとコンテンツの解析には時間がかかります。特に、応答の遅いサイトや大量のデータを含むサイトがあると、全体の処理時間が長くなる可能性があります。非同期処理などを検討する必要があるかもしれません。
- リソース消費: 短時間に大量のリクエストを特定のサーバーに送信すると、対象サーバーに負荷をかける可能性があります。また、自身のネットワーク帯域やメモリも消費します。分析対象のサイト数が多い場合は、適切な待機時間を設ける、リクエスト数を制限するなどの配慮が必要です。
- 倫理的・法的側面: Webサイトの技術情報を収集する行為自体は、一般的に問題視されることは少ないですが、その情報をどのように利用するかについては注意が必要です。特に、収集した情報に基づいて脆弱性スキャンを行ったり、セキュリティ上の弱点を悪用したりすることは絶対に避けるべきです。また、サイトの利用規約によっては、自動化されたアクセスやスクレイピングが禁止されている場合もあります。常に良識と法律の範囲内で利用することが重要です。
-
Wappalyzer APIとの違い: Wappalyzerは公式にWeb APIも提供しています。このAPIは、Wappalyzer側でクロールと分析を行い、結果をJSONで返すサービスです(無料枠あり、超過分は有料)。
python-wappalyzer
ライブラリは、自身のマシン上で分析を実行するため、API利用料はかかりませんが、分析のための計算リソースやネットワーク帯域は自己負担となります。どちらを利用するかは、目的、予算、分析規模に応じて選択します。
これらの点を理解した上で、python-wappalyzer
を活用することが、効果的かつ責任ある利用につながります。
まとめ
python-wappalyzer
は、WebサイトやWebアプリケーションの技術スタックをプログラムから効率的に特定するための強力なPythonライブラリです。簡単なインストールと直感的なAPIにより、特定のURLやローカルのHTMLファイルから、使用されているCMS、フレームワーク、ライブラリ、サーバーソフトウェアなどの情報を抽出できます。
基本的な使い方から、カテゴリやバージョン情報を含めた詳細な分析、リクエストのカスタマイズ、コマンドラインでの利用など、幅広い機能を提供しています。これにより、競合分析、市場調査、セキュリティリサーチ、リードジェネレーションなど、多様な目的に応用することが可能です。
一方で、検出精度や動的コンテンツへの対応、技術定義ファイルの更新依存性といった制限事項も存在します。また、利用にあたっては、対象サイトへの負荷や倫理的・法的側面にも配慮する必要があります。
これらの特性を理解し、適切に活用することで、python-wappalyzer
はWeb技術に関する洞察を得るための貴重なツールとなるでしょう。ぜひ、あなたのプロジェクトや分析業務に取り入れてみてください!