ホームページ >バックエンド開発 >Python チュートリアル >簡単ガイドのPythonを使用してCrunchbaseをスクレイピングする方法)

簡単ガイドのPythonを使用してCrunchbaseをスクレイピングする方法)

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-16 12:57:59308ブラウズ

Python 開発者はそのドリルを知っています。信頼できる企業データが必要です。Crunchbase はそれを持っています。このガイドでは、必要なデータを取得する効果的な Crunchbase スクレーパーを Python で構築する方法を説明します。

Crunchbase は、場所、ビジネスの焦点、創設者、投資履歴など、重要な詳細を追跡します。このような大規模なデータセットから手動で抽出するのは現実的ではありません。この情報を分析可能な形式に変換するには自動化が不可欠です。

このブログの最後までに、Crawlee for Python を使用して Crunchbase からデータを抽出する 3 つの異なる方法を検討します。そのうち 2 つを完全に実装し、3 つ目の詳細と課題について説明します。これは、適切なデータ ソースを適切に選択することがいかに重要であるかをより深く理解するのに役立ちます。

注: このガイドは、成長を続けるコミュニティの開発者から提供されたものです。 Crawlee で興味深いプロジェクトを構築しましたか? Discord に参加して、あなたの経験やブログのアイデアを共有してください。私たちはあなたのような開発者からのこれらの貢献を高く評価しています。

これから説明する主な手順:

  1. プロジェクトのセットアップ
  2. データソースの選択
  3. サイトマップベースのクローラーの実装
  4. 検索ベースのアプローチとその限界の分析
  5. 公式 API クローラーの実装
  6. 結論とリポジトリへのアクセス

前提条件

  • Python 3.9 以降
  • Web スクレイピングの概念についての知識
  • Python 用クローリー v0.5.0
  • 詩 v2.0 以降

プロジェクトのセットアップ

スクレイピングを開始する前に、プロジェクトを設定する必要があります。このガイドでは、クローラー テンプレート (Playwright と Beautifulsoup) を使用しないため、プロジェクトを手動でセットアップします。

  1. 詩をインストール

    pipx install poetry
    
  2. プロジェクト フォルダーを作成し、そこに移動します。

    mkdir crunchbase-crawlee && cd crunchbase-crawlee
    
  3. Poetry を使用してプロジェクトを初期化し、すべてのフィールドを空のままにします。

    poetry init
    

    プロンプトが表示されたら:

    • 「互換性のある Python バージョン」に次のように入力します: >={あなたの Python バージョン},
    • Enter キーを押して、他のフィールドはすべて空のままにしておきます
    • 「はい」と入力して世代を確認します
  4. Poetry を使用して、必要な依存関係を持つ Crawlee をプロジェクトに追加してインストールします。

    poetry add crawlee[parsel,curl-impersonate]
    
  5. Crawlee for Python プロジェクトの標準ファイル構造を作成して、プロジェクトのセットアップを完了します。

    mkdir crunchbase-crawlee && touch crunchbase-crawlee/{__init__.py,__main__.py,main.py,routes.py}
    

基本的なプロジェクト構造を設定したら、Crunchbase からデータを取得するさまざまな方法を検討できます。

データソースの選択

企業ページからターゲット データを直接抽出できますが、サイト内を移動する最適な方法を選択する必要があります。

Crunchbase の構造を注意深く調べると、データを取得するには 3 つの主なオプションがあることがわかります。

  1. サイトマップ - 完全なサイト横断用。
  2. 検索 - 対象を絞ったデータ収集用。
  3. 公式 API - 推奨される方法。

これらのアプローチをそれぞれ詳しく調べてみましょう。

サイトマップと Crawlee for Python を使用した Crunchbase のスクレイピング

サイトマップは、Google、Ahrefs、その他の検索エンジンなどのクローラーで使用されるサイト ナビゲーションの標準的な方法です。すべてのクローラーは、robots.txt に記述されているルールに従う必要があります。

Crunchbase のサイトマップの構造を見てみましょう:

Sitemap first lvl

ご覧のとおり、組織ページへのリンクは、gzip を使用して圧縮された第 2 レベルのサイトマップ ファイル内にあります。

これらのファイルの 1 つの構造は次のようになります:

Sitemap second lvl

ここでは、lastmod フィールドが特に重要です。前回のデータ収集以降にどの企業が情報を更新したかを追跡できます。これは、定期的なデータ更新に特に役立ちます。

1. スクレイピング用のクローラーの構成

このサイトを操作するには、Safari ブラウザーを偽装する CurlImpersonateHttpClient を使用します。サイトマップを操作する場合、この選択は予想外に思えるかもしれませんが、Crunchbase の保護機能によって必要となります。

その理由は、Crunchbase が自動アクセスから保護するために Cloudflare を使用しているためです。これは、企業ページのトラフィックを分析するとはっきりとわかります:

Cloudflare Link

