【実践解説】10分でわかる Firecrawl！革新的リサーチツール（GitHub人気爆発中）

## はじめに

近年、ウェブ情報を効率的に収集・整理し、さまざまなAIツールに取り込むニーズが高まっています。

ChatGPT Deep Research 機能が話題ですが、正直コストが高くて手が出しづらいです。

https://qiita.com/syukan3/items/b2bd98d2f61a75777d38

そんな中、**Firecrawl**はMendable.aiが開発した革新的なウェブクローラー兼データ抽出ツールとして注目を集めています。

本記事では、Firecrawlの基本的な機能から実際の使用方法、さらにはセルフホストや他のツールとの連携例を含めて、幅広く解説します。
（Dify と Firecrawl を連携させる記事が多かったので、Firecrawl単体で使う方法をまとめました。）

---

## 1. Firecrawlとは？

FirecrawlはシンプルなAPIやSDKを介して、ウェブサイト全体から必要な情報を短時間で抽出できる**ウェブクローリング・データ抽出ツール**です。  
- **自動クローリング**：リンクをたどってサイト全体を巡回し、隅々までデータを取得。  
- **データ変換**：取得した情報をMarkdownや構造化データ（JSON等）に変換し、後続の処理にすぐ活用可能。  
- **柔軟な拡張性**：高機能ながらも設定が簡単で、非エンジニアでも扱いやすい。必要に応じてセルフホストも可能。

ウェブスクレイピングを一から実装する手間を省き、大規模言語モデル（LLM）の学習データなど、様々なシチュエーションで役立つ点が大きな特徴です。


:::note warn
データのライセンスと法的留意点  
FirecrawlはWebサイトをクロールしてデータを収集しますが、取得したデータを利用する際は、対象サイトの利用規約や著作権法を守る必要があります。
特に商業利用の場合は、その使用が法的に認められているかを事前に確認することが重要です。
:::


---

## 2. Firecrawlの主な機能

### 2-1. ウェブクローリング
- **全ページを自動取得**：サイトマップがなくてもリンクを辿ってくれるため、広範囲のデータ収集が簡単。  
- **詳細なクロール設定**：  
  - `excludes`（不要なパス除外）  
  - `maxDepth`（クロールの深さ調整）  
  - `maxPages`（最大ページ数制限）  
  - `waitBetweenRequests`（リクエスト間の待機時間）  
  など細かな設定でクローリングの挙動をコントロール可能。

### 2-2. データ抽出・変換
- **Markdown変換**：HTMLから不要な要素を取り除き、クリーンなMarkdownとして提供。ブログやLLMへの入力データとして最適。  
- **HTML・スクリーンショット取得**：生のHTMLやスクリーンショットの取得も可能。  
- **主要コンテンツの抽出**：`onlyMainContent`オプションでヘッダーやフッターを除くメインコンテンツのみ抽出でき、ノイズが少ないテキストを得られます。

### 2-3. シンプルなAPI & SDK
- **HTTPベースのAPI**：どんなプログラミング言語からでもアクセスしやすい。  
- **SDK（Python／Node.js）**：`pip install firecrawl-py`や`npm install @mendable/firecrawl-js`で、すぐに開発環境へ導入可能。

### 2-4. セルフホスト対応
- オープンソースとしてGitHubで公開されており、**オンプレミス環境やプライベートクラウド**にデプロイして利用することができます。自社のセキュリティポリシーに沿った運用が必要な場合にも安心です。

---

## 3. はじめる手順 – アカウント作成とAPIキー取得

