LLMを使って99%のウェブサイトをスクレイピングする方法

AI活用・導入
この記事は約20分で読めます。

この動画では、大規模言語モデルを活用した革新的なウェブスクレイピング手法について解説している。従来の手動的なスクレイピング手法から、AIエージェントを用いた自律的なデータ抽出システムへの転換点を示し、シンプルな公開サイトから複雑なインタラクションが必要なサイトまで、三つのカテゴリーに分けて実践的なソリューションを提供している。特に注目すべきは、AgentQLなどの新しいツールを使用してブラウザ操作を自動化し、人間のような複雑なウェブインタラクションを実現する方法である。

This is how I scrape 99% websites via LLM
How to do web scraping with LLM in 2024Use AgentQL to scrape website for free: 🔗 Links- Get full code breakdown & Join A...

LLMによるウェブスクレイピングの革命

今日は、大規模なインターネットデータをスクレイピングする最適な実践方法と、さらには人間のようにブラウザと相互作用してUpworkでウェブスクレイピングタスクを自律的に完了できるエージェント型ウェブスクレイパーの構築方法をお見せしたいと思います。

ウェブスクレイピングは、特に2024年においてAIによって劇的に変革された産業の一つです。従来、アグリゲーターやeコマースのような多くのインターネットビジネスは、価格とオファーが最も競争力があることを確認するために、インターネットからデータをスクレイピングするだけで膨大なエンジニアリングリソースを費やしていました。

通常の方法では、ウェブブラウザを模倣してURLに対してシンプルなHTTPリクエストを行い、HTMLを取得してから、必要な情報を含むDOMエレメントをマップするための非常に具体的な解析関数を記述していました。これは各ウェブサイト構造が異なるため、ウェブサイトごとに非常に具体的でカスタムビルドする必要がありました。そしてウェブサイト構造が変更されるたびに、以前のスクリプトは一般的に動作しなくなります。これが、企業が異なるスクレイピングシステムの構築とメンテナンスに膨大なエンジニアリングリソースを費やしていた理由です。

しかし、これらの大手インターネット企業以外にも、Upworkのようなフリーランサーウェブサイトに行ってウェブスクレイパーを検索すると、ビジネスが価値のある特定のスクレイパーの構築を誰かに依頼したいという大量の求人投稿が毎時間投稿されています。使用事例は複数の異なるカテゴリーにわたり、リード生成、リサーチ、競合価格の監視と分析、市場調査、求人リストの取得など、多岐にわたります。

膨大な数のロングテール使用事例があり、中小企業がそれを求めているものの、以前は良いコスト効率的なソリューションを見つけることができませんでした。しかし、大規模言語モデルとエージェントシステムの最新開発により、このようなウェブスクレイパーの構築コストは劇的に減少しました。実際、従来の時間とコストのほんの一部で、これらのUpworkタスクの大部分を満たすことができるエージェント型スクレイパーを構築することができます。

今日は、シンプルでパブリックなウェブサイトから、非常に複雑なウェブインタラクションを必要とするスクレイピングワークフローまで、三つの異なるバケットに分けて、これらのタスクのいくつかを完了する方法の例をお見せします。

シンプルなパブリックサイトのスクレイピング

まず、パブリックでシンプルなウェブサイトについて話しましょう。これらは認証や支払いによってゲートされていないウェブサイトです。Wikipediaページや異なるB2B企業ウェブサイトのようなものを考えてください。これらのウェブサイトは従来、構造が非常にダイナミックであるため、スクレイピングが非常に困難でした。それぞれが何らかのカスタムビルドを必要としていました。

これは大規模言語モデルが真にゲームチェンジャーとなった最初の分野です。なぜなら、二つの機能を導入したからです。一つは、煩雑で非構造化されたデータから構造化された情報を抽出する能力です。これは、大規模言語モデルに煩雑な生HTMLを提供するだけで、何千もの情報を精査し、有用な情報を抽出できることを意味します。

OpenAIの構造化出力機能により、このタイプのデータ抽出は非常に信頼性が高くなりました。キャプチャしたい非常に具体的なデータ構造を定義するだけで、常に100%その構造に従います。