興味深い機能は、データを含むドキュメントをロードした後にChallenges.cloudflareが実行されることです。これは、最初にデータを受信し、その後 JavaScript がボットかどうかをチェックすることを意味します。 HTTP クライアントのフィンガープリントが実際のブラウザと十分に類似している場合、データは正常に受信されます。

Cloudflare はサイトマップ レベルでもトラフィックを分析します。クローラーが正規のものではないと思われる場合、アクセスはブロックされます。これが、実際のブラウザになりすます理由です。

過度に積極的なクロールによるブロックを防ぐために、ConcurrencySettings を構成します。

このアプローチを拡張する場合、プロキシが必要になる可能性があります。プロキシ設定の詳細については、ドキュメントを参照してください。

スクレイピング結果を JSON 形式で保存します。クローラーの基本的な構成は次のとおりです。

pipx install poetry

2. サイトマップナビゲーションの実装

サイトマップのナビゲーションは 2 つの段階で行われます。最初の段階では、組織情報を含むすべてのファイルのリストを取得する必要があります:

pipx install poetry

第 2 段階では、gzip 形式で保存された第 2 レベルのサイトマップ ファイルを処理します。最初にデータを解凍する必要があるため、これには特別なアプローチが必要です:

mkdir crunchbase-crawlee && cd crunchbase-crawlee

3. データの抽出と保存

各企業のページには大量の情報が含まれています。デモンストレーションの目的で、会社名、簡単な説明、Web サイト、場所などの主要フィールドに焦点を当てます。

Crunchbase の利点の 1 つは、すべてのデータがページ内に JSON 形式で保存されることです。

Company Data

これにより、データ抽出が大幅に簡素化されます。必要なのは、1 つの Xpath セレクターを使用して JSON を取得し、jmespath を適用して必要なフィールドを抽出するだけです。

poetry init

収集されたデータは、context.push_data メソッドを使用して Crawlee for Python の内部ストレージに保存されます。クローラーが完了すると、収集されたすべてのデータが JSON ファイルにエクスポートされます。

poetry add crawlee[parsel,curl-impersonate]

4. プロジェクトの実行

すべてのコンポーネントを配置したら、クローラーのエントリ ポイントを作成する必要があります。

mkdir crunchbase-crawlee && touch crunchbase-crawlee/{__init__.py,__main__.py,main.py,routes.py}

Poetry を使用してクローラーを実行します:

# main.py

from crawlee import ConcurrencySettings, HttpHeaders
from crawlee.crawlers import ParselCrawler
from crawlee.http_clients import CurlImpersonateHttpClient

from .routes import router


async def main() -> None:
    """The crawler entry point."""
    concurrency_settings = ConcurrencySettings(max_concurrency=1, max_tasks_per_minute=50)

    http_client = CurlImpersonateHttpClient(
        impersonate='safari17_0',
        headers=HttpHeaders(
            {
                'accept-language': 'en',
                'accept-encoding': 'gzip, deflate, br, zstd',
            }
        ),
    )
    crawler = ParselCrawler(
        request_handler=router,
        max_request_retries=1,
        concurrency_settings=concurrency_settings,
        http_client=http_client,
        max_requests_per_crawl=30,
    )

    await crawler.run(['https://www.crunchbase.com/www-sitemaps/sitemap-index.xml'])

    await crawler.export_data_json('crunchbase_data.json')

5. 最後に、サイトマップ クローラーの使用の特徴

サイトマップのアプローチには、明確な利点と制限があります。次のような場合に最適です:

  • プラットフォーム上のすべての企業に関するデータを収集する必要がある場合
  • 具体的な企業選定基準がない場合
  • 十分な時間と計算リソースがある場合

ただし、考慮すべき重要な制限があります。

  • 収集中にデータをフィルタリングする機能はほとんどありません
  • Cloudflare ブロックの継続的な監視が必要です
  • ソリューションを拡張するにはプロキシ サーバーが必要となり、プロジェクトのコストが増加します

Crunchbase のスクレイピングに検索を使用する

サイトマップのアプローチには限界があるため、次の解決策として検索が必要になる可能性があります。ただし、Crunchbase は、公開ページと比較して、検索機能に厳しいセキュリティ対策を適用しています。

主な違いは、Cloudflare の保護がどのように機能するかにあります。企業ページにアクセスするときに、challenge.cloudflare チェックの前にデータを受け取りますが、検索 API にはこのチェックに合格した有効な Cookie が必要です。

実際にこれを検証してみましょう。シークレット モードで次のリンクを開きます:

# routes.py

from crawlee.crawlers import ParselCrawlingContext
from crawlee.router import Router
from crawlee import Request

router = Router[ParselCrawlingContext]()


@router.default_handler
async def default_handler(context: ParselCrawlingContext) -> None:
    """Default request handler."""
    context.log.info(f'default_handler processing {context.request} ...')

    requests = [
        Request.from_url(url, label='sitemap')
        for url in context.selector.xpath('//loc[contains(., "sitemap-organizations")]/text()').getall()
    ]

    # Since this is a tutorial, I don't want to upload more than one sitemap link
    await context.add_requests(requests, limit=1)