1. **公式サイトでアカウント作成**  
   Firecrawl公式サイト（[firecrawl.dev](https://www.firecrawl.dev/)）でアカウントを作成。  
2. **APIキーを確認・取得**  
   ダッシュボードからAPIキーが発行されるので、コピーして安全に保管します（SDKやAPI呼び出し時に使用）。

---

## 4. インストールと基本セットアップ

FirecrawlにはPython用とNode.js用のSDKが公式に用意されています。

### 4-1. Pythonでのインストール

```bash
pip install firecrawl-py
```

バージョンを指定したい場合は `firecrawl-py==0.0.16` のようにピン留めしてください。

### 4-2. Node.jsでのインストール

```bash
npm install @mendable/firecrawl-js
```

続いて、各SDKでAPIキーを使った初期化を行えば、すぐにクローリングを開始できます。

---

## 5. 基本的な使い方 – コード例

### 5-1. Pythonサンプル

```python
from firecrawl import FirecrawlApp

# FirecrawlAppのインスタンス化（APIキーを設定）
app = FirecrawlApp(api_key="YOUR_API_KEY")

# 指定URLをクローリング。excludesオプションで除外パスを指定可能
crawl_result = app.crawl_url(
    'example.com',
    {'crawlerOptions': {'excludes': ['blog/*']}}
)

# 各ページのmarkdownを表示
for result in crawl_result:
    print(result['markdown'])
```

### 5-2. Node.jsサンプル

```javascript
const { FirecrawlApp } = require('@mendable/firecrawl-js');

// FirecrawlAppのインスタンス化（APIキーを設定）
const app = new FirecrawlApp('YOUR_API_KEY');

// 指定URLをクローリング
app.crawlUrl('example.com', { crawlerOptions: { excludes: ['blog/*'] } })
  .then((crawlResult) => {
    crawlResult.forEach((result) => {
      console.log(result.markdown);
    });
  })
  .catch((error) => {
    console.error('Error:', error);
  });
```

シンプルな記述で、サイト全体のテキストを取得できる点が魅力です。

---

## 6. オプション設定とカスタマイズ

Firecrawlは、柔軟な設定によりさまざまなユースケースに対応可能です。

- **crawlerOptions**  
  - `excludes`：特定のパスを除外（例：`blog/*`）  
  - `maxDepth`：クロールの深さ  
  - `maxPages`：取得ページ数の上限  
  - `waitBetweenRequests`：リクエスト間の待機ミリ秒数  

- **pageOptions**  
  - `onlyMainContent`：メインコンテンツのみ抽出  
  - `includeHtml`：元のHTMLも同時に取得  
  - `screenshot`：スクリーンショット取得（カスタム処理に利用可能）

細かい調整ができるので、**大規模サイトのクロール**や**ノイズの少ないデータ抽出**など、幅広いニーズに対応します。

---

## 7. セルフホストの方法

公式提供のSaaSを利用するだけでなく、自社環境やプライベートクラウドでFirecrawlを運用することも可能です。以下はセルフホストの基本手順です。

1. **リポジトリをクローン**  
   ```bash
   git clone https://github.com/mendableai/firecrawl
   ```
2. **.envファイルの設定**  
   リポジトリ内の `SELF_HOST.md` を参考に、`.env` ファイルに必要な環境変数を記述（`NUM_WORKERS_PER_QUEUE`, `PORT`, `REDIS_URL` など）。
3. **Docker Composeでビルド・起動**  
   ```bash
   docker compose build
   docker compose up
   ```
   立ち上がったら `http://localhost:3002/admin/@/queues` にアクセスし、管理画面が表示されれば成功です。
4. **APIテスト**  
   `curl` などで `http://localhost:3002/v0` にリクエストを送り、動作確認してみましょう。

社内向けツールや高度なセキュリティ要件がある場合に、セルフホストは非常に有効な選択肢となります。

---

## 8. 応用例と活用シーン

Firecrawlのデータ抽出機能と、LLMを含む外部ツールとの連携により、以下のように活用できます。

1. **マーケットリサーチ**  
   競合サイトの製品情報や価格データを定期的に収集し、分析レポートを作成。  
2. **コンテンツアグリゲーション**  
   複数のニュースサイトやブログを横断的にクロールし、記事を一元管理。  
3. **LLMトレーニングデータの準備**  
   クリーンなMarkdownデータとして、OpenAIのGPTシリーズなどの学習・ファインチューニングに活用。  
4. **Dify, Langchain, Llama Indexとの連携**  
   - Difyのナレッジベースに取り込み、AIチャットの回答精度を向上。  
   - LangchainやLlama Index専用のローダーを利用して、生成AIのためのデータソースとしてスムーズに組み込み。

---

## 9. 料金プラン

Firecrawlはニーズに合わせた**複数のプラン**を提供しています。

- **Free Plan**：月に数百回程度のクレジットが無料付与され、まずは気軽に試せる。  
- **有料プラン**：Hobby、Standard、Growthなど利用頻度に応じた料金形態。企業向けにエンタープライズプランも存在。

詳細なコストや制限については公式サイトの「Pricing」ページをご確認ください。

---

## 10. FirecrawlとLLMの連携事例（サンプルコード付き）

ここでは、Firecrawlを使って取得したデータを、OpenAI の GPT-4o などのLLMで処理するサンプルを紹介します。

### 10-1. マーケットリサーチ例

```python
import os, re
from openai import OpenAI
from firecrawl import FirecrawlApp

# APIキー設定
openai_api_key = os.getenv("OPENAI_API_KEY")
firecrawl_api_key = os.getenv("FIRECRAWL_API_KEY")

app = FirecrawlApp(api_key=firecrawl_api_key)

# 競合サイトの製品ページをクロール
crawl_result = app.crawl_url(
    'competitor.com/products',
    {'crawlerOptions': {'excludes': ['blog/*']}}
)

# 製品名と価格を抽出
pattern = re.compile(r'Product Name:\s*(.*)\nPrice:\s*\$([0-9.]+)')
product_info = []
for result in crawl_result:
    markdown = result.get('markdown', '')
    matches = pattern.findall(markdown)
    for name, price in matches:
        product_info.append(f"Product Name: {name.strip()}, Price: ${price.strip()}")

# LLMへ市場動向の要約を依頼
prompt = (
    "以下の製品情報を元に、市場のトレンドや注目ポイントを簡潔に要約してください：\n\n"
    + "\n".join(product_info)
)
client = OpenAI(
    api_key=openai_api_key,
    # base_url="https://api.openai.com/v1"  # Azure利用時はエンドポイント指定
)
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "あなたは市場調査に詳しいアシスタントです。"},
        {"role": "user", "content": prompt}
    ]
)

# 結果出力
print(response.choices[0].message.content.strip())
```

### 10-2. コンテンツアグリゲーション例

```python
import os
from openai import OpenAI
from firecrawl import FirecrawlApp

# APIキーの取得
openai_api_key = os.getenv("OPENAI_API_KEY")
firecrawl_api_key = os.getenv("FIRECRAWL_API_KEY")

urls = ['news-site1.com', 'news-site2.com', 'blog.example.com']
app = FirecrawlApp(api_key=firecrawl_api_key)
aggregated_content = ""

# 各URLからコンテンツを取得してまとめる
for url in urls:
    results = app.crawl_url(url, {'crawlerOptions': {}})
    for result in results:
        aggregated_content += result.get("markdown", "") + "\n"

# 要約依頼のプロンプト作成とOpenAI API呼び出し
prompt = (
    "以下は複数サイトからのコンテンツです。主要なニュースや共通テーマを要約してください：\n\n"
    + aggregated_content
)
client = OpenAI(
    api_key=openai_api_key,
    # base_url="https://api.openai.com/v1"  # Azure利用時はエンドポイント指定
)
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "ニュース集約に優れたアシスタントです。"},
        {"role": "user", "content": prompt}
    ]
)

# 結果出力
print(response.choices[0].message.content.strip())
```

### 10-3. チャットボットのナレッジベース構築

```python
import os
from openai import OpenAI
from firecrawl import FirecrawlApp

# APIキーの設定
openai_api_key = os.getenv("OPENAI_API_KEY")
firecrawl_api_key = os.getenv("FIRECRAWL_API_KEY")

# FAQサイトをクロール
app = FirecrawlApp(api_key=firecrawl_api_key)
crawl_result = app.crawl_url('faq.company.com', {'crawlerOptions': {}})

# クロール結果からナレッジベースを構築（URLまたはデフォルトキーを使用）
knowledge_base = {
    result.get('url', f'page_{i}'): result.get('markdown', '')
    for i, result in enumerate(crawl_result)
}

# クエリに合致する情報を検索
# このメソッドはベクトルデータベースに問い合わせすることで RAG としても活用可能です。
def search_knowledge(query):
    matched = ""
    for url, content in knowledge_base.items():
        if query.lower() in content.lower():
            matched += f"From {url}:\n{content}\n\n"
    return matched if matched else "関連情報はありません。"

user_query = "返品方法を教えてください"
relevant_content = search_knowledge(user_query)

# プロンプト作成と回答生成
prompt = f"以下の情報を参考に、ユーザーの質問に適切に回答してください。\n\n{relevant_content}\n【質問】{user_query}\n【回答】"
client = OpenAI(
    api_key=openai_api_key,
    # base_url="https://api.openai.com/v1"  # Azure利用時はエンドポイント指定
)
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "あなたはカスタマーサポート担当のアシスタントです。"},
        {"role": "user", "content": prompt}
    ]
)

# 結果出力
print(response.choices[0].message.content.strip())
```

---

## 11. まとめ

Firecrawlは **「簡単・柔軟・高機能」** を兼ね備えたウェブクローリング＆データ抽出ツールです。  
- **気軽に始められる**：アカウント作成とAPIキー、SDKインストールで即スタート。  
- **用途に合わせた拡張性**：詳細なオプション設定やセルフホスト対応により、多様なシーンで活躍。  
- **他ツールとの連携**：LLM（OpenAIなど）やDify、Langchain、Llama Index等と組み合わせて、強力なデータ処理ワークフローを構築。  

マーケットリサーチ、コンテンツアグリゲーション、LLM向け学習データの収集など、多彩な場面で役立つため、ぜひプロジェクトの効率化や機能拡張に取り入れてみてください。

詳細な仕様やドキュメントは、[Firecrawl公式サイト](https://www.firecrawl.dev/)や[公式ドキュメント](https://docs.firecrawl.dev/introduction)で確認できます。
セルフホストやAPIの活用例も充実していますので、まずは無料枠からお試しください。

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/