データ抽出とは別に、エージェントの推論能力を活用して、より洗練されたスクレイピング動作を構築することもできます。例えば、B2B企業研究を行っている場合、要件とフローがもう少し曖昧になることがあります。企業ウェブサイトはあるが、必要なデータがどの特定のページに含まれているかわからない場合があります。しかし、大規模言語モデルのエージェント動作により、ウェブサイトが提供されたら、必要な情報を見つけるまで複数の異なるページをナビゲートし、最終的にすべての情報を集約できるウェブスクレイパーエージェントを実際に構築できます。

このタイプの大規模言語モデルベースのスクレイパーエージェントは非常に強力ですが、これでウェブスクレイパーの問題がすでに解決されたということでしょうか?実際のところ、そうではありません。

複雑なウェブインタラクションが必要なサイト

多くの場合、必要な情報を取得するために複雑なウェブインタラクションを必要とするウェブサイトがあります。例えば、多くのニュースウェブサイトは、コンテンツを取得するためにサブスクリプションログインを必要とします。また、コンテンツの取得を妨げるポップアップがウェブサイトにある場合もあります。キャプチャなどのあらゆる種類の異なるアンチボット機構は言うまでもありません。

一部のデータでは、必要な結果を収集するために複数の異なるアクションを必要とする場合があります。このタイプのウェブサイトでは、データを取得するために人間のインタラクションを実際にシミュレートする方法が必要です。

これは私が見る二番目のタイプの使用事例です。これらは少し複雑ですが、そのデータを取得するプロセスは非常に具体的で反復的になることができるウェブサイトです。このタイプの使用事例は、実際にUpworkで見た異なる使用事例の70〜80%を占めています。最後に、その方法の例をお見せします。

最後に、ウェブインタラクションシミュレーションだけでなく、複雑な推論タスクも必要とする特定のタイプの使用事例があります。例えば、ここでのユーザーリクエストは、「メルボルンへの次の2ヶ月間で最も安いフライトを見つけて」や「特定の予算と期間内で特定のコンサートのチケットを購入して」などのように、より曖昧になります。

このタイプの使用事例は、はるかに洗練されたエージェント推論能力を必要とし、私の経験では非常に実験的ですが、この種のフロンティア使用事例を実験しているプラットフォームもあります。

実装のベストプラクティス

各カテゴリーでウェブスクレイピングを実装する最適な実践方法をお見せします。

まず、パブリックでシンプルなウェブサイトのスクレイピングのベストプラクティスについて話しましょう。前述のように、OpenAIの構造化出力機能の助けを借りて、生のウェブサイトHTMLから構造化された情報を抽出できます。また、探している情報を取得するために複数の異なるページをナビゲートできるエージェントシステムも構築します。

2024年以前は、ほとんどの人が生のHTMLを大規模言語モデルに提供していました。これは多くの場合機能しましたが、生のHTMLには多くのノイズがあるため、結果が不正確になる可能性があり、より多くのトークンを燃焼するためより多くを費やすことになります。

しかし、今年、大規模言語モデル最適化ウェブコンテンツを提供するさまざまなサービスが出現し始めました。このカテゴリーのサービスはFireCrawlによって開始されました。ウェブサイトURLを提供すると、生のHTMLを返す代わりに、より人間が読みやすいマークダウンファイルに変換できます。これは、大規模言語モデルにとっても消費しやすくなることを意味します。

現在、大規模言語モデルとエージェントのためにウェブコンテンツを劇的に最適化することを目的とした、このようなサービスを提供するいくつかの異なるプレイヤーとサービスがあります。

FireCrawl以外にもJina AIがあります。Jina AIは非常に似たことを行うReader APIを導入しましたが、Jina AIについて本当に興味深いのは、ボリュームが小さい場合は基本的に無料で使用できることです。認証を必要としないAPIがあり、任意のウェブサイトに行って「https」を追加し、「r.jina.ai」を追加するだけで、ウェブサイトページを自動的にマークダウン形式に変換します。このように、何の種類のAPIキーもなしに無料でこれを使用できるのは非常に驚異的です。誰が請求書を支払っているのかわかりませんが、ボリュームが大きくない限り、実際には料金を請求されません。

