无头浏览器与爬虫
最近在研究爬虫,因为很多数据是需要做客户端渲染的, 所以需要一个无头浏览器来做渲染。 然后才能拿到最终的数据。
说到无头浏览器, 大家第一反应想到的大概率就是 Puppeteer, 但是我这里用到的不是 Puppeteer , 而是 crawlee.
Puppeteer 和 Crawlee 都有各自的优势和适用场景。如果需要与页面进行交互、处理动态内容或模拟真实用户行为,Puppeteer 是一个强大的选择。而如果专注于高效的爬取任务,Crawlee 则提供了更简洁、高效的解决方案。根据具体的需求和项目特点,可以选择适合的工具来实现 Node.js 爬虫。
介绍一下 node 最强爬虫 - Crawlee
我愿称之为最强 Node 爬虫。可以说是 Crawlee 是专为爬虫而生的框架。 简单来看几个特性, 大家应该就能体会到它到底有多强了。
JavaScript 和 TypeScript 支持
我们认为,最好使用网站编写语言来抓取数据。Crawlee在 Node.js 上运行,并且内置了 TypeScript, 即使您自己不使用 TypeScript,也可以提高 IDE 中的代码完成度。Crawlee 同时支持 TypeScript 和 JavaScript 抓取。
HTTP 抓取
Crawlee 发出模仿浏览器标头和 TLS 指纹的 HTTP 请求。它还根据有关真实世界流量的数据自动轮换它们。其中包括流行的 HTML 解析器 Cheerio 和JSDOM 。
无头浏览器支持
只需 3 行代码即可将您的爬虫从 HTTP 切换到无头浏览器。Crawlee 建立在Puppeteer 和 Playwright之上,并添加了自己的防阻塞功能和类似人类的指纹。Chrome、Firefox 等。
自动扩展和代理管理
Crawlee 根据可用的系统资源自动管理并发,并 智能地轮换代理。经常超时、返回网络错误或错误 HTTP 代码(如 401 或 403)的代理将被丢弃。
队列和存储
您可以使用一行代码将文件、屏幕截图和 JSON 结果保存到磁盘,或为您的数据库插入适配器。您的 URL保存在一个队列中,以确保其唯一性,并且当出现故障时您不会丢失进度。
有用的实用程序和可配置性
Crawlee 包括提取社交账号或电话号码、无限滚动、屏蔽不需要的资产等工具。它开箱即用,还提供了 丰富的配置选项。
简单实践一下抓取掘金热榜
Crawlee 有三个主要的爬虫类:CheerioCrawler、PuppeteerCrawler和PlaywrightCrawler。
CheerioCrawler: 这是一个普通的 HTTP 爬虫。它使用Cheerio 库解析 HTML ,并使用伪装成浏览器的专用got-scraping HTTP 客户端爬取网页。它非常快速高效,但无法处理 JavaScript 渲染。
PuppeteerCrawler: 此爬虫使用无头浏览器进行爬取,由Puppeteer库控制。它可以控制 Chromium 或 Chrome。Puppeteer 是无头浏览器自动化领域的事实上的标准。
playwrightcrawler: Playwright是 Puppeteer 的更强大、功能更全面的继任者。它可以控制 Chromium、Chrome、Firefox、Webkit 和许多其他浏览器。如果您还不熟悉 Puppeteer,并且需要无头浏览器,请使用 Playwright。
我们这里将要使用的也就是 playwrightcrawler 爬虫方式;
安装依赖
依赖安装:npm install crawlee playwright
playwright未与 Crawlee 捆绑在一起,以减少安装大小并提供更大的灵活性。所以要使用 NPM 明确安装它。
上代码
import { PlaywrightCrawler } from "crawlee";
const crawler = new PlaywrightCrawler({
// 是否开启 headless
// headless: false,
requestHandler: async ({ page }) => {
// 等待文章元素加载完成
await page.waitForSelector(".article-item-link");
// 执行 script 获取文章链接
const categoryTexts = await page.$$eval(".article-item-link", (els) => {
// 获取文章链接和文章名称
return els.map((el) => {
return {
url: el.getAttribute("href"),
name: el.querySelector(".article-detail")?.firstChild?.textContent,
};
});
});
categoryTexts.forEach((text, i) => {
console.log(`文章${i + 1}: ${JSON.stringify(text, undefined, 2)}\n`);
});
},
});
// 前端热榜链接
crawler.run(["https://juejin.cn/hot/articles/6809637767543259144"]);
直接执行即可,执行结果如下
代码详解
一、导入模块
import { PlaywrightCrawler } from "crawlee";
从“crawlee”库中导入“PlaywrightCrawler”类,这个类可以利用 Playwright 来进行网页爬取,能够处理包含动态内容的网页。
二、创建爬虫实例
const crawler = new PlaywrightCrawler({
// headless: false,
创建一个PlaywrightCrawler的实例。注释部分表示可以设置是否以无头模式(即无界面模式)运行浏览器,这里没有启用非无头模式,可能默认以无头模式运行。
三、定义请求处理函数
requestHandler: async ({ page }) => {
// 等待特定元素加载完成
await page.waitForSelector(".article-item-link");
定义了一个异步的请求处理函数,当爬虫访问一个页面时,这个函数会被执行。这里首先等待页面中具有.article-item-link类名的元素加载完成。
const categoryTexts = await page.$$eval(".article-item-link", (els) => {
// 获取文章链接和文章名称
return els.map((el) => {
return {
url: el.getAttribute("href"),
name: el.querySelector(".article-detail")?.firstChild?.textContent,
};
});
});
接着,使用page.$$eval方法在浏览器环境中执行一个函数。这个函数接收具有.article-item-link类名的元素数组作为参数els。在函数内部,遍历这些元素,提取每个元素的href属性作为文章链接url,以及通过查找具有.article-detail类名的元素的第一个子元素的文本内容作为文章名称name,并以对象的形式组成一个数组categoryTexts返回。
categoryTexts.forEach((text, i) => {
console.log(`文章${i + 1}: ${JSON.stringify(text, undefined, 2)}\n`);
});
最后,遍历提取到的文章信息数组,将每个文章信息以格式化的 JSON 字符串形式打印到控制台,并在前面加上“文章[序号]”的标识。
四、启动爬虫
crawler.run(["https://juejin.cn/hot/articles/6809637767543259144"]);
启动爬虫,传入一个包含要爬取的 URL 的数组,这里只有一个“前端热榜”的 URL。爬虫会访问这个 URL,并执行前面定义的请求处理函数,提取文章的链接和名称信息并输出到控制台。
最后的彩蛋:附上我用 crawlee 抓取 9 月掘金面试相关文章列表
面试
- 整理程序员面试中 HR 最常问的问题
- 两年前端,历时五个月面试终进大厂
- Promise then callback 面试题
- 面试中的心态
- 轻松应对 HR 面试
- vue 面试-自定义指令
- vue 面试-ref
- 近期面试小结,HarmonyOS 鸿蒙面试真题解析火爆全网
- 你了解过移动端适配吗?文末领取面试资料,开发面试流程
- 完爆面试官!kafka 主题(1),HarmonyOS 鸿蒙网络面试题
- 最新 Web 前端面试题精选大全及答案,物联网嵌入式开发内存优化面试
- 一次关于 JVM 的面试经历,完整版开放下载_jvm 面试视频教程,2024 年最新字节跳动前端面试题 2024
- 去面 HVV 蓝队面试了_护网行动蓝队中级面试问题(1),2024 年最新 retrofit 原理面试
- 嵌入式面试题,物联网嵌入式开发面试题选择题
- 某厂的红队实战靶机面试_红队面试靶机,HarmonyOS 鸿蒙中高级面试题
- 鸿蒙开发 2 年工作经验的面试题_鸿蒙系开发 app 面试题,2024 年最新 2024 金九银十面试季
- 一次哔哩哔哩面试经历,内容太过真实_bilibili 社招 面试,春招面试视频
- 一线互联网大厂面试真题系统收录!面试真题解析,字节面试官说后续 HR 会联系你的
- 看完吊打面试官!大厂经典高频面试题体系化集合,最强技术实现_vxlan 面试题(1)
- 看完吊打面试官!大厂经典高频面试题体系化集合,最强技术实现_vxlan 面试题
- 面试需要注意哪些问题?这里有程序员求职面试的 66 个细节整理_程序员面试的周期性
- 字节跳动今日学习内容:靠着这份 190 页的面试资料,社招面试心得,HarmonyOS 鸿蒙面试项目经验
- 某厂的红队实战靶机面试_红队面试靶机(2),2024 年最新面试官说什么暗示你成功
- 已获千赞,面试篇,面试相关书籍
- 某厂的红队实战靶机面试_红队面试靶机(1),HarmonyOS 鸿蒙音视频开发面试题
- Node,字节面试题 java
- retrofit 源码,作为一名程序员我不忘初心,面试总结_retrofit 源码面试
- kotlin 面试题,一次关于 JVM 的面试经历,完整版开放下载,面试 3 轮
- LiveData 面试题库、解答、源码分析_livedata 面试(1),2024 年最新鸿蒙开发项目面试描述
- LiveData 面试题库、解答、源码分析_livedata 面试(3),面试类书籍
- 带你快速通过字节跳动面试,完整 PDF_字节跳动面试题,2024 年最新如何在线面试
- LiveData 面试题库、解答、源码分析_livedata 面试,高级开发面试题及答案
- 恶补这份“阿里面试宝典”,秀出天际!_阿里巴巴面试宝典,鸿蒙面试宝典 2024
- retrofit 源码,作为一名程序员我不忘初心,面试总结_retrofit 源码面试
- hashmap 遍历,最全面试考点与面试技巧,薪资翻倍,鸿蒙面试项目经验
- 面试题小品
- 反向面试!3 个必问面试官的问题!
- 面试
后端
- 一道大厂的算法面试题-每日股票价格
- RcoketMQ 面试题
- MySQL 面试题
- C++大厂面试真题宝典 精选 100 道
- Java 基础面试题
- Redis 面试题之大 key 问题
- 面试系列-携程暑期实习一面
- RocketMQ 面试题总结_rocketmq 面试,Golang 自学
- 高性能 Kafka 及常见面试题,31 道大数据开发面试题
- 师兄面试遇到面试官的 Kafka 暴击三连问,快面哭了!_kafka 大厂面试题
- Django 必会面试题总结_django 面试问题,2024 年最新 2024 大厂 Golang 知识点总结+面试题解析
- Java Web 基础面试题_javaweb 基础面试题 csdn,震撼来袭
- golang—面试题大全_golang 企业面试题,2024Golang 最新大厂面试真题
- go 面试题——defer 的知识点_go defer 面试,2024 年最新来一份全面的面试宝典练练手
- Java 基础知识面试题(2024 最新版)_thinkwon java 面试,2024 年最新【Golang 面试题】
- java 面试系列-JDBC 常见面试题(附答案)_jdbc 面试题,2024 年你与字节跳动只差这份笔记
- 【大数据面试题大全】大数据真实面试题(持续更新),2024 年最新美团大数据开发面试题
- 【查找排序相关面试题】,面试必备知识点
- 05-RabbitMQ 面试题,2024 年最新大数据开发高级面试题库
- 【狂刷面试题】GO 常见面试题汇总_go 面试题,2024 年最新 2024Golang 大厂面试真题
- 【大数据】Kafka 高频面试题(三)_kafka 高平面试题,大数据开发面试题 2024 高级
- 线程面试题总结
前端
- 面试直接让做题,被 JS 类型转换打败了
- 华为面试题 ,前端路由实现原理
- 经典面试题,浏览器渲染过程
- 字节面试题,v-model 使用
- 阿里前端面试题,ES6 继承和 ES5 继承
- 前端面试题,显示小于 12px 文字
- 面试题准备
- 面试题记录
- 面试收获
- vue 面试-父子通信
- 前端面试题
- 面试题总结
- 【前端基础面试】
- 手撕前端面试代码题,看完吊打面试官
- 【面试题】2024-04,05 面试集合,搞钱要紧 【抓紧面试】,腾讯前端面试题
- 【面试题】2024-04,05 面试集合,搞钱要紧 【抓紧面试】,腾讯前端面试题