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