一方、Spider Cloudというプラットフォームもあります。FireCrawlとJinaを本番環境に導入する際、使用量のスパイクによってJinaとFireCrawlがエラーを出し、ウェブサイトコンテンツを返せないという問題が時々発生しました。しかし、Spider Cloudは毎分50,000ページのスクレイピングをサポートしており、これは非常識なレート制限です。

一方、各サービスからのコンテンツはすべてマークダウンですが、それでもわずかな違いがあります。例えば、私の場所の近くの地元レストランをスクレイピングするために両方のサービスを使用してみました。結果を見ると、異なるサービスから返される結果がわずかに異なることがわかります。FireCrawlは116行のマークダウンファイルを持ち、Jinaは59行のマークダウンで、Spider Cloudは68行のマークダウンです。

私の観察では、FireCrawlはウェブサイトからできるだけ多くの情報をキャプチャしようとする傾向があります。Jina APIは主要なテキストコンテンツ自体に本当に焦点を当てようとし、Spider Cloudはその中間で、リンクをキャプチャして非常に人間が読みやすいマークダウン形式に変換しようとします。

一般的に、返されるコンテンツに関してもいくつかの異なる違いがあり、使用事例に基づいて最適なものを選択できます。最後に、これらもコストがかかります。100ページスクレイピングあたりのコストは、前述のようにJinaは基本的に無料、Spider Cloudは100ページあたり約3セント、FireCrawlは最高ティアで100ページあたり約6セントです。

以前に作成したエージェント型スクレイパーの例では、FireCrawlを使用してウェブサイトからマークダウンデータを取得し、GPTモデルを使用して関心のある特定の情報を抽出できます。ウェブサイト全体の完全なメニューアイテムを左側のようなJSONデータに取得するために、複数の異なるページを通過できます。

このタイプのエージェントに最適化できる機能はさらにあります。より大きなデータ量をスクレイピングでき、既にスクレイピングしたURLを記憶してもう一度同じアクションを取らないように、エージェントメモリの保存方法を最適化したり、llama PDFパーサーやExa検索などの新しいデータソースと統合したりできます。

興味があれば、詳細なコードブレークダウンと共に、ウェブスクレイピングと研究用のすぐに使用できるエージェントテンプレートを持つ私のコミュニティに参加できます。下のリンクをクリックして私のコミュニティに参加し、エージェントテンプレートを取得してください。

複雑なインタラクションが必要なサイトへの対応

これがパブリックでシンプルな最初のタイプのウェブサイトで、コンテンツをスクレイピングするエージェントを単純に構築できます。次は、それほどシンプルではなく、コンテンツをブロックするポップアップがあったり、ログイン認証が必要だったり、完全なコンテンツを取得するためにページネーションと相互作用する必要があったりする、複雑なウェブインタラクションを必要とするウェブサイトです。

このウェブサイトに対処するために、ウェブブラウザとの人間のインタラクションを模倣する必要があります。これらのウェブサイトインタラクションをシミュレートするために、Selenium、Puppeteer、Playwrightなどのパッケージが一般的に使用されます。これらのパッケージは当初ウェブアプリQAテスト用に設計されましたが、現在はこれらのエージェントスクレイパーに使用できます。

ウェブブラウザインタラクションをシミュレートできるエージェント型スクレイパーを構築する困難な部分は、相互作用する適切なUI要素を特定する方法です。例えば、ウェブエージェントが場所の検索ボックスに入力できるようにしたい場合、エージェントがウェブブラウザと通信し、どの入力が検索ボックスかを知るための効果的な方法が必要です。

一部のウェブサイトは、LinkedInのこのログインページのように、さらに複雑になることがあります。三つの異なるサインインボタンがあります。大規模言語モデルにウェブページ全体を提供し、相互作用する適切なUI要素を抽出するよう求めるだけでは、しばしば機能しませんでした。

ここでAgentQLというパッケージが非常に便利であることがわかりました。基本的な構築モデルを使用して、相互作用する適切なUI要素と、必要な情報を含む適切なDOMを特定できるようにし、Playwrightにウェブインタラクションをシミュレートする適切な指示を与えることができます。

