你好,今天我将介绍如何使用Node.js而不是Ruby、Python或Java来创建网络爬虫。特别是,我们将详细了解强大的Node.js库Puppeteer以及其扩展Puppeteer-Extra,它们可以控制Google Chrome或Chromium。
Puppeteer是什么?
Puppeteer是一个Node.js库,可以让您像用户一样与网站互动,从而实现网页爬取和操作网站。Puppeteer通常在无头模式下运行,可以在后台执行操作而无需GUI,但也可以根据需要切换到具有完整浏览器UI的有头模式。
为什么要使用Puppeteer?
1. 优化了对Chrome的性能
Puppeteer使用Chrome DevTools Protocol直接与Chrome浏览器通信。这使得它比使用类似Selenium的其他自动化工具提供的WebDriver API更快速、更精确。
2. 强大的动态网页内容处理能力
Puppeteer在处理静态页面以及通过JavaScript动态生成的内容方面表现出色。这意味着它可以有效处理现代网页的复杂交互和动态元素。
3. 避免封锁
在实际的爬取任务中,Puppeteer可以有效地避开封锁并收集数据。特别是使用Puppeteer-Extra和Stealth Plugin,可以绕过自动化检测机制,更稳定地收集数据。
Puppeteer-Extra和Stealth Plugin
Puppeteer-Extra
Puppeteer-Extra是一个构建在基本Puppeteer库之上的扩展,通过灵活的插件系统,用户可以轻松集成所需的附加功能。这样可以提升功能性,改善爬虫的可用性。
Stealth Plugin
Stealth Plugin是Puppeteer-Extra的插件之一,可以有效地避开常见的自动化检测,使爬取更加顺利。许多网站会阻止爬虫,但使用这个插件,即使是自动化爬虫也可以看起来像用户的浏览器一样。
实际应用示例
现在让我们使用Puppeteer-Extra和Stealth Plugin来执行简单的爬取任务。
1. 安装所需模块
执行以下命令以安装puppeteer-extra和puppeteer-extra-plugin-stealth模块。
npm install puppeteer-extra puppeteer-extra-plugin-stealth
2. 导入所需模块
import puppeteer from "puppeteer-extra";
import StealthPlugin from "puppeteer-extra-plugin-stealth";
import fs from "fs";
3. 处理命令中的URL输入异常
由于将来会使用node node_js.mjs https://www.example.com这样的命令直接输入URL,如果没有URL,则插入代码以引发异常。
const args = process.argv.slice(2); // 첫 번째 요소는 Node.js 실행 경로이므로 제외
if (args.length < 1) {
console.error("URL 파라미터가 필요합니다.");
process.exit(1); // 오류로 종료
}
4. 应用stealth插件
puppeteer.use(StealthPlugin());
5. 与浏览器交互
puppeteer.launch({ headless: false }).then(async browser => {
// 해당 headless는 하지 않고 눈에 보이게 브라우저를 띄워줍니다.
const url = args[0]; // 첫 번째 파라미터로부터 URL 가져오기
const page = await browser.newPage(); // 새 브라우저 열기
await page.goto(url); // url로 페이지 이동
await page.waitForTimeout(5000); // 렌더링 완료를 위해 5초 대기
const currentUrl = await page.url(); // url을 변수에 저장
console.log("현재 페이지의 URL:", currentUrl); // url이 제대로 담겼는지 출력
// 페이지의 HTML을 변수에 저장
const html = await page.content();
// HTML 내용을 파일로 저장합니다
fs.writeFile("pageContent.html", html, (err) => {
if (err) {
console.error("파일 저장 중 오류 발생:", err);
} else {
console.log("HTML이 성공적으로 저장됨: pageContent.html");
}
});
});
6. 执行命令
为了接收输入,我们创建了一个mjs文件。
node [파일명].mjs https://www.naver.com
URL将在浏览器中打开,并在终端中显示输出。
7. 检查html文件
通过上述步骤,您将看到pageContent.html已保存。
结论
此脚本会导航到用户指定的URL,获取页面的HTML并将其保存到pageContent.html文件中。使用Puppeteer-Extra和Stealth Plugin,可以有效地绕过网站的自动化检测逻辑。
希望本文有助于您了解如何使用Node.js创建爬虫。利用Puppeteer及其扩展功能,您可以实现更强大、更有效的网络爬取解决方案。




