Python 開發人員知道該怎麼做:您需要可靠的公司數據,而 Crunchbase 擁有它。本指南向您展示如何使用 Python 建立有效的 Crunchbase 抓取工具來取得所需的資料。
Crunchbase 追蹤重要的詳細資訊:地點、業務重點、創辦人和投資歷史。從如此大的資料集中手動提取是不切實際的 - 自動化對於將這些資訊轉換為可分析的格式至關重要。
在本部落格的結尾,我們將探索使用 Crawlee for Python 從 Crunchbase 提取資料的三種不同方法。我們將全面實施其中兩個,並討論第三個的具體細節和挑戰。這將幫助我們更好地理解正確選擇正確的資料來源是多麼重要。
注意:本指南來自我們不斷發展的社區中的開發人員。你和 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 的結構顯示我們有三個主要的獲取資料的選項:
讓我們詳細研究一下這些方法。
網站地圖是 Google、Ahrefs 和其他搜尋引擎等爬蟲所使用的標準網站導航方式。所有爬蟲都必須遵循robots.txt中所述的規則。
讓我們來看看 Crunchbase 的 Sitemap 的結構:
如您所見,組織頁面的連結位於二級網站地圖檔案內,這些檔案是使用 gzip 壓縮的。
其中一個檔案的結構如下:
lastmod 欄位在這裡特別重要。它允許追蹤自上次資料收集以來哪些公司更新了其資訊。這對於定期資料更新特別有用。
為了使用網站,我們將使用 CurlImpersonateHttpClient,它模擬 Safari 瀏覽器。雖然這種選擇對於使用網站地圖來說似乎有些意外,但這是 Crunchbase 的保護功能所必需的。
原因是 Crunchbase 使用 Cloudflare 來防止自動存取。在分析公司頁面上的流量時,這一點清晰可見:
一個有趣的功能是,challenges.cloudflare 在載入資料文件後執行。這意味著我們先接收數據,然後 JavaScript 才會檢查我們是否是機器人。如果我們的 HTTP 用戶端的指紋與真實瀏覽器足夠相似,我們將成功接收資料。
Cloudflare 也分析網站地圖等級的流量。如果我們的爬蟲看起來不合法,訪問將被阻止。這就是我們模擬真實瀏覽器的原因。
為了防止因過度抓取而導致阻塞,我們將配置 ConcurrencySettings。
擴充此方法時,您可能需要代理程式。有關代理設定的詳細資訊可以在文件中找到。
我們將以 JSON 格式儲存抓取結果。以下是基本的爬蟲配置:
pipx install poetry
網站地圖導航分兩個階段進行。在第一階段,我們需要取得包含組織資訊的所有文件的清單:
pipx install poetry
在第二階段,我們處理以gzip格式儲存的二級站點地圖檔案。這需要一種特殊的方法,因為需要先解壓縮資料:
mkdir crunchbase-crawlee && cd crunchbase-crawlee
每個公司頁面都包含大量資訊。出於演示目的,我們將重點放在主要欄位:公司名稱、簡短描述、網站和位置。
Crunchbase 的優點之一是所有資料都以 JSON 格式儲存在頁面內:
這顯著簡化了資料擷取 - 我們只需要使用一個 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,請依照下列步驟操作:
雖然文件指出金鑰啟動可能需要長達一個小時,但它通常在創建後立即開始工作。
一個重要的 API 功能是限制 - 每分鐘不超過 200 個請求,但在免費版本中,這個數字要低得多。考慮到這一點,讓我們配置 ConcurrencySettings。由於我們使用官方 API,因此不需要屏蔽 HTTP 客戶端。我們將使用帶有預設標頭的標準“HttpxHttpClient”。
首先,讓我們將 API 金鑰保存在環境變數中:
pipx install poetry
以下是使用 API 的爬蟲配置:
mkdir crunchbase-crawlee && cd crunchbase-crawlee
為了使用 API,我們需要兩個主要端點:
首先,我們來實現搜尋結果處理:
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 取得資料:
每種方法都有其優點,但對於大多數項目,我建議使用官方 API,儘管免費版本有其局限性。
完整的原始程式碼可以在我的儲存庫中找到。有疑問或想討論實作細節嗎?加入我們的 Discord - 我們的開發者社群隨時為您提供協助。
以上是《簡易指南》中如何使用 Python 抓取 Crunchbase)的詳細內容。更多資訊請關注PHP中文網其他相關文章!