これにより、さまざまな種類のポップアップウィンドウやクッキーダイアログを閉じたり、認証を必要とするウェブサイトにログインしたりする全体的なウェブ自動化を行うことができます。必要なのは、SDKを使用して、自然言語で取得したいUI要素を渡すことだけです。

実際のUpwork案件での実践例

AgentQLを完全に活用してそのようなウェブスクレイピングを構築する方法を示すために、ここでいくつかのUpwork案件のスクレイパーを提供する方法をショーケースするのが興味深いと思いました。

これは3週間前のもので、ID Listというウェブサイトのスクレイパーを構築したいというものです。これは非営利とボランティア作業の求人市場のように見えます。彼らは毎週広告されたすべての求人を取得し、組織名、職種、給与を含む大きなリストを取得して、役職の種類と場所で簡単にソートし、クライアントが給与設定でより良い仕事をするのを助けたいと考えています。

ID Listに行くと、このウェブサイトは実際にログインが必要で、「私はロボットではありません」チェックボックスという少しアンチボット対策もあり、それをどのように通過するかもショーケースします。ログインすると、ページネーションがある異なる求人のリストがあります。AgentQLを使用してここで求人詳細データを抽出し、異なるページネーションをナビゲートする方法を学ぶ必要があります。

AgentQLの実装

まず、AgentQLでアカウントを作成し、Chrome拡張機能をダウンロードして、実際にどのように機能するかを理解しましょう。拡張機能をインストールした後、スクレイピングしたいウェブサイトに行き、右クリックで検査を開きます。ここにAgentQLという新しいタブがあります。

AgentQLウェブサイトから取得するAPIキーをここに入力する必要があります。これで実験を開始できます。キャプチャしたいアイテムのクエリを渡すだけです。例えば、求人結果の数を取得したい場合、「求人投稿総数」のようなものをここに入力し、データを取得します。すると、ここにある3,258というデータが返されます。

一方で、配列も定義できます。この場合、求人投稿を定義し、ここに配列記号を置き、各求人投稿内で組織名、職種、場所、給与、契約タイプ、リモートタイプについて知りたいです。自明でない可能性のあるアイテムについては、さらなる説明も追加できます。契約タイプについて、フルタイムまたは契約またはパートタイムと定義できます。

下のデータ取得をクリックすると、会社名、職種、場所、給与、契約タイプ、リモートタイプを含む、その特定ページのすべての求人投稿を抽出した結果が表示されます。この拡張機能により、どのタイプのクエリが実際に機能し、必要な結果を返すかをデバッグしてテストできます。

一方で、ログインフロー全体のUI要素を特定できるかもテストしたいと思います。今回は、ログインフォーム、メール入力、続行ボタンを試してみます。AgentQLがログインフォーム内の続行ボタンを取得する必要があることを知るために、構造を提供するのが有用です。

ウェブ要素を取得してみましょう。素晴らしい!メール入力と続行ボタンの二つのUI要素が正常に返されました。これは非常に有望に見えます。今度は実際にPythonに行って、ウェブサイトにログインできる自動化を構築できます。

Pythonでの自動化スクリプト作成

GitHubリポジトリを開始し、Cursorでフォルダを開きます。まず、AgentQLをインストールしましょう。新しい仮想環境を最初に設定します。Cursorにいるので、Command+Kで新しいPython環境を設定できます。自動的にコマンドラインが生成されます。

現在この新しい環境にいるので、最初に行う必要があるのは、これをコピーしてAgentQLをインストールし、プロジェクトを開始することです。その後、ここで.envファイルを作成し、AgentQL APIキーとID Listにログインするためのメールとパスワードを入力します。

その後、scrapper.pyを作成し、使用するいくつかの異なるライブラリをインポートし、ここに入れた環境変数をロードします。まず、メール入力を見つけてメール入力に入力し、「私はロボットではありません」チェックボックスをクリックし、続行をクリックしてログインできるスクリプトを構築したいと思います。

