【ITニュース解説】Scraping Content for LLM
2025年09月07日に「Dev.to」が公開したITニュース「Scraping Content for LLM」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
AIが学習しやすいデータを作るため、Webサイトから情報を自動収集するスクレイピング技術を紹介。サイトのHTMLから広告等の不要部分を除去し、本文だけを抽出。これをAIが扱いやすいMarkdown形式に変換する手法やRSSフィードの活用法を解説。
ITニュース解説
システムエンジニアを目指す初心者の皆さんにとって、インターネット上の情報収集と活用は、これからの開発において非常に重要なスキルとなる。この記事では、特に大規模言語モデル(LLM)の活用を視野に入れ、ウェブサイトのコンテンツを効率的に収集し、利用しやすい形に変換する技術について解説する。
まず、コンテンツ収集の出発点として、「RSSフィード」という仕組みがある。これは、ウェブサイトの更新情報をXMLという標準化された形式で配信するもので、ブログの新しい記事やニュースサイトの速報などを、ユーザーが個々のサイトを訪問することなく、一元的に受け取れるようにする技術だ。記事の筆者は、自身の開発プロジェクト「Universo」や「Explore」のために、たくさんのウェブサイトから情報を集める必要があり、最初にこのRSSフィードを利用した。具体的には、各サイトのRSSフィードのURLに対してHTTPリクエスト(ウェブページを取得する際の通信)を送り、XML形式の更新情報を取得し、それをデータベースに保存して定期的に更新するという方法だ。これにより、多くの情報を自動的に、効率よく手に入れることができた。
しかし、この方法は万能ではないことがすぐに分かった。残念ながら、有名なウェブサイトであっても、RSSフィードを提供していないケースが少なくなかったのだ。RSSフィードがあれば検索エンジンのランキング向上にも役立つため、コンテンツを提供するウェブサイトには導入が推奨されるものだが、現実にはそうではないサイトも多い。
そこで、RSSフィードがないウェブサイトのコンテンツを取得するために、「スクレイピング」という技術が必要になる。スクレイピングとは、プログラムを使ってウェブサイトのHTMLコンテンツを直接取得し、そこから必要な情報を抽出するプロセスのことだ。しかし、このスクレイピングにはいくつかの課題がある。多くのウェブサイトは、robots.txtというファイルを使ってスクレイピングを許可しない範囲を指定したり、特定のIPアドレスからのアクセスをブロックしたり、あるいは自動プログラム(ボット)によるアクセスを検出して妨害したりする対策を講じている。そのため、単純にウェブサイトのURLにHTTPリクエストを送るだけでは、うまくコンテンツを取得できない場合がある。
筆者は、このスクレイピングの課題、特に「ウェブサイトのURLコンテンツをLLMが利用しやすいマークダウン形式に変換する」という問題に焦点を当てた。これは、ウェブサイトの情報を手動でコピー&ペーストしてChatGPTのようなLLMに入力する際に、リンクの書式が崩れたり、余計な情報が含まれたりして扱いにくいという経験から生まれた課題だ。そこで、スクレイピングで取得したHTMLコンテンツを、LLMが理解しやすい、整形されたマークダウン形式に自動で変換する仕組みを作ることを目指した。
この目標を達成するために、いくつかの技術やツールが使用される。 ウェブサイトからHTMLコンテンツを取得するためには、「AXIOS」や「Undici」といったHTTPリクエストを送るためのライブラリが使われる。これらは、指定したURLからウェブページの生データを取得するのに役立つ。 しかし、最近のウェブサイトはJavaScriptを多用して動的にコンテンツを生成していることが多い。このような「重い」ウェブサイトでは、単にHTMLを取得するだけでは不十分で、実際にブラウザがページをレンダリング(表示)した後の状態のコンテンツが必要となる。そのために「Puppeteer」や「Playwright」といった「ヘッドレスブラウザ」が利用される。これらは、画面表示のないブラウザをプログラムで操作し、JavaScriptの実行結果を含んだ最終的なHTMLコンテンツを取得できる。ただし、実際のブラウザを動かすため、処理速度は遅くなる傾向がある。 取得したHTMLコンテンツを解析し、必要な情報を取り出すためには、「Cheerio」や「JSDOM」といったライブラリが使われる。「Cheerio」は特に静的なHTMLコンテンツの解析に優れており、高速に動作する。
そして、最も難しい課題の一つが、取得したHTMLを「LLMが利用しやすいマークダウン形式」に変換することだ。ウェブページのHTMLには、ヘッダー、フッター、ナビゲーションメニュー、サイドバー、広告、モーダルウィンドウなど、本文とは関係のない多くの要素が含まれている。これらをそのままマークダウンに変換しても、LLMにとってはノイズとなり、理解を妨げる原因となる。
そこで筆者は、これらの不要な要素をHTMLから削除する手法を考案した。具体的には、HTML要素のクラス名やID名に基づいて、header、footer、nav、aside、.ad、script、styleなど、不要と思われる要素を特定し、プログラムでそれらを削除する処理を加えている。これにより、本文のみが抽出され、LLMにとって有用な情報に絞り込むことができる。このHTMLからマークダウンへの変換には、「turndown」や「html-to-md」、「dom-to-semantic-markdown」などの専用パッケージが活用される。
また、スクレイピングを継続的に行うための工夫も必要だ。ウェブサイトからのIPブロックを回避するためには、「プロキシローテーション」という技術が有効だ。これは、複数のプロキシサーバーを使い、アクセス元IPアドレスを定期的に切り替えることで、一つのIPアドレスからの大量アクセスと見なされないようにする方法だ。スクレイピングを行う際は、robots.txtのルールを尊重し、ウェブサイトに過度な負荷をかけないよう配慮することが重要である。さらに、画像をブロックしたり、不要なJavaScriptの実行を停止したりすることで、スクレイピング処理を高速化できるという知見も得られた。
このような技術を活用することで、単一のURLからだけでなく、GoogleやBingといった検索エンジンの検索結果ページからもコンテンツをスクレイピングすることが可能になる。これにより、さらに広範囲な情報を自動的に収集し、LLMの学習や様々なアプリケーション開発に活用できる可能性が広がる。筆者は、このスクレイピング技術をAPIとして公開することも検討しており、他の開発者がこの仕組みを利用して新たなサービスや製品を構築できるようにすることを目指している。
これらの知識は、システムエンジニアを目指す初心者にとって、ウェブサービスの仕組みやデータ収集の基本を理解し、将来のプロジェクトでLLMを効果的に活用するための土台となるだろう。特に、自動化された情報収集とデータの前処理は、現代のデータ駆動型社会においてますます重要性を増している技術である。