ホームページ >バックエンド開発 >Python チュートリアル >簡単ガイドのPythonを使用してCrunchbaseをスクレイピングする方法)
Python 開発者はそのドリルを知っています。信頼できる企業データが必要です。Crunchbase はそれを持っています。このガイドでは、必要なデータを取得する効果的な Crunchbase スクレーパーを Python で構築する方法を説明します。
Crunchbase は、場所、ビジネスの焦点、創設者、投資履歴など、重要な詳細を追跡します。このような大規模なデータセットから手動で抽出するのは現実的ではありません。この情報を分析可能な形式に変換するには自動化が不可欠です。
このブログの最後までに、Crawlee for Python を使用して Crunchbase からデータを抽出する 3 つの異なる方法を検討します。そのうち 2 つを完全に実装し、3 つ目の詳細と課題について説明します。これは、適切なデータ ソースを適切に選択することがいかに重要であるかをより深く理解するのに役立ちます。
注: このガイドは、成長を続けるコミュニティの開発者から提供されたものです。 Crawlee で興味深いプロジェクトを構築しましたか? Discord に参加して、あなたの経験やブログのアイデアを共有してください。私たちはあなたのような開発者からのこれらの貢献を高く評価しています。
これから説明する主な手順:
スクレイピングを開始する前に、プロジェクトを設定する必要があります。このガイドでは、クローラー テンプレート (Playwright と Beautifulsoup) を使用しないため、プロジェクトを手動でセットアップします。
詩をインストール
pipx install poetry
プロジェクト フォルダーを作成し、そこに移動します。
mkdir crunchbase-crawlee && cd crunchbase-crawlee
Poetry を使用してプロジェクトを初期化し、すべてのフィールドを空のままにします。
poetry init
プロンプトが表示されたら:
Poetry を使用して、必要な依存関係を持つ Crawlee をプロジェクトに追加してインストールします。
poetry add crawlee[parsel,curl-impersonate]
Crawlee for Python プロジェクトの標準ファイル構造を作成して、プロジェクトのセットアップを完了します。
mkdir crunchbase-crawlee && touch crunchbase-crawlee/{__init__.py,__main__.py,main.py,routes.py}
基本的なプロジェクト構造を設定したら、Crunchbase からデータを取得するさまざまな方法を検討できます。
企業ページからターゲット データを直接抽出できますが、サイト内を移動する最適な方法を選択する必要があります。
Crunchbase の構造を注意深く調べると、データを取得するには 3 つの主なオプションがあることがわかります。
これらのアプローチをそれぞれ詳しく調べてみましょう。
サイトマップは、Google、Ahrefs、その他の検索エンジンなどのクローラーで使用されるサイト ナビゲーションの標準的な方法です。すべてのクローラーは、robots.txt に記述されているルールに従う必要があります。
Crunchbase のサイトマップの構造を見てみましょう:
ご覧のとおり、組織ページへのリンクは、gzip を使用して圧縮された第 2 レベルのサイトマップ ファイル内にあります。
これらのファイルの 1 つの構造は次のようになります:
ここでは、lastmod フィールドが特に重要です。前回のデータ収集以降にどの企業が情報を更新したかを追跡できます。これは、定期的なデータ更新に特に役立ちます。
このサイトを操作するには、Safari ブラウザーを偽装する CurlImpersonateHttpClient を使用します。サイトマップを操作する場合、この選択は予想外に思えるかもしれませんが、Crunchbase の保護機能によって必要となります。
その理由は、Crunchbase が自動アクセスから保護するために Cloudflare を使用しているためです。これは、企業ページのトラフィックを分析するとはっきりとわかります:
興味深い機能は、データを含むドキュメントをロードした後にChallenges.cloudflareが実行されることです。これは、最初にデータを受信し、その後 JavaScript がボットかどうかをチェックすることを意味します。 HTTP クライアントのフィンガープリントが実際のブラウザと十分に類似している場合、データは正常に受信されます。
Cloudflare はサイトマップ レベルでもトラフィックを分析します。クローラーが正規のものではないと思われる場合、アクセスはブロックされます。これが、実際のブラウザになりすます理由です。
過度に積極的なクロールによるブロックを防ぐために、ConcurrencySettings を構成します。
このアプローチを拡張する場合、プロキシが必要になる可能性があります。プロキシ設定の詳細については、ドキュメントを参照してください。
スクレイピング結果を JSON 形式で保存します。クローラーの基本的な構成は次のとおりです。
pipx install poetry
サイトマップのナビゲーションは 2 つの段階で行われます。最初の段階では、組織情報を含むすべてのファイルのリストを取得する必要があります:
pipx install poetry
第 2 段階では、gzip 形式で保存された第 2 レベルのサイトマップ ファイルを処理します。最初にデータを解凍する必要があるため、これには特別なアプローチが必要です:
mkdir crunchbase-crawlee && cd crunchbase-crawlee
各企業のページには大量の情報が含まれています。デモンストレーションの目的で、会社名、簡単な説明、Web サイト、場所などの主要フィールドに焦点を当てます。
Crunchbase の利点の 1 つは、すべてのデータがページ内に JSON 形式で保存されることです。
これにより、データ抽出が大幅に簡素化されます。必要なのは、1 つの Xpath セレクターを使用して JSON を取得し、jmespath を適用して必要なフィールドを抽出するだけです。
poetry init
収集されたデータは、context.push_data メソッドを使用して Crawlee for Python の内部ストレージに保存されます。クローラーが完了すると、収集されたすべてのデータが JSON ファイルにエクスポートされます。
poetry add crawlee[parsel,curl-impersonate]
すべてのコンポーネントを配置したら、クローラーのエントリ ポイントを作成する必要があります。
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')
サイトマップのアプローチには、明確な利点と制限があります。次のような場合に最適です:
ただし、考慮すべき重要な制限があります。
サイトマップのアプローチには限界があるため、次の解決策として検索が必要になる可能性があります。ただし、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)
トラフィックを分析すると、次のパターンがわかります:
ここでのイベントの順序は次のとおりです:
このプロセスを自動化するには、Cloudflare Turnstile をバイパスできるヘッドレス ブラウザが必要です。 Crawlee for Python (v0.5.0) の現在のバージョンではこの機能は提供されていませんが、将来の開発が予定されています。
この例に従って Camoufox を統合することで、Crawlee for Python の機能を拡張できます。
Crunchbase は、基本的な機能を備えた無料の API を提供します。有料サブスクリプション ユーザーは、拡張されたデータ アクセスを利用できます。利用可能なエンドポイントの完全なドキュメントは、公式 API 仕様にあります。
API の使用を開始するには、次の手順に従います。
ドキュメントには、キーのアクティブ化に最大 1 時間かかる場合があると記載されていますが、通常は作成後すぐに機能し始めます。
重要な API 機能は、1 分あたり 200 リクエスト以下という制限です。しかし、無料バージョンでは、この数は大幅に低くなります。これを考慮して、ConcurrencySettings を構成しましょう。公式 API を使用しているため、HTTP クライアントをマスクする必要はありません。プリセットヘッダーを持つ標準の「HttpxHttpClient」を使用します。
まず、API キーを環境変数に保存しましょう:
pipx install poetry
API を操作するためのクローラー設定は次のようになります。
mkdir crunchbase-crawlee && cd crunchbase-crawlee
API を使用するには、次の 2 つの主要なエンドポイントが必要です。
まず、検索結果の処理を実装しましょう:
poetry init
企業のリストを取得した後、各企業に関する詳細情報を抽出します。
poetry add crawlee[parsel,curl-impersonate]
より柔軟な検索機能が必要な場合は、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')
API の無料版には重大な制限があります:
実稼働レベルの作業については、有料サブスクリプションを検討してください。 API は、レート制約がある場合でも、Crunchbase データにアクセスするための最も信頼性の高い方法を提供します。
Crunchbase からデータを取得するための 3 つの異なるアプローチを検討してきました。
それぞれの方法には利点がありますが、ほとんどのプロジェクトでは、無料版の制限にもかかわらず、公式 API を使用することをお勧めします。
完全なソース コードは私のリポジトリで入手できます。質問がある場合、または実装の詳細について話し合いたい場合は、 Discord に参加してください - 開発者のコミュニティがお手伝いします。
以上が簡単ガイドのPythonを使用してCrunchbaseをスクレイピングする方法)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。