Crawlee:一款强大而易用的爬虫和浏览器自动化库

https://github.com/apify/crawlee-python 在当今数据驱动的时代,从网络上提取信息的需求越来越迫切。Crawlee 应运而生,作为一款功能强大的爬虫和浏览器自动化库,它能够帮助你快速构建可靠的爬虫,实现无缝的端到端爬取和抓取数据。🚀

Human-like Crawling:规避机器人检测

利用Crawlee,你的爬虫会展现出近乎人类般的行为模式,即使使用默认配置,也能轻松躲过现代机器人的反爬机制。

简化流程:无需繁琐设置

Crawlee 提供了丰富的配置选项,让你可以根据项目需求微调几乎任何方面,而如果默认设置满足你的要求,则完全无需担心技术细节即可完成爬虫构建。

多语言支持:Python 和 TypeScript 版本

Crawlee 不仅提供 Python 版本,还可以使用 TypeScript 实现,满足不同开发需求。

安装 Crawlee

安装 Crawlee 非常简单,只需执行以下命令:

pip install crawlee

如果你想使用 BeautifulSoupCrawler 或 PlaywrightCrawler,请分别安装相应的额外依赖包:

pip install 'crawlee[beautifulsoup]'
pip install 'crawlee[playwright]'

最后,安装 Playwright 依赖:

playwright install

示例:BeautifulSoupCrawler 与 PlaywrightCrawler

BeautifulSoupCrawler:高效提取 HTML 数据

BeautifulSoupCrawler 使用 HTTP 库下载网页,并为用户提供解析后的 HTML 内容。它使用 HTTPX 进行 HTTP 通信和 BeautifulSoup 进行 HTML 解析。对于仅需要从 HTML 内容中有效地提取数据的项目来说,该爬虫非常合适。由于不使用浏览器,因此性能表现出色。但如果需要执行客户端 JavaScript 以获取内容,则需要使用 PlaywrightCrawler。

import asyncio
from crawlee.beautifulsoup_crawler import BeautifulSoupCrawler, BeautifulSoupCrawlingContext

async def main() -> None:
    crawler = BeautifulSoupCrawler(
        max_requests_per_crawl=10  # 限制爬取请求数量,移除或增加此值可爬取所有链接
    )

    @crawler.router.default_handler
    async def request_handler(context: BeautifulSoupCrawlingContext) -> None:
        context.log.info(f'Processing {context.request.url} ...') 
        data = {
            'url': context.request.url,
            'title': context.soup.title.string if context.soup.title else None
        }
        await context.push_data(data)  # 将提取的数据推送到默认数据集
        await context.enqueue_links()  # 将页面上发现的所有链接加入队列

    await crawler.run(['https://crawlee.dev']) 

if __name__ == '__main__':
    asyncio.run(main())

PlaywrightCrawler:处理 JavaScript 内容

PlaywrightCrawler 使用 headless 浏览器下载网页并提供数据提取 API。它基于 Playwright,一个专为管理 headless 浏览器的自动化库。对于依赖于客户端 JavaScript 生成内容的网页或需要与 JavaScript 驱动的内容交互的任务,该爬虫非常出色。但在不需要执行 JavaScript 或需要更高性能的情况下,应考虑使用 BeautifulSoupCrawler。

import asyncio
from crawlee.playwright_crawler import PlaywrightCrawler, PlaywrightCrawlingContext

async def main() -> None:
    crawler = PlaywrightCrawler(
        max_requests_per_crawl=10 
    )

    @crawler.router.default_handler
    async def request_handler(context: PlaywrightCrawlingContext) -> None:
        context.log.info(f'Processing {context.request.url} ...') 
        data = {
            'url': context.request.url,
            'title': await context.page.title()
        }
        await context.push_data(data) 
        await context.enqueue_links()

    await crawler.run(['https://crawlee.dev']) 

if __name__ == '__main__':
    asyncio.run(main())

更多示例和功能

在 Crawlee 文档的 Examples 页面中,可以找到各种额外的用例和演示。Crawlee 还具有许多其他强大的特性,例如:

  • 集成代理轮循和会话管理
  • 可配置的请求路由,将 URL 引向适当的处理程序
  • 持久性 URL 队列
  • 可插拔的数据表数据和文件存储

总结

Crawlee 是一个功能强大而易用的爬虫和浏览器自动化库,可以帮助你轻松构建可靠的爬虫。它具有多种优势,例如:统一的 HTTP 和 headless 浏览器爬取接口、自动并行爬取、Python 类型提示支持以及内置错误处理机制。无论你是初学者还是经验丰富的开发者,Crawlee 都能提供一个简便而高效的爬虫解决方案。