【ITニュース解説】Kleinanzeigen has two page-2 URLs. One is a redirect trap. We verified the one we shipped actually advances.
2026年09月21日に「Dev.to」が公開したITニュース「Kleinanzeigen has two page-2 URLs. One is a redirect trap. We verified the one we shipped actually advances.」について初心者にもわかりやすく解説しています。
ITニュース概要
WebサイトのページネーションURLは複雑で、見た目が似ていても正しい動きをしない場合がある。安易にURLを予測せず、実際のページから取得し、重複なく次ページに進んでいるか複数ページ離して検証することが重要だ。
ITニュース解説
ドイツのECサイト「Kleinanzeigen」の出品情報を自動で収集するツールの開発事例は、システムエンジニアを目指す初心者にとって、Webサイトから情報を効率的かつ正確に取得する「Webスクレイピング」という技術の奥深さを示す良い教材となる。このツール開発では、いくつかの技術的な課題に直面し、それを解決するための工夫が凝らされている。
まず最も重要な課題は、Kleinanzeigenサイトの「ページネーション」、つまり検索結果を複数のページに分けて表示する機能の複雑さだった。サイトには「キーワード検索」と「カテゴリ検索」の二つの検索方法が存在するが、それぞれの検索結果ページのURL(ウェブアドレス)の構造が大きく異なっていたのだ。キーワード検索の場合、例えば「自転車」で検索した際に、1ページ目は/s-fahrrad/k0、2ページ目は/s-seite:2/fahrrad/k0のように、ページ番号をURLに埋め込むことで、次のページのURLを比較的簡単に推測できる形だった。
しかし、カテゴリ検索の場合は事情が異なった。「スマートフォン」カテゴリの1ページ目が/s-smartphones/k0c173のようなURLだったため、これをキーワード検索と同様に2ページ目を/s-smartphones/seite:2/k0c173と推測してアクセスすると、誤った結果が返される「罠」があった。具体的には、元の1ページ目にリダイレクトされたり、あるいは見かけ上は成功したように見えても、実際には何も情報が表示されない空のページが返されたりした。これは、カテゴリ検索の2ページ目以降のURLには、そのカテゴリ固有の、ウェブページ上には直接表示されない隠れた情報(「handy-telekom」のような特別な文字列)が含まれているためだ。この隠れた情報は、ページのHTMLコード内に存在する「ページネーションウィジェット」という部分を解析しないと取得できない。つまり、安易にURLを推測するのではなく、ページの構造を深く読み解いて正しいURLを見つけ出す必要があった。このツールは、現在のところこの複雑なカテゴリ検索には対応せず、比較的シンプルなキーワード検索のみに焦点を当てているが、これは将来的にURLの構造が変わる可能性も考慮し、URLの推測に頼る危険性を避けるべきだという重要な教訓を示している。
次に、ページネーションが本当に次のページへ進んでいるか、つまり同じページを繰り返し表示していないかを検証する方法も工夫が必要だった。単に1ページ目と2ページ目を比較するだけでは、ページネーションが正しく機能しているか判断できない場合がある。Kleinanzeigenのような広告サイトでは、特定のプロモーション広告が常にページのトップ付近に表示されることがあるため、1ページ目と2ページ目を比較すると、これらの広告が重複して表示され、結果が正しく進んでいないように見えてしまうことがあるのだ。実際に自転車の検索結果で確認したところ、27件の広告のうち8件が1ページ目と2ページ目で重複していた。
そこで、このツールでは、2ページ以上離れたページ、具体的には1ページ目と3ページ目を比較することで、ページネーションが正しく機能しているかを検証した。その結果、1ページ目と3ページ目では、重複する広告が一切なく、両方のページで全く異なる27件のユニークな広告IDが取得できた。これは、ページネーションが実際に次の結果セットに進んでいる明確な証拠となる。隣接するページ間の重複はプロモーション広告によるものであり、システムのバグではないことが確認でき、最終的に収集されたデータセットでは、広告IDに基づいて全ての重複が排除されるため、プロモーション広告が複数ページに表示されても、最終的には1件のデータとして扱われる。
さらに、収集するデータの一つである「価格」情報の扱いにも細心の注意が払われた。Kleinanzeigenでは、商品の価格が「150ユーロ」のような数値で表示されるだけでなく、「VB」(Verhandlungsbasis、応相談の意味)や「Zu verschenken」(贈呈、無料の意味)といったテキストで表示されるケースや、価格自体が表示されないケースも多い。このツールでは、price_rawという項目にはウェブサイトに表示されている価格の生のテキスト(例: "390 € VB")を常にそのまま記録する。一方で、price_amountという項目には、数値として解析できた場合にのみ価格を記録し、数値がない場合はnull(データがないことを示す特別な値)として扱う。これは、数値として解析できない「VB」や「贈呈」といった価格を、データ解析の失敗としてではなく、むしろ「交渉可能」や「無料」といった正当な情報として扱うためだ。もしnullを単なるデータ欠落と見なして処理してしまうと、これらの重要な出品情報が分析から漏れてしまう可能性がある。
また、出品情報の「所在地」を正確に抽出する際にも工夫が凝らされている。Kleinanzeigenのリスティングカードでは、所在地情報と、そのすぐ隣に日付や時刻を示すタイムスタンプが、Webページの構造上非常に近い位置に配置されている。このため、安易に「次のテキスト要素を取得する」という方法を使ってしまうと、意図せずタイムスタンプを所在地として誤って取得してしまう可能性があった。そこで、このツールでは、所在地情報に必ず付随する「ピンアイコン」(svg[data-title="locationOutline"]というHTML要素)を明確な目印(アンカー)として利用することで、他の情報と混同することなく、正確な所在地情報のみを抽出できるようにしている。これは、Webページの構造を深く理解し、確実な目印を見つけることの重要性を示している。
検索キーワードに対して結果が何も見つからなかった場合の処理についても考慮されている。たとえ検索結果がゼロ件であっても、このツールはエラーとはみなさず、そのキーワードに対する処理は成功として完了し、次のキーワードの処理へと進む。これは、Webサイト自体が検索結果ゼロ件の場合もエラーとはせず、「回答済みの検索」として表示するため、ツールもそれに合わせた振る舞いをする。複数のキーワードを一度に検索する場合、そのうちのどれかが空の結果だったとしても、全体の処理は中断せず最後まで実行される。
Webスクレイピングを行う上で、対象のWebサイトが自動収集ツールに対する防御策(アンチボット対策)を講じているかどうかも重要な点だ。現在のところ、Kleinanzeigenのキーワード検索ページでは目立ったアンチボット対策は確認されていない。しかし、将来的に対策が導入される可能性を考慮し、このツールには既に様々な対策が組み込まれている。例えば、ドイツに固定された居住者プロキシ(IPアドレスを隠す仕組み)の使用、ChromeとFirefoxの異なるTLSプロファイルを使用したブラウザの偽装、そしてエラーが発生した場合に一定時間待機してから再試行する指数バックオフ(Exponential Backoff)と最大5回のリトライ機構などだ。これにより、もしKleinanzeigenが将来的に自動アクセスをブロックし始めたとしても、ツールの設定を変更することなく、ある程度の対処が可能になっている。
このツールが最終的に取得できるデータは、広告ID、タイトル、説明の抜粋、価格(数値と生のテキスト)、通貨、所在地、郵便番号、画像URL、リスティングURL、配送の可否、出品者が個人か法人かを示す情報、そしてデータが取得された時刻(ISO-8601形式のタイムスタンプ)など、一つの出品情報につき一行の形式で、整理された情報となる。また、複数のキーワードで検索した場合でも、全ての検索結果は広告IDに基づいて統合され、重複する情報は自動的に排除されるため、クリーンなデータセットが得られる。料金体系は、一回の実行につき少額の基本料金がかかり、それに加えて実際に取得できたリスティングの行数に応じて課金される仕組みだ。これらの詳細な説明から、Webスクレイピングという技術がいかに奥深く、そして具体的な課題解決のためにどれほどの技術的な工夫が凝らされているかが理解できるだろう。単にWebサイトの情報を機械的に抜き出すだけでなく、対象サイトの特性を深く理解し、予測される問題を事前に考慮した堅牢な設計が求められることがわかる。