网站首页 > java教程 正文
在数据为王的时代,爬虫技术已成为开发者必备技能。虽然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-07-07 网络爬虫:Python动态网页爬虫2种技术方式及示例
- 2025-07-07 Python 爬虫框架Scrapy 简单介绍(python中的爬虫框架)
- 2025-07-07 神龙IP一文带你了解分布式网络爬虫
- 2025-07-07 你们想要的Python爬虫教程来了:从原理到实践
- 2025-07-07 Python开发爬虫的常用技术架构(python网络爬虫开发)
- 2025-07-07 Python 网络爬取的时候使用那种框架
- 2025-07-07 15个最受欢迎的Python开源框架!(python开源框架排行)
- 2025-07-07 零基础小白如何学爬虫技术?看一遍就会的详细教程!
- 2025-07-07 Scrapy爬虫框架 批量抓取数据轻轻松松啦~
- 2025-07-07 每天一个Python库:Scrapy爬虫,从零搭建数据抓取引擎
你 发表评论:
欢迎- 最近发表
-
- Java内存溢出紧急处理:10个必知的Linux命令快速定位OOM
- 面试常问的 25+ 个 Linux 命令(linux面试命令大全)
- Java堆外内存溢出紧急处理实战:Linux命令定位与Spring Boot解决
- java开发常用的Linux命令,高频的没你想象的多
- Java 应用 CPU 飙升?8 个 Linux 命令组合拳快速锁定异常线程
- Java 开发者线上问题排查常用的 15 个 Linux 命令
- Java程序员必备的Linux命令:让你的工作效率翻倍
- Java程序员必备的Linux命令全解析
- [超全整理] Java 程序员必备的 100 条 Linux 命令大全
- SAP ABAP资源导航(sap aatp)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)