【ITニュース解説】Scraping an Entire Blog? Let the AI Handle Pagination (Full Code)
2025年09月10日に「Dev.to」が公開したITニュース「Scraping an Entire Blog? Let the AI Handle Pagination (Full Code)」について初心者にもわかりやすく解説しています。
ITニュース概要
Webスクレイピングで複数ページの情報を集める際、ページ送り処理は複雑で壊れやすい。AI活用APIを使えば、ページ送りを自動化し、記事タイトルやURLなどの情報を効率的に抽出できる。手動で複雑な設定を行う必要がなく、ウェブサイトの変更にも強い安定したスクレイピングが可能となる。
ITニュース解説
Webスクレイピングとは、インターネット上のウェブサイトから情報を自動的に抽出し、構造化されたデータとして収集する技術である。この技術は、市場調査、競合分析、データ分析など、多岐にわたる用途で活用される。通常、スクレイピングは特定のウェブページの内容を読み取り、必要な情報を取り出すことから始まる。しかし、一つのページからの情報収集にとどまらず、ブログやニュースサイトのように数十、あるいは数百ものページにわたって情報が点在している場合、その難易度は飛躍的に高まる。これが「ページネーション」と呼ばれる課題だ。
ページネーションとは、ウェブサイトが多数のコンテンツを一度に表示せず、複数のページに分割して表示する仕組みを指す。例えば、記事一覧の下部に「次へ」ボタンやページ番号のリンクが並んでいるのを見たことがあるだろう。単一ページのスクレイピングでは、特定のURLにアクセスし、そのページのHTML構造を解析して必要なデータを取り出せばよい。しかし、ウェブサイト全体をスクレイピングするには、現在のページから次のページへのリンクを特定し、そのリンクをたどって次のページをスクレイピングし、さらにその次のページへと、コンテンツがなくなるまでこのプロセスを自動的に繰り返す必要がある。
従来のスクレイピング方法では、このページネーションの処理が非常に厄介な部分であった。まず、ウェブページがJavaScriptを使って動的にコンテンツを読み込む場合、単にページのHTMLコードを取得するだけでは、すべての情報にアクセスできないことがある。このため、SeleniumやPlaywrightといったツールを使って、実際のブラウザを模倣し、JavaScriptの実行を待ってからコンテンツを解析する必要が生じる。次に、目的の記事リストや各記事のタイトル、URL、日付といった情報を抽出するためには、ウェブページのHTML構造を詳細に分析し、CSSセレクタやXPathといった記述方法を用いて、これらの要素を正確に特定しなければならない。さらに、「次へ」ボタンや次のページへのリンクも同様に特定し、そのリンクをクリック(あるいはURLを構築)して次のページに進むための複雑なロジックを実装する必要がある。
この手動アプローチの最大の問題点は、その脆さにある。ウェブサイトのデザインや構造が少しでも変更されると、これまで苦労して特定したセレクタやXPathが機能しなくなり、スクレイピングプログラムがすぐに動作しなくなる。例えば、開発者がHTMLのクラス名を「blog-post-item」から「post-preview」に変更しただけで、スクレイピングプログラムは機能停止に陥る。このため、一度スクレイピングプログラムを作成したら終わりではなく、ウェブサイトの変更に合わせて常に保守・修正作業を行う必要があり、これは非常に時間と労力のかかる作業であった。
このような課題を解決するために登場するのが、AIを活用したウェブスクレイピングAPIである。特に、Zyte APIの「AutoExtract」機能の一部である「articleNavigation」は、この複雑なページネーション処理とコンテンツ抽出を自動化することを目指している。API(Application Programming Interface)とは、ソフトウェア同士が連携するための窓口のようなもので、ここでは自作プログラムからZyteの提供する強力な機能を呼び出すことができる。このAIベースの機能は、単なる固定されたセレクタに依存するのではなく、ページの文脈を理解し、人間が見て記事リストや次ページへのリンクであると判断するような要素を特定する能力を持っている。
このAIを活用したスクレイピングは、具体的な実装においても非常にシンプルになる。Pythonのrequestsライブラリを使ってZyte APIにリクエストを送る際、「articleNavigation: True」という一つのパラメーターを設定するだけで、AIが裏で以下の複雑な処理をすべて自動的に実行する。
まず、ウェブページがJavaScriptを使用してコンテンツを動的に読み込んでいる場合でも、AIはまるで実際のブラウザでページを開いたかのようにレンダリングを行い、すべてのコンテンツが利用可能な状態にする。次に、AIはレンダリングされたページの中から、主要な記事リストの塊を自動的に特定する。そして、そのリスト内の各記事について、URL、見出し、日付といった重要な情報を構造化されたきれいなデータ(JSON形式)として抽出し、提供してくれる。JSON(JavaScript Object Notation)とは、データを軽量に表現するための形式で、多くのAPIで使われている。さらに、最も手間のかかる部分である「次ページへのリンク」もAIが自動的に探し出し、そのURLを結果に含めてくれる。
プログラムの準備としては、requestsライブラリでAPIと通信し、osライブラリでAPIキーを安全に管理し、csvライブラリで収集したデータを保存する。APIキーは、プログラムコード内に直接書き込む「ハードコーディング」を避け、環境変数として設定することがセキュリティの黄金律だ。環境変数とは、OSが提供する設定情報の一つで、プログラムから参照できる秘密の情報を保管するのに適している。これにより、キーが誤って公開されるリスクを減らし、コードの移植性も高まる。APIキーが環境変数に設定されていない場合は、プログラムが適切に警告を発して停止するようにする。
実際のスクレイピングロジックでは、request_listという関数を作成し、指定されたURLに対してZyte APIへリクエストを送信する。この際、先述のarticleNavigation: Trueを設定する。また、articleNavigationOptions: {"extractFrom":"browserHtml"}を指定することで、JavaScriptによってレンダリングされるコンテンツもAIが確実に認識できるように指示する。APIからの応答はJSON形式で返され、必要なすべての情報が含まれている。
ページを巡回する処理は、whileループを使って実装する。whileループとは、ある条件が真である限り、指定された処理を繰り返し実行するプログラミングの構文だ。まず、スクレイピングを開始したい最初のURLをnextPage変数に設定する。ループの各反復では、このnextPageのURLを使ってrequest_list関数を呼び出し、現在のページから記事情報を取得する。取得した記事は、全体の記事リストに追加していく。そして、APIからの応答の中に「次のページ」のURLが含まれているかどうかを確認する。もしnextPageのURLが見つかれば、それが次のループの処理対象となり、スクレイピングは継続される。もしnextPageのURLが見つからなければ、それはウェブサイトの最後のページに到達したことを意味するため、ループを終了させる。この「次のページが見つからない場合にループを終了する」というロジックは、手動スクレイピングで「次へ」ボタンが非活性化されているか、あるいは存在しないかを判定する複雑な処理と比較して、非常にシンプルで堅牢である。KeyErrorを捕捉することで、エラーを発生させずにきれいにループを抜け出すことができる。
最後に、収集したすべての記事データをCSVファイルに保存する。CSV(Comma Separated Values)ファイルとは、データをカンマで区切って記述するシンプルなテキスト形式のファイルで、表計算ソフトなどで容易に開ける。PythonのcsvライブラリにはDictWriterという便利なクラスがあり、これにより辞書のリストを簡単にCSVファイルに書き出すことができる。DictWriterは、辞書のキー(例えば「headline」や「url」)を自動的にCSVファイルの列ヘッダーとして使用してくれるため、手動でヘッダーを定義する手間が省け、構造化された出力が保証される。
このように、AIを活用したZyte APIのarticleNavigation機能を使用することで、Webスクレイピングにおける最も時間と労力を要するページネーション処理と複雑なデータ抽出の課題が大幅に簡素化される。開発者は、ウェブサイトのHTML構造の解析や、JavaScript対応、サイト変更時の保守といった手間から解放され、より本質的なデータ分析やアプリケーション開発に集中できるようになる。これにより、堅牢でスケーラブルなスクレイピングプログラムを、わずかなコードで、かつ将来のウェブサイト変更にも強い形で構築することが可能となる。