XMLSiteMap プログラム仕様

XMLサイトマップを生成するためのウェブクローラー

概要:

指定されたルートURLからウェブページを再帰的にクロールし、各ページのタイトル、 最終更新日時(Last-Modifiedヘッダーから)、およびURLを含むXMLサイトマップを作成します。

詳細説明:

このスクリプトは、コマンドライン引数で指定された、またはデフォルトのルートURLからクロールを開始します。 HTTPリクエストを送信し、HTMLコンテンツから関連するリンクを抽出します。 抽出されたリンクは同じドメイン内のものであれば再帰的にクロールされます。 各ページについて、titleタグからタイトルを抽出し、HTTPレスポンスヘッダーの Last-Modifiedフィールドから最終更新日時を取得します。 収集されたすべてのURLとそれに対応するメタデータ(タイトル、最終更新日時)は、 Sitemapプロトコルに準拠したXMLサイトマップとして整形され、指定されたファイルに出力されます。 クエリパラメータを含むURLも適切に処理され、対象は.html/.shtmlファイルまたはディレクトリパスに限定されます。

関連リンク:

XMLSiteMap_usage

web.XMLSiteMap.clean_html_content(html_content)
概要:

HTMLコンテンツから余分な空白文字や改行を削除し、整形します。

詳細説明:

この関数は、HTMLコンテンツ内の複数の連続する空白文字や改行文字を単一のスペースに変換し、 文字列の前後の空白をトリムすることで、コンテンツをきれいにします。 これは、HTMLの解析やテキスト抽出を容易にするために行われます。

引数:
param html_content:

処理対象のHTML文字列。

type html_content:

str

戻り値:
returns:

整形されたHTML文字列。

rtype:

str

web.XMLSiteMap.crawl_recursive(start_url, visited, base_domain, parent='')
概要:

指定された開始URLから再帰的にリンクをたどり、各ページのタイトルと最終更新日時を収集します。

詳細説明:

この関数は、まずURLを標準化し、既に訪問済みのURLはスキップします。 次にrequestsライブラリを使用してURLからコンテンツを取得し、文字コードを検出してデコードします。 HTTPヘッダーからLast-Modified情報を抽出し、YYYY-MM-DD形式にフォーマットします。 その後、HTMLコンテンツからページのタイトルと、同じドメイン内の他のリンクを抽出します。 最後に、抽出されたリンク(対象URLのみ)に対して再帰的にこの関数を呼び出し、 全ての関連するページ情報を収集します。

引数:
param start_url:

クロールを開始するURL。

type start_url:

str

param visited:

既に訪問済みの正規化されたURLを格納するセット。

type visited:

set

param base_domain:

クロール対象を制限するベースドメイン。このドメイン外のURLはスキップされます。

type base_domain:

str

param parent:

現在クロール中のURLの親URL(エラーメッセージ用)。デフォルトは空文字列。

type parent:

str

戻り値:
returns:

クロールされた全てのURLと、それに対応するタイトルおよびLast-Modified日時を含む辞書。 エラーが発生した場合は空の辞書を返します。

rtype:

dict[str, dict[str, str | None]]

web.XMLSiteMap.detect_encoding(response_content)
概要:

HTTPレスポンスのバイトコンテンツから最も適切な文字エンコーディングを検出します。

詳細説明:

charset_normalizerライブラリを利用して、与えられたバイト列の文字コードを自動的に判別します。 これにより、様々なエンコーディングで提供されるウェブページを正しくデコードできます。

引数:
param response_content:

HTTPレスポンスのバイト列コンテンツ。

type response_content:

bytes

戻り値:
returns:

検出された文字エンコーディングの文字列。

rtype:

str

web.XMLSiteMap.find_urls_in_html(html_content, base_url)
概要:

HTMLコンテンツ内からすべてのリンク(href, src, url属性)を抽出し、絶対URLに変換します。

詳細説明:

