网站首页 > 技术文章 正文
在数据为王的时代,爬虫技术已成为开发者必备技能。虽然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/
猜你喜欢
- 2025-05-02 现在可以部署到Web Assembly的6种语言
- 2025-05-02 七爪源码:这是在 Go 中进行实时重新加载的好方法
- 2025-05-02 哪种编程语言又快又省电?有人对比了27种语言
- 2025-05-02 阿里云迎来史上最特殊的员工:工号AI001,精通200 多种编程语言!
- 2025-05-02 使用 WebAssembly 和 Go 编写前端 Web 框架
- 2025-05-02 完全用 Go 编写的 JS 引擎(常用的编写javascript的工具有哪些)
- 2025-05-02 使用Docker和Codeship来装运Node.js应用
- 2025-05-02 英特尔 Evo 认证 PC 对决 M1 Macbook:x86 生态加持,Evo 更省心
- 2025-05-02 Playwright 全面教程从入门到精通-Playwright 高级特性与技巧
- 2025-05-02 腾讯首次披露员工构成:研发人员超4万人,占比达66%
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)