编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Crawlee崛起,Puppeteer 和 Playwright功不可没?

wxchong 2024-10-02 01:33:48 开源技术 12 ℃ 0 评论

家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。

今天给大家带来的主题是 Crawlee,即一个Node.js 的Web抓取和浏览器自动化库,可帮助开发者构建快速、可靠的爬虫。关于自动化测试,以前也发表过不少文章,以下是部分文章的传送门:

话不多说,直接进入正题!

什么是 Crawlee

Crawlee 涵盖了端到端的爬行和抓取(crawling and scraping),帮助开发者构建可靠、快速的抓取工具。

即使使用默认配置,爬虫也会像真人用户一样运行。 Crawlee 为开发者提供了在 Web 抓取链接、抓取数据并将其存储到磁盘或云的工具,同时保持可配置以满足项目需求。

目前 Crawlee 在 Github 上通过 MIT 协议开源,有超过 8.8k 的 star、0.4k 的 fork,是一个值得关注的前端开源项目。

为什么选择Crawlee

Crawlee 有以下明显特征:

  • 用于 HTTP 和无头浏览器抓取的单一接口
  • 要抓取的 URL 的持久队列,支持广度和深度优先
  • 表格数据和文件的可插拔存储:开发者可以使用一行代码将文件、屏幕截图和 JSON 结果保存到磁盘,或者为数据库插入适配器。 URL 将保存在队列中,以确保其唯一性,并且在出现故障时不会丢失进度。
  • 利用可用系统资源自动扩展
  • 集成代理轮换和会话管理:Crawlee 根据可用系统资源自动管理并发并智能轮换代理。经常超时、返回网络错误或错误 HTTP 代码(如 401 或 403)的代理将被丢弃。
  • 使用 Hooks 可定制生命周期
  • CLI 来引导项目
  • 可配置的路由、错误处理和重试
  • Dockerfiles 准备部署
  • 使用泛型用 TypeScript 编写:Crawlee 在 Node.js 上运行,并且内置 TypeScript 以改进 IDE 中的代码自动完成,即使开发者本身不使用 TypeScript 也是如此。

在 HTTP 爬取方法也有自己独特的优势:

  • 零配置 HTTP2 支持,即使对于代理也是如此
  • 自动生成类似浏览器的标题
  • 浏览器 TLS 指纹的复制:Crawlee 发出模仿浏览器标头和 TLS 指纹的 HTTP 请求,它还根据实际流量数据自动轮换,包括:流行的 HTML 解析器 Cheerio 和 JSDOM。
  • 集成快速 HTML 解析器,比如:Cheerio 和 JSDOM
  • 支持抓取 JSON API:Crawlee 包括用于提取社交信息或电话号码、无限滚动、阻止不需要的资产等等的工具。开箱即用,而且还提供丰富的配置选项。

同时,Crawlee 也可以模拟真实的浏览器抓取:

  • JavaScript 渲染和屏幕截图
  • 无头和有头支持:只需 3 行代码即可将爬虫从 HTTP 切换到无头浏览器,Crawlee 建立在 Puppeteer 和 Playwright 之上,并添加了自己的防阻塞功能和类人指纹,支持 Chrome、火狐等。
  • 零配置生成类人指纹
  • 自动浏览器管理
  • 支持使用具有相同界面的 Playwright 和 Puppeteer Chrome、Firefox、Webkit 等

如何使用 Crawlee

使用 Crawlee CLI

尝试 Crawlee 的最快方法是使用 Crawlee CLI 并选择入门示例。 CLI 将安装所有必要的依赖项并添加样板代码供开发者使用。

Bash
npx crawlee create my-crawler
cd my-crawler
npm start

手动安装

如果更喜欢将 Crawlee 添加到自己的项目中,请尝试下面的示例。因为它使用 PlaywrightCrawler,所以还需要安装 Playwright。之所以没有与 Crawlee 打包在一起是为了减少安装大小。

Bash
import { PlaywrightCrawler, Dataset } from "crawlee";
// PlaywrightCrawler 使用无头浏览器抓取
// 由 Playwright 库控制的浏览器。
const crawler = new PlaywrightCrawler({
  // 使用 requestHandler 来处理每个爬取的页面。
  async requestHandler({ request, page, enqueueLinks, log }) {
    const title = await page.title();
    log.info(`Title of ${request.loadedUrl} is '${title}'`);
    // 将结果以 JSON 格式保存到 ./storage/datasets/default
    await Dataset.pushData({ title, url: request.loadedUrl });
      // 从当前页面中提取链接
     // 并将它们添加到抓取队列中。
    await enqueueLinks();
  },
     // 取消注释此选项以查看浏览器窗口。
    // headless:false
});
// Add first URL to the queue and start the crawl.
await crawler.run(["https://crawlee.dev"]);

默认情况下,Crawlee 将数据存储到当前工作目录中的./storage,但是开发者可以通过 Crawlee 配置覆盖此目录。除了支持与 Playwright 集成外,还可以使用 Puppeteer,比如下面的例子。

const crawler = new PuppeteerCrawler({
    async requestHandler({ page, request }) {
        // 调用该函数从单个网页中提取数据
        // 'page' 是 Puppeteer.Page 的一个实例,其中 page.goto(request.url) 已被调用
        // 'request' 是 Request 类的一个实例,其中包含有关要加载的页面的信息
        await Dataset.pushData({
            title: await page.title(),
            url: request.url,
            succeeded: true,
        })
    },
    async failedRequestHandler({ request }) {
        // 当请求抓取失败次数过多时调用该函数
        await Dataset.pushData({
            url: request.url,
            succeeded: false,
            errors: request.errorMessages,
        })
    },
});
await crawler.run([
    'http://www.example.com/page-1',
    'http://www.example.com/page-2',
]);

更多高级用法本文不再继续展开,可以参考文末资料自行研究。

本文总结

本文主要和大家介绍 Crawlee,即一个Node.js 的Web抓取和浏览器自动化库,可帮助开发者构建快速、可靠的爬虫。相信通过本文的阅读,大家对 Crawlee 会有一个初步的了解。

因为篇幅有限,关于 Crawlee 的更多用法和特性文章并没有过多展开,如果有兴趣,可以在我的主页继续阅读,同时文末的参考资料提供了大量优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏,您的支持是我不断创作的动力。

参考资料

https://github.com/apify/crawlee

https://crawlee.dev/

https://dev.to/mnmkng/launching-crawlee-the-web-scraping-and-browser-automation-library-for-nodejs-e1o

https://betterprogramming.pub/5-tips-to-build-a-faster-web-crawler-f2bbc90cf233

https://prowebscraper.com/blog/50-best-open-source-web-crawlers/

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表