この関数は、HTMLコンテンツ内のアンカータグのhref属性、画像タグのsrc属性、 JavaScript内のurlプロパティなどを正規表現で検索します。 見つかった相対URLはurljoinを使用して絶対URLに変換され、クロール対象のURLのみがセットとして返されます。

引数:
param html_content:

リンクを抽出するHTML文字列。

type html_content:

str

param base_url:

相対URLを解決するための基準URL。

type base_url:

str

戻り値:
returns:

抽出され、標準化された絶対URLのセット。

rtype:

set[str]

web.XMLSiteMap.generate_xml_sitemap_with_metadata(urls_with_metadata, output_file=None)
概要:

収集されたURLとそのメタデータ(タイトル、最終更新日時)から、 Sitemapプロトコルに準拠したXMLサイトマップファイルを生成します。

詳細説明:

xml.etree.ElementTreeを使用して、urlset、url、loc、title、 lastmod、changefreq、priorityといったSitemapプロトコル要素を含むXML構造を構築します。 titleとlastmodは収集されたメタデータから設定されます。 XMLは整形され(pretty-print)、指定された出力ファイルにUTF-8エンコーディングで保存されます。 output_fileが指定されない場合、グローバル変数outpathが使用されます。

引数:
param urls_with_metadata:

URLをキーとし、タイトルとLast-Modified日時を値とする辞書。

type urls_with_metadata:

dict[str, dict[str, str | None]]

param output_file:

サイトマップを保存するファイルパス。省略された場合はグローバル設定に従います。

type output_file:

str, optional

戻り値:
returns:

なし。サイトマップファイルが指定されたパスに生成されます。

rtype:

None

web.XMLSiteMap.get_page_title(html_content)
概要:

HTMLコンテンツからページのタイトルを抽出します。

詳細説明:

正規表現を使用してtitleタグの内容を検索し、そのテキストを返します。 タイトルが見つからない場合は、「No Title」を返します。検索は大文字小文字を区別しません。

引数:
param html_content:

タイトルを抽出するHTML文字列。

type html_content:

str

戻り値:
returns:

抽出されたページのタイトル、または「No Title」。

rtype:

str

web.XMLSiteMap.is_target_url(url)
概要:

指定されたURLがクロールの対象となるHTMLページまたはディレクトリパスであるかを判定します。

詳細説明:

この関数はURLを解析し、そのパスが.htmlまたは.shtmlで終わるか、 あるいはスラッシュ/で終わる(ディレクトリを示唆する)場合にTrueを返します。 これにより、画像、CSS、JavaScriptなどの非HTMLリソースがクロール対象から除外されます。

引数:
param url:

判定するURL。

type url:

str

戻り値:
returns:

URLが対象の場合True、それ以外はFalse。

rtype:

bool

web.XMLSiteMap.main()
概要:

XMLサイトマップ生成スクリプトのメイン実行関数です。

詳細説明:

この関数は、まず訪問済みURLを記録するためのセットを初期化します。 次にRootURLからcrawl_recursive関数を呼び出してウェブサイトのクロールを開始します。 クロールによって見つかった全てのURLとそのメタデータ(タイトル、最終更新日時)をコンソールに出力し、 generate_xml_sitemap_with_metadata関数を呼び出して、 収集した情報に基づいてXMLサイトマップを生成し、ファイルに保存します。

引数:
param None:

引数なし。

戻り値:
returns:

なし。サイドエフェクトとしてサイトマップファイルが生成されます。

rtype:

None

web.XMLSiteMap.normalize_url(url)
概要:

URLを標準化し、フラグメント(#以降の部分)を削除します。

詳細説明:

クエリパラメータは保持しつつ、URLのフラグメント部分(ページ内の特定の位置を示す部分)を 削除することで、同じコンテンツを指す異なるURLが重複して処理されるのを防ぎます。 これにより、サイトマップのURLの重複を避けることができます。

引数:
param url:

標準化するURL。

type url:

str

戻り値:
returns:

フラグメントが削除された標準化されたURL。

rtype:

str