トラフィックを分析すると、次のパターンがわかります:

Search Protect

ここでのイベントの順序は次のとおりです:

  1. まず、ページはコード 403 でブロックされています
  2. その後、challenge.cloudflare チェックが実行されます
  3. チェックに合格した場合にのみ、コード 200 のデータを受信します

このプロセスを自動化するには、Cloudflare Turnstile をバイパスできるヘッドレス ブラウザが必要です。 Crawlee for Python (v0.5.0) の現在のバージョンではこの機能は提供されていませんが、将来の開発が予定されています。

この例に従って Camoufox を統合することで、Crawlee for Python の機能を拡張できます。

公式 Crunchbase API の操作

Crunchbase は、基本的な機能を備えた無料の API を提供します。有料サブスクリプション ユーザーは、拡張されたデータ アクセスを利用できます。利用可能なエンドポイントの完全なドキュメントは、公式 API 仕様にあります。

1. APIアクセスの設定

API の使用を開始するには、次の手順に従います。

  1. Crunchbase アカウントを作成する
  2. 「統合」セクションに移動します
  3. Crunchbase Basic API キーを作成する

ドキュメントには、キーのアクティブ化に最大 1 時間かかる場合があると記載されていますが、通常は作成後すぐに機能し始めます。

2. API 作業用のクローラーの構成

重要な API 機能は、1 分あたり 200 リクエスト以下という制限です。しかし、無料バージョンでは、この数は大幅に低くなります。これを考慮して、ConcurrencySettings を構成しましょう。公式 API を使用しているため、HTTP クライアントをマスクする必要はありません。プリセットヘッダーを持つ標準の「HttpxHttpClient」を使用します。

まず、API キーを環境変数に保存しましょう:

pipx install poetry

API を操作するためのクローラー設定は次のようになります。

mkdir crunchbase-crawlee && cd crunchbase-crawlee

3. 検索結果の処理

API を使用するには、次の 2 つの主要なエンドポイントが必要です。

  1. get_autocompletes - 検索用
  2. get_entities_organizations__entity_id - データの取得用

まず、検索結果の処理を実装しましょう:

poetry init

4. 企業データの抽出

企業のリストを取得した後、各企業に関する詳細情報を抽出します。

poetry add crawlee[parsel,curl-impersonate]

5. 高度な位置ベースの検索

より柔軟な検索機能が必要な場合は、API が特別な検索エンドポイントを提供します。以下は、プラハのすべての会社を検索する例です:

mkdir crunchbase-crawlee && touch crunchbase-crawlee/{__init__.py,__main__.py,main.py,routes.py}

検索結果とページネーションの処理には、次のハンドラーを使用します:

# main.py

from crawlee import ConcurrencySettings, HttpHeaders
from crawlee.crawlers import ParselCrawler
from crawlee.http_clients import CurlImpersonateHttpClient

from .routes import router


async def main() -> None:
    """The crawler entry point."""
    concurrency_settings = ConcurrencySettings(max_concurrency=1, max_tasks_per_minute=50)

    http_client = CurlImpersonateHttpClient(
        impersonate='safari17_0',
        headers=HttpHeaders(
            {
                'accept-language': 'en',
                'accept-encoding': 'gzip, deflate, br, zstd',
            }
        ),
    )
    crawler = ParselCrawler(
        request_handler=router,
        max_request_retries=1,
        concurrency_settings=concurrency_settings,
        http_client=http_client,
        max_requests_per_crawl=30,
    )

    await crawler.run(['https://www.crunchbase.com/www-sitemaps/sitemap-index.xml'])

    await crawler.export_data_json('crunchbase_data.json')

6. 最後に、無料 API の制限

API の無料版には重大な制限があります:

  • 利用可能なエンドポイントのセットが限られています
  • オートコンプリート機能は企業検索でのみ機能します
  • すべてのデータフィールドにアクセスできるわけではありません
  • 限定された検索フィルタリング機能

実稼働レベルの作業については、有料サブスクリプションを検討してください。 API は、レート制約がある場合でも、Crunchbase データにアクセスするための最も信頼性の高い方法を提供します。

今後の最善の道は何ですか?

Crunchbase からデータを取得するための 3 つの異なるアプローチを検討してきました。

  1. サイトマップ - 大規模なデータ収集用
  2. 検索 - Cloudflare 保護のため自動化が困難
  3. 公式 API - 商用プロジェクト向けの最も信頼性の高いソリューション

それぞれの方法には利点がありますが、ほとんどのプロジェクトでは、無料版の制限にもかかわらず、公式 API を使用することをお勧めします。

完全なソース コードは私のリポジトリで入手できます。質問がある場合、または実装の詳細について話し合いたい場合は、 Discord に参加してください - 開発者のコ​​ミュニティがお手伝いします。

以上が簡単ガイドのPythonを使用してCrunchbaseをスクレイピングする方法)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。