[AI書房] 第17章 求人データWebスクレイピングワークフロー
Claude Code完全攻略
第5部
第17章 求人データWebスクレイピングワークフロー
金京鎮
Firecrawl MCP と計画モードを組み合わせたタスク設計
画面の左側には、ソーシャルメディア関連の遠隔勤務求人募集がぎっしりと並んでいます。622件。ページ数に換算すると21ページに及ぶ分量です。これらの情報を手作業で一つずつ転記するならば、一日中かかっても終わらない作業です。まさにこの地点で、エージェントのワークフローが真価を発揮します。
本章では、Firecrawl というツールと Claude Code の計画モードを組み合わせて、大規模な採用データを自動的に収集・整理する過程を追います。実習を通じて、MCP 接続サーバーの実践的な威力を実感していただけるでしょう。
Firecrawl とは何か
Firecrawl は、ウェブサイトを LLM(大規模言語モデル)に親和的なデータ形式に変換するツールです。単なるウェブ情報の収集を超え、ウェブサイトのテキストを Markdown 形式で抽出し、スクリーンショットを撮影し、サイト構造をマッピングし、データをクロールする機能まで備えています。
マクドナルドのウェブサイトに URL を入力して情報収集を依頼すると、そのページの全テキストがマークダウン形式で取得されます。しかし、これは Firecrawl ができることのほんの一部に過ぎません。情報収集、検索、抽出、クロールなど、多様な機能が一つのツールに統合されているからです。
MCP でツールを接続する仕組み
ここで重要な概念が登場します。MCP(Model Context Protocol、モデル・コンテキスト・プロトコル)です。この概念を理解するために Gmail を思い出してみましょう。Gmail には、メール送信、下書き作成、メール取得など、数多くの個別の動作が存在します。
MCP はこれらのすべての動作を一つのサーバーにまとめ、エージェントがどのツールをいつ使用し、どのようなパラメータを埋めるべきかを自ら判断できるようにします。
ケーキを作る例えで説明すると、卵が必要なら卵屋、小麦粉が必要なら粉屋、フロスティングが必要なら菓子屋をそれぞれ訪ねるのではなく、スーパーマーケット MCP へのアクセス権限を与えるだけで十分です。「必要な材料があれば、スーパーマーケットで勝手に用意してください」。これが MCP の核心です。
[図 17-1] MCP 接続サーバーの概念図:1 つの接続で複数のツールにアクセスする構造
Firecrawl MCP 接続サーバーのインストール
Firecrawl の公式ドキュメントには、MCP 接続サーバーのインストール方法が記載されています。Claude Code で実行する方法も含まれているため、該当するコマンドをコピーして Claude Code に渡すだけで済みます。
インストール手順では、API キー(API Key)の入力が求められます。API キーは一種のパスワードです。これを Claude Code の会話履歴に直接入力することはセキュリティ上好ましくありません。代わりに、.env ファイルに保存する方式を使用します。
Claude Code は .env ファイルに API キーのプレースホルダーを作成します。ユーザーは、Firecrawl ダッシュボードで発行された API キーを該当箇所に直接貼り付けて保存するだけです。Firecrawl は無料登録時に 500 クレジットを提供するため、実習には十分です。
一つ注意すべき点があります。Claude Code が Bash コマンドを実行する際、API キーが会話履歴に露出する可能性があります。無料キーであれば大きな問題にはなりませんが、機密性の高いキーの場合は、Claude Code にはインストール方法のみを案内してもらい、実際のコマンドは別のターミナルで直接実行する方が安全です。
計画モードで作業設計を行う
インストールが完了しましたので、本格的なワークフローの構築に入ります。会話履歴を整理(/clear)した後、必ず計画モードに切り替えてください。計画モードから始める理由は明確です。エージェントがより深く思考し、プロジェクトフォルダ全体を把握し、まだ気づいていない質問を投げかけてくれるからです。
採用ページページの URL をコピーして Claude Code に貼り付け、自然言語で要件を説明してください。
Claude Code はこのメッセージを受け取り、Firecrawl MCP 接続サーバーを利用できるかを確認します。その後、具体的な質問が返ってきます。個別の採用詳細ページまでウェブ情報を収集するかどうか、Excel ファイルの保存先はどこか、フィルタリング条件はあるかなどです。
これらの質問に答えることで、Claude Code は包括的な実行計画を提示します。それは「scrape_daily_remote」というツールを作成し、「scrape_job_listings」というワークフローを構築した上で、実際のウェブ情報収集を実行するという内容です。
[図 17-2] 計画モードにおける Claude Code が提示したウェブ情報収集計画の例
622 件の求人広告を Excel で整理する
計画を承認し、自動受容(auto accept)モードを選択すると、Claude Code はタスクリスト(to-do list)を作成し、一つずつ実行していきます。
実行結果の確認
処理が完了すると、結果が表示されます。209件の求人情報が収集され、複数の指標と地域情報が整理されています。左側のファイルエクスプローラーを確認すると、tools フォルダに「scrape_daily_remote_jobs」ツールが、workflows フォルダに「scrape_job_listings」ワークフローが新たに作成されていることがわかります。
この構造がなぜ重要なのか、見ていきましょう。次回、同様のウェブ情報収集を依頼した際、Claude Code は既に作成されたツールとワークフローを再利用します。もし誤りがあった場合は、自動的に修正して更新します。これが WAT フレームワークにおける自己改善ループです。
Excel ファイルの構成
temp フォルダに保存された Excel ファイルを開きます。Claude Code によってフィルタ機能も自動的に追加されています。列(カラム)の構成は以下の通りです。
[図 17-3] 生成された Excel ファイルの実際の画面キャプチャ
209件の求人情報がきれいに整理されています。手作業であれば半日かかる作業を、Claude Codeは数分で完了させました。
コンテキスト管理の重要性
ここで、実務的なヒントを共有いたします。作業を進めていると、画面下部に「コンテキストの45%が残り」という表示が現れます。これは「コンテキストの腐敗(Context Rot)」と呼ばれる現象です。会話記録が長くなるほど、AIモデルの性能が低下するのです。コンテキスト使用量が60%を超す前に、コンパクト機能を用いて会話を圧縮することをお勧めします。
これにより、重要な情報は維持したまま、不要な記録を整理することができます。
フィルタリングと地域別分類:欧州営業職372件の抽出事例
今回は難易度を一段階上げます。検索フィルターがないページから、214,000件の全求人情報の中から特定の条件に合致するものだけを抽出する作業です。
要件の伝達
今回は意図的にバイパスパーミッションモードを使用します。計画モードを経ずにエージェントに比較的曖昧な指示を与え、どのような結果が得られるか観察するためです。
Claude Codeは、以前作成したウェブ情報収集ツールを認識します。「以前作成したウェブ情報収集ツールを活用できるな」と自ら判断し、計画を立てます。営業職の求人情報をウェブ情報収集し、ヨーロッパにフィルターをかけた後、エクセルでエクスポートするというものです。
現実との衝突、そして適応
しかし、予期せぬ事態が発生します。欧州地域の営業職の求人がわずか52件しかないのです。営業職全体では409件ありますが、欧州に限定すると目標の500件にはほど遠い状況です。
この時点でエージェントの判断能力が試されます。Claude Codeは自動的に問題を認識し、ユーザーに選択肢を提示します。
「米国の営業職も追加してください」とお答えいただくと、エージェントは作業を続行します。この過程で一時ファイルが生成されます。all_sales_jobs や sales_jobs_raw といった中間データファイルと、フィルタリング用のPythonスクリプト3つがtempフォルダに作成されます。プロジェクト開始時に一時フォルダを別途用意しておいたことが、まさに光を放つ瞬間です。
最終結果
最終的に372件の営業職求人が収集されます。Excelファイルには既存の項目に加え、「Region(地域)」列が追加されています。この列を基準にフィルタリングすることで、米国、欧州、全世界(worldwide)の求人を即座に分類できます。欧州のみを選択すると、約49件が残ります。
[図 17-4] 地域別フィルターが適用された営業職のExcelファイル
予期せぬリクエストへの対応:米国の歯科医師潜在顧客リストの作成
エージェントのワークフローにおける真の試練は、予期せぬリクエストです。これまではいくつかの特定のURLから求人広告を取得するという、比較的定型化された作業でした。今回は、全く異なる種類のリクエストに挑戦します。
全く異なる種類のリクエスト
このリクエストにはURLがありません。データの出所を示す手がかりもありません。エージェント自身がデータソースを見つける必要があります。
エージェントの課題解決プロセス
Claude Codeはまず既存のツールとワークフローを確認します。その後、Firecrawlを活用して「歯科医師ディレクトリ」を検索します。ADA(米国歯科医師協会)のサイトを見つけましたが、JavaScriptで動的にレンダリングされるため、静的なウェブ情報の収集は機能しませんでした。
ここで諦めず、別の方法を模索してYellow Pagesが効果的であることを自ら発見します。ニューヨーク市には3,000人の歯科医師情報が存在することを確認し、新しいウェブ情報収集ツールの作成を開始します。
しかし、最初の試みでは歯科医師2名のみが抽出されました。これはパースニングパターンに問題があるためです。エージェントはこのエラーを即座に検知し、正規表現(Regex)パターンを修正します。ツールファイル自体を更新して、同様の問題が再発しないようにします。
[図17-5] エージェントがウェブ情報収集エラーを検知し、ツールを修正するプロセス
自己修復の実際の姿
このプロセスこそが、自己修復(自らを修復すること)の実際の姿です。従来の自動化では、エラーが発生すると開発者がログを読み、コードを修正し、再度検証する必要がありました。しかし、エージェントのワークフローでは、エージェントがこれらのプロセスをすべて自ら実行します。エラーを発見し、原因を分析し、コードを修正し、再検証を行います。
最終成果物
修正されたツールで再実行した結果、4つの主要都市から120名の固有の歯科医師リードが収集されました。Excelファイルの構成は以下の通りです。
新しいワークフロー「scrape_dentist_leads」と新しいツール「scrape_dentist_leads」が自動的に生成されました。次回同様のリクエストが入った際、このワークフローとツールは再利用されます。
マルチエージェント戦略
ここでは、ひとつの高度な戦略をご紹介しましょう。Claude Code では、複数のエージェントを同時に起動できます。5 つのエージェントにそれぞれ異なるアプローチを試行させ、最も優れた結果をもたらすワークフローのみを残し、他を削除するのです。この手法により、どのデータソースが最も信頼性が高く、どのウェブ情報収集戦略が最も効率的かを並列で検証することが可能になります。
今回の実習で確認できたことは明確です。目的とする成果物の形態を把握していれば、それを達成するための技術スタックや詳細な実装方法はエージェントに委ねることができます。622 件の求人、372 件の営業職、あるいは 120 名の歯科医のリードであっても、自然言語で目標を説明するだけで、実質的な成果物が生成されます。では、この強力なツールを使用する際に、人々が陥りやすい落とし穴について見ていきましょう。




