首頁 > 後端開發 > Python教學 > 《簡易指南》中如何使用 Python 抓取 Crunchbase)

《簡易指南》中如何使用 Python 抓取 Crunchbase)

Mary-Kate Olsen
發布: 2025-01-16 12:57:59
原創
301 人瀏覽過

Python 開發人員知道該怎麼做:您需要可靠的公司數據,而 Crunchbase 擁有它。本指南向您展示如何使用 Python 建立有效的 Crunchbase 抓取工具來取得所需的資料。

Crunchbase 追蹤重要的詳細資訊:地點、業務重點、創辦人和投資歷史。從如此大的資料集中手動提取是不切實際的 - 自動化對於將這些資訊轉換為可分析的格式至關重要。

在本部落格的結尾,我們將探索使用 Crawlee for Python 從 Crunchbase 提取資料的三種不同方法。我們將全面實施其中兩個,並討論第三個的具體細節和挑戰。這將幫助我們更好地理解正確選擇正確的資料來源是多麼重要。

注意:本指南來自我們不斷發展的社區中的開發人員。你和 Crawlee 一起做過有趣的專案嗎?加入我們的 Discord,分享您的經驗和部落格想法 - 我們重視像您這樣的開發者的這些貢獻。

我們將要介紹的關鍵步驟:

  1. 項目設定
  2. 選擇資料來源
  3. 實作基於網站地圖的爬蟲
  4. 基於搜尋的方法及其限制分析
  5. 實作官方API爬蟲
  6. 結論與儲存庫存取

先決條件

  • Python 3.9 或更高版本
  • 熟悉網頁抓取概念
  • Crawlee for 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 版本},=3.10,
    • 按 Enter 鍵將所有其他欄位留空
    • 輸入「yes」確認產生
  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 的結構顯示我們有三個主要的獲取資料的選項:

  1. 網站地圖 - 用於完整的網站遍歷。
  2. 搜尋 - 有針對性的資料收集。
  3. 官方API - 推薦方法。

讓我們詳細研究一下這些方法。

使用網站地圖和 Crawlee for Python 抓取 Crunchbase

網站地圖是 Google、Ahrefs 和其他搜尋引擎等爬蟲所使用的標準網站導航方式。所有爬蟲都必須遵循robots.txt中所述的規則。

讓我們來看看 Crunchbase 的 Sitemap 的結構:

Sitemap first lvl

如您所見,組織頁面的連結位於二級網站地圖檔案內,這些檔案是使用 gzip 壓縮的。

其中一個檔案的結構如下:

Sitemap second lvl

lastmod 欄位在這裡特別重要。它允許追蹤自上次資料收集以來哪些公司更新了其資訊。這對於定期資料更新特別有用。

1. 配置爬蟲進行抓取

為了使用網站,我們將使用 CurlImpersonateHttpClient,它模擬 Safari 瀏覽器。雖然這種選擇對於使用網站地圖來說似乎有些意外,但這是 Crunchbase 的保護功能所必需的。

原因是 Crunchbase 使用 Cloudflare 來防止自動存取。在分析公司頁面上的流量時,這一點清晰可見:

Cloudflare Link

一個有趣的功能是,challenges.cloudflare 在載入資料文件後執行。這意味著我們先接收數據,然後 JavaScript 才會檢查我們是否是機器人。如果我們的 HTTP 用戶端的指紋與真實瀏覽器足夠相似,我們將成功接收資料。

Cloudflare 也分析網站地圖等級的流量。如果我們的爬蟲看起來不合法,訪問將被阻止。這就是我們模擬真實瀏覽器的原因。

為了防止因過度抓取而導致阻塞,我們將配置 ConcurrencySettings。

擴充此方法時,您可能需要代理程式。有關代理設定的詳細資訊可以在文件中找到。

我們將以 JSON 格式儲存抓取結果。以下是基本的爬蟲配置:

pipx install poetry
登入後複製
登入後複製
登入後複製
登入後複製

2. 實現網站地圖導航

網站地圖導航分兩個階段進行。在第一階段,我們需要取得包含組織資訊的所有文件的清單:

pipx install poetry
登入後複製
登入後複製
登入後複製
登入後複製

在第二階段,我們處理以gzip格式儲存的二級站點地圖檔案。這需要一種特殊的方法,因為需要先解壓縮資料:

mkdir crunchbase-crawlee && cd crunchbase-crawlee
登入後複製
登入後複製
登入後複製

3. 提取並保存數據

每個公司頁面都包含大量資訊。出於演示目的,我們將重點放在主要欄位:公司名稱、簡短描述、網站和位置。

Crunchbase 的優點之一是所有資料都以 JSON 格式儲存在頁面內:

Company Data

這顯著簡化了資料擷取 - 我們只需要使用一個 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. 然後執行challenges.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 金鑰

雖然文件指出金鑰啟動可能需要長達一個小時,但它通常在創建後立即開始工作。

2. 設定爬蟲進行API工作

一個重要的 API 功能是限制 - 每分鐘不超過 200 個請求,但在免費版本中,這個數字要低得多。考慮到這一點,讓我們配置 ConcurrencySettings。由於我們使用官方 API,因此不需要屏蔽 HTTP 客戶端。我們將使用帶有預設標頭的標準“HttpxHttpClient”。

首先,讓我們將 API 金鑰保存在環境變數中:

pipx install poetry
登入後複製
登入後複製
登入後複製
登入後複製

以下是使用 API 的爬蟲配置:

mkdir crunchbase-crawlee && cd crunchbase-crawlee
登入後複製
登入後複製
登入後複製

3. 處理搜尋結果

為了使用 API,我們需要兩個主要端點:

  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 取得資料:

  1. 網站地圖 - 用於大規模資料收集
  2. 搜尋 - 由於 Cloudflare 保護而難以自動化
  3. 官方API - 商業項目最可靠的解決方案

每種方法都有其優點,但對於大多數項目,我建議使用官方 API,儘管免費版本有其局限性。

完整的原始程式碼可以在我的儲存庫中找到。有疑問或想討論實作細節嗎?加入我們的 Discord - 我們的開發者社群隨時為您提供協助。

以上是《簡易指南》中如何使用 Python 抓取 Crunchbase)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板