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