最初に、初期URLとメール入力クエリというクエリを定義します。これは、メール入力と続行ボタンを持つログインフォームが必要です。「私はロボットではありません」チェックボックスは最初に画面に表示されないため、実際には含めませんでした。この確認「ロボットではありません」チェックボックスを取得するために、verify_queryというもう一つを作成する必要があります。

試してみましょう。最初にPlaywrightでウェブセッションを開始し、AgentQLで新しいページを開始します。まず、page.go_toでURLに移動し、メール入力フォームをクエリします。メール入力フィールドにメールアドレスを入力するよう求め、確認人間UI要素が表示されるまで1,000ミリ秒待ち、その特定の要素をクエリし、AIに「私はロボットではありません」チェックボックスをチェックするよう求めて動作するかを確認し、最後に続行ボタンをクリックしてログインします。

これを試してみましょう。保存してからターミナルを開き、python scrapper.pyを実行します。envをインストールする必要があるようです。Command+Kをもう一度開き、「no module named .env」エラーメッセージを与えて送信します。今度は試してみましょう。

Playwrightをインストールする必要があるようなエラーが出ました。playwright installを実行します。Playwrightは、ウェブブラウザセッションをシミュレートするために使用するライブラリです。インストールが完了したので、もう一度試してみましょう。

新しいブラウザを開き、メール入力を特定してメールアドレスを入力し、「私はロボットではありません」チェックボックスが表示された後、チェックボックスを選択してログインボタンをクリックしているのがわかります。次にパスワード入力が表示されます。これは機能しており、「私はロボットではありません」チェックボックスをクリックできるのは実際にかなり面白いです。ウェブサイトを構築している場合は、アンチボットメカニズムとしてそれに依存しないでください。

このログイン機能の最後のクエリ、パスワード入力を追加します。パスワード入力をクエリし、パスワードを入力し、1秒待って続行ボタンをクリックします。最後にログインが完了するまで待ち、その後、後でロードできるファイルとしてこのログイン状態を保存するためにbrowser.context.storage_stateを追加します。これにより、このようなログインプロセスを再度繰り返す必要がなくなります。

デモ目的で、最後に待機時間を追加して結果を確認できるようにします。メールアドレスを入力し、「私はロボットではありません」ボタンをクリックし、ログインをクリック、パスワード、再度ログインをクリックします。素晴らしい!私のパスワードとメールでこのプラットフォームに正常にログインでき、ログイン状態を保存するidealist_login.jsonというファイルが表示されます。これにより、後でロードできます。

この全体をloginという関数の下にまとめ、求人投稿をスクレイピングするメイン関数の新しいセッションを開始します。ファイルが存在しない場合は、このログイン関数を呼び出し、存在する場合は、再度ログインする必要がないようにファイルを直接ロードします。状態をロードし、求人投稿ページであるここで定義したURLに移動します。これでほぼ完了です。ここで定義した関数を呼び出します。

求人データの完全取得

複数の異なるページネーションにわたって完全な求人投稿コンテンツを取得するスクリプトの残りを構築できます。二つの新しいクエリを作成します。一つは以前にChrome拡張機能でテストした求人投稿クエリ、もう一つは次のページボタンも取得したいページネーションクエリです。これにより、エージェントが次のページに移動できます。

最初に状態をtrueに設定し、次のページボタンをクリックする前に現在のURLを取得します。まず、AgentQLから求人投稿データを取得し、そのデータを取得した後、ページネーションも取得して次のページボタンをクリックします。完了まで待った後、URLが実際に変更されたかを確認します。URLが変更された場合、それはまだ最後のページではないことを意味するため、すべてのページをスクレイピングするまで続行します。

ターミナルを開いてpython scrapper.pyを実行できます。最後に、求人投稿データについても、AirtableやGoogleシートに保存したいと思います。AirtableのAPIキー、ベースID、テーブル名の新しい認証情報を.envファイルに追加します。

Airtable APIに慣れていない場合、基本的にAirtableベースを作成でき、ベースIDは基本的にURLのこの部分で、テーブルIDは「tbl」の後のものです。これら二つをコピーするだけで、Builder Hubに行き、新しいトークンを作成し、名前AgentQLを与え、読み書きスコープを追加し、完全なワークスペースへのアクセスを与え、APIキーをコピーしてここに入れます。

py-airtableという新しいパッケージをインポートします。インストールしていない場合は、ターミナルを開いてpip installを実行してください。これらの認証情報をロードし、Jsonのリストを取得してAirtableにデータを保存するpush_data_to_airtableという関数を作成します。メイン関数に行き、このpush_to_airtable関数を呼び出します。これでほぼ完了です。

ID Listを開き、スクレイピングを開始する予定です。同時に、Airtableを開いて、情報が追加されるかどうかを並べて確認しましょう。素晴らしい!右側で、一部の給与が空のようですが、情報が自動的にプッシュされているのがわかります。一部の求人には実際に給与データがなかったようで、それが理由でしょう。

1ページが完了すると、次のページにナビゲートし、すべてのページが完了するまで新しいデータを追加し続けます。これは、さまざまな部分に触れるため、実際に行うのは非常に困難な自動化です。最も良い部分は、ここで構築したスクリプトが他の求人投稿ウェブサイトに自動的に適用できることです。プロセスとワークフローは非常に似ており、ログインを行い、完全な求人投稿データをスクレイピングするためのページネーションを処理します。

その後できることは、Airtableのデータを更新し続けるために、1時間ごとまたは毎日ジョブをスケジュールすることです。しかし、これは一つの例にすぎません。異なるeコマースウェブサイトから価格データを収集して比較するなど、非常に多くのウェブ自動化ができることを想像できます。

これは、複雑だが非常に予測可能で既知のプロセスを持つウェブサイトの第2カテゴリーです。前述のように、この第2カテゴリーは、私が見た人々がすでに投稿しているさまざまな求人とリクエストの60〜80%を占めています

高度なエージェント推論が必要なケース

最後のカテゴリーは、ユーザーリクエストが少し曖昧で、非常に明確に定義されたステップバイステップワークフローではないタイプのシナリオです。例えば、特定の期間中の最も安いフライトを見つけたい場合があります。このタイプのワークフローははるかに複雑で、次にどこに行くかを決定するための推論と計画能力を必要とします。

私の経験では、このタイプのワークフローは非常に困難ですが、このようなフロンティアワークフローを探索している企業があります。最も優れているのはおそらくMultiOnで、ウェブブラウザを自律的に操作するこのタイプのウェブエージェントの構築に焦点を当てています。

例えば、実際にチケットを予約してもらい、全体のワークフローを完了するよう依頼できます。このURLをコピーして、「チケットを予約して」と言うことができます。ビューと日付を自動的に選択し、次のボタンをクリックし、このチケット選択ページに移動し、チケットを選択してチケットを追加し、一番下まで移動できることがわかります。

次のボタンを見つけようとしましたが、何らかの理由でそこで詰まっています。最終的に次のボタンを見つけてクリックし、このページを開始します。このタイプの完全自律ウェブエージェントは、非常に有用になるまでには長い道のりがありますが、このウェブフォームのさまざまなハードルを通過できるのは実際に非常に印象的です。彼らは使用するAPIも提供しています。

多くの機会があります。ほとんどの人は、現在、これらのエージェントと大規模言語モデルを使用してウェブスクレイピングを行うことがいかに簡単かを理解していません。

これらが、2024年にエージェントと大規模言語モデルを使用してウェブスクレイピングを行う私のベストプラクティスです。一方で、試してみることを強くお勧めします。このトピックをもう少し深く掘り下げたい場合や、助けが必要な特定の質問がある場合は、すぐに使用できるテンプレートをコピー&ペーストで使用でき、さらに重要なことに、現在抱えている問題をすでに経験している可能性のある他のトップAIビルダーのコミュニティに参加できる、これらの異なるタイプのウェブスクレイパーエージェントの完全で詳細なステップバイステップコードブレークダウンを持つ私のコミュニティに参加できます。

投稿して助けを得たり、私が行っている興味深いAI実験を継続して投稿したりできます。更新を受け取りたい場合は、いいねと購読をしてください。ありがとうございました。また次回お会いしましょう。

コメント

タイトルとURLをコピーしました