首页 >后端开发 >Python教程 >《简易指南》中如何使用 Python 抓取 Crunchbase)

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-16 12:57:59303浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn