网站首页 > 基础教程 正文
在数据为王的时代,爬虫技术已成为开发者必备技能。虽然Python的Scrapy、BeautifulSoup等工具占据主流视野,但Node.js凭借其异步特性与Puppeteer的无头浏览器能力,正在悄然掀起动态爬虫的新革命!今天,我们揭秘如何用Node.js+Puppeteer高效攻破复杂网站,轻松获取动态数据!
为什么选择Node.js+Puppeteer?
- 无头浏览器王者
Puppeteer由谷歌官方维护,直接操控Chromium浏览器,完美模拟用户操作(点击、滚动、表单提交),轻松破解JavaScript动态渲染页面,传统爬虫难以企及! - 异步性能杀手锏
Node.js事件驱动架构天生适合高并发I/O操作,结合async/await语法,实现毫秒级多页面并行抓取,效率提升10倍+! - 一站式解决方案
截图、PDF生成、自动化测试一把抓,爬取数据的同时还能完成UI监控,一箭双雕!
实战:5分钟爬取电商价格数据
场景需求
抓取某电商平台搜索“智能手机”的结果,提取商品名称、价格、评分。
代码实现
const puppeteer = require('puppeteer');
(async () => {
// 启动浏览器,设置视口和代理
const browser = await puppeteer.launch({
headless: 'new', // 新版本无头模式
args: ['--no-sandbox', '--proxy-server=ip:port']
});
const page = await browser.newPage();
await page.setViewport({ width: 1280, height: 800 });
// 设置UA和绕过检测
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'webdriver', { get: () => false });
});
// 导航到目标页面
await page.goto('https://example.com/search?q=智能手机', {
waitUntil: 'networkidle2',
timeout: 60000
});
// 滚动加载全部内容(针对懒加载页面)
await autoScroll(page);
// 提取数据
const products = await page.$eval('.product-item', items =>
items.map(item => ({
title: item.querySelector('.title').innerText.trim(),
price: item.querySelector('.price').innerText.replace('yen', ''),
rating: item.querySelector('.rating').getAttribute('data-score')
}))
);
console.log(products);
await browser.close();
})();
// 自动滚动函数
async function autoScroll(page) {
await page.evaluate(async () => {
await new Promise((resolve) => {
let totalHeight = 0;
const distance = 100;
const timer = setInterval(() => {
const scrollHeight = document.body.scrollHeight;
window.scrollBy(0, distance);
totalHeight += distance;
if (totalHeight >= scrollHeight) {
clearInterval(timer);
resolve();
}
}, 100);
});
});
}
进阶技巧:突破反爬防线
- 指纹伪装
- 使用puppeteer-extra-plugin-stealth插件消除Headless特征
- 随机化硬件指纹(屏幕分辨率、时区、字体列表)
- 智能等待策略
// 元素级精准等待
await page.waitForSelector('.price', { visible: true, timeout: 5000 });
// 网络请求拦截(捕获AJAX数据)
page.on('response', async response => {
if (response.url().includes('/api/data')) {
const data = await response.json();
console.log(data.items);
}
});
3.分布式架构
- 结合bull队列实现任务调度
- 使用puppeteer-cluster管理多实例浏览器池
性能优化指南
资源拦截 – 屏蔽图片/CSS减少带宽消耗
await page.setRequestInterception(true);
page.on('request', req => {
if (['image', 'stylesheet'].includes(req.resourceType())) {
req.abort();
} else {
req.continue();
}
});
内存管控 – 定时清理页面实例
// 每处理50个页面重启一次浏览器
let pageCount = 0;
if (++pageCount % 50 === 0) {
await browser.close();
browser = await puppeteer.launch();
}
立即行动!
npm install puppeteer
项目开源地址:
https://gitee.com/mirrors/puppeteer-nodejs
中文文档推荐:
https://puppeteer.bootcss.com/
- 上一篇: 免注册使用今天发布的 Grok3 大模型
- 下一篇: delphi TChromium控件
猜你喜欢
- 2025-05-30 delphi TChromium控件
- 2025-05-30 免注册使用今天发布的 Grok3 大模型
- 2025-05-30 300 多行代码搞定微信 8.0 的「炸」「裂」特效!
- 2025-05-30 让我们来看看常见的网页挂马方式
- 2025-05-30 SpringBoot与Loki的那些事
- 2025-05-30 「干货分享」推荐5个可以让你事半功倍的Python自动化脚本
- 2025-05-30 前端基础:从输入URL到看到页面发生了什么?详细描述整个过程
- 2025-05-30 回流和重绘
- 2025-05-30 如何实现页面顶部, 自定义滚动进度条样式
- 2025-05-30 一套提示词,搞定各自媒体平台封面图,附完整提示词!
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- deletesql (62)
- c++模板 (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)