Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Checking hreflang Return Links Automatically With a Small Python Crawler

2026年10月31日に「Dev.to」が公開したITニュース「Checking hreflang Return Links Automatically With a Small Python Crawler」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

ウェブサイトの多言語対応で使うhreflangタグには、互いのページを参照し合う「戻りリンク」が必要だ。この欠落は検索エンジンに無視される原因となるが、Pythonスクリプトで自動検出し、サイトが正しく評価されるよう手助けするツールを紹介する。

ITニュース解説

多言語サイトの運営は、世界中のユーザーに情報を届ける上で非常に重要だ。しかし、それぞれの言語や地域に合わせたページを正しく管理し、検索エンジンに適切に認識させるのは簡単なことではない。ここで登場するのが、HTMLの<link rel="alternate" hreflang="...">タグである。これは、あるWebページが別の言語や地域の代替ページを持っていることを検索エンジンに伝えるための仕組みだ。例えば、日本語のページがドイツ語版のページを持っている場合、このタグを使ってそのドイツ語版ページのURLを指定する。これにより、検索エンジンはユーザーの言語設定や地域に基づいて、最も適切な言語のページを検索結果に表示できるようになる。これは、検索エンジン最適化(SEO)において非常に重要な要素であり、正しく設定されていないと、せっかく用意した多言語コンテンツが検索エンジンに評価されず、ユーザーに届かない可能性もある。

hreflangタグの設定には、いくつか注意すべき点がある。その中で最もよくある問題が、「戻りリンクの欠如」だ。これは、例えば「ページA(日本語版)が、ドイツ語版としてページBを指している」と宣言しているにもかかわらず、「ページB(ドイツ語版)が、日本語版としてページAを指し返していない」という状況を指す。この一方通行のリンクは、検索エンジンにとって混乱の元となる。検索エンジンは、この2つのページが互いに「私たちはペアですよ」と確認し合っていることを期待しているため、片方だけが指している状態では、そのペア関係を無視してしまうことがあるのだ。結果として、多言語対応が不十分にしか機能せず、ユーザー体験や検索順位に悪影響を及ぼす可能性がある。

このようなhreflangの不整合は、Webサイトの規模が大きくなるにつれて手動でチェックすることが非常に困難になる。数百、数千のローカライズされたページがあるようなサイトでは、一つ一つのページを開いてHTMLソースを確認し、すべての代替ページが正しく相互参照しているかを検証する作業は途方もなく時間がかかり、人的ミスも発生しやすい。そこで役立つのが、このニュース記事で紹介されているような、自動でhreflangのチェックを行うPythonスクリプトである。システムエンジニアを目指す皆さんにとって、このような自動化ツールは、手作業の繰り返し作業から解放され、より効率的かつ正確にWebサイトの品質を保つための強力な武器となるだろう。

このスクリプトが具体的に何をするのか見てみよう。まず、チェックしたいWebページのURLリストを渡す。スクリプトはリスト内の各URLについて、以下の項目を自動で確認していく。

まず、指定されたURLにアクセスし、そのページのHTMLソースコードを取得する。そして、その中から<link rel="alternate" hreflang="...">という形式のタグをすべて探し出し、どの言語の代替ページがどのURLにあるかという情報を収集する。

次に、元のページが「私のドイツ語版はBです」と指定していた場合、スクリプトは次にそのドイツ語版のページBにアクセスする。そして、ページBのHTMLソースコードを解析し、「私の日本語版はAです」と元のページAを指し返しているかを確認する。もし指し返していない場合は、問題として記録される。

また、各ページが自分自身を指すhreflangエントリ(例えば、日本語ページが「私の日本語版は私自身です」と宣言する)を含んでいるかも確認する。これもhreflangの一般的な推奨事項であり、欠けていると問題とみなされる。

最後に、hreflangで指定された代替ページが、実際に存在し、正常にアクセスできるか(HTTPステータスコード200、つまり「OK」を返すか)も確認する。ページが存在しない(404エラー)や、サーバーエラー(5xxエラー)を返したり、意図しないリダイレクト(301, 302など、別のページへ自動的に転送されること)が発生したりする場合も、問題としてフラグが立てられる。特に、リダイレクトは検索エンジンにとって意図しない挙動と見なされることが多いため、リダイレクトを許可せずにチェックすることが重要視されている。

スクリプトの技術的な骨子を見てみよう。Pythonのrequestsライブラリは、Webページの内容をHTTPリクエストを通じて取得するために使われる。これはWebスクレイピングやAPI連携で非常によく使われる強力なツールだ。また、HTMLを解析して特定のタグや属性の情報を抽出するために、html.parserモジュールにあるHTMLParserクラスを継承したカスタムパーサーが使われている。このパーサーは、HTMLのタグを一つ一つ読み込みながら、必要なhreflang情報を見つけ出す役割を果たす。

alternatesという関数は、特定のURLからhreflang情報を効率的に取得するために設計されている。一度取得した情報はcacheという変数に保存され、同じURLに何度もアクセスする必要がないように工夫されている。これにより、スクリプトの実行速度が向上し、Webサーバーへの負荷も軽減される。User-Agentという設定で、スクリプトが何者であるかをWebサーバーに伝えることができ、またallow_redirects=Falseを設定することで、リダイレクトが発生した場合にそれをエラーとして検出できるようになっている。

check関数がスクリプトの心臓部だ。この関数は、与えられたURLリストを一つずつ処理し、前述の各チェック項目を実行する。まず、対象となるページ自体のHTTPステータスコードを確認し、問題があれば記録する。次に、そのページに自己参照のhreflangがないかを確認する。そして、そのページが宣言しているすべての代替ページについて、それぞれにアクセスし、ステータスコードをチェックし、さらに元のページへの戻りリンクが存在するかを確認する。これらのチェックで問題が見つかれば、その内容が詳細に記録されていく。

このスクリプトを実際に使用する際にはいくつかの注意点がある。例えば、URLの末尾のスラッシュの有無(例: https://example.com/de/ と https://example.com/de)は、検索エンジンやスクリプトにとっては異なるURLとして扱われるため、サイト全体でURLの形式を統一することが重要だ。また、本番環境のWebサイトに対してこのようなスクリプトを実行する際には、短時間で大量のリクエストを送らないように、time.sleepを使ってリクエストの間に短い待機時間を設けるなど、Webサーバーに配慮した「レートリミット」を行うことがマナーとされている。これにより、サーバーに過度な負荷をかけたり、悪質なアクセスと誤解されたりするのを防ぐことができる。

さらに、x-defaultというhreflang属性も理解しておくべきだ。これは、どの言語にも該当しないユーザーや、言語選択ページへの案内など、デフォルトのフォールバックページを指定するために使われる。これもhreflang設定の一部として適切に設定されているべきであり、このスクリプトを拡張してチェック対象に含めることも可能だろう。

このような自動チェックツールは、単にエラーを見つけるだけでなく、Webサイトの品質管理プロセス全体を改善する大きな可能性を秘めている。例えば、このHTMLパーサーを応用して、hreflangで指定されたURLと、そのページに設定されているcanonicalタグ(正規URLを検索エンジンに伝えるタグ)が一致しているかを検証したり、チェック結果をCSV形式で出力してコンテンツチームと共有したりすることもできる。システムエンジニアにとって、Pythonのようなプログラミング言語を使ってこのような自動化ツールを開発し、運用することは、Webサイトの複雑な問題を効率的に解決し、ビジネスの成長を支援するための重要なスキルとなる。手作業では見過ごされがちな細かな設定ミスを自動で検出し、サイト全体の信頼性と検索エンジンでの可視性を高めることができるのだ。

関連コンテンツ

関連IT用語

関連ITニュース