Nodejs 页面渲染模块

Nodejs 页面渲染模块

现在有一些爬取任务, 但有些站点的页面是需要先渲染,才能得到相应的数据。 直接拉源码分析。获取不到数据。 请问下,node.js 有没有相应的可以渲染页面的模块?

7 回复

当然有!在 Node.js 中处理需要先渲染页面才能获取到数据的情况时,我们可以使用一些专门用于浏览器端渲染(Browser-side Rendering)的库,比如 PuppeteerJSDOM。这两个库都可以帮助我们实现页面的动态渲染,从而获取到完整的 HTML 结构。

Puppeteer

Puppeteer 是一个流行的 Node 库,它提供了一组高级 API 来通过 DevTools 协议控制 Chrome 或 Chromium。使用 Puppeteer,你可以启动一个新的浏览器实例,并通过这个实例来访问和操作网页。

示例代码:

const puppeteer = require('puppeteer');

async function scrapeData() {
    // 启动一个新的浏览器实例
    const browser = await puppeteer.launch();
    
    // 打开一个新的页面
    const page = await browser.newPage();

    // 访问目标网站
    await page.goto('https://example.com');
    
    // 等待某些条件满足后执行操作
    await page.waitForSelector('.some-class');

    // 获取渲染后的页面内容
    const content = await page.content();

    console.log(content);

    // 关闭浏览器
    await browser.close();
}

scrapeData().catch(console.error);

在这个例子中,我们首先使用 puppeteer.launch() 方法启动了一个新的浏览器实例,然后打开一个新页面并访问了指定的 URL。page.waitForSelector('.some-class') 会等待页面中的某个元素出现,确保页面已经完全加载和渲染。最后,我们通过 page.content() 获取到了渲染后的完整 HTML。

JSDOM

如果你想要在 Node.js 中模拟浏览器环境来解析和操作 DOM,那么 JSDOM 就是一个很好的选择。它允许你创建一个虚拟的 DOM 环境,并在其中执行 JavaScript 代码。

示例代码:

const { JSDOM } = require("jsdom");

// 创建一个 JSDOM 实例
const dom = new JSDOM(`<!DOCTYPE html><div id="content">Hello, World!</div>`);

// 使用 JSDOM 提供的 document 对象
const { document } = dom.window;

console.log(document.getElementById("content").textContent);  // 输出 "Hello, World!"

// 可以在 Node.js 中使用 DOM API 操作页面

然而,需要注意的是,JSDOM 主要用于简单的 DOM 操作,并不能像 Puppeteer 那样执行复杂的客户端脚本,所以对于需要渲染的复杂页面,Puppeteer 更加合适。

希望这些信息对你有所帮助!


爬虫可以用cheerio

这个可以渲染页面吗?

http://phantomjs.org/ 你需要这个玩意。。。

之前用过这个,不过速度太差,而且易崩溃。不知是不是不会用的原因

这个,你有实用的示例嘛?

Node.js 中处理需要先渲染才能获取到数据的页面时,可以使用一些专门用于浏览器端渲染的工具或库。常用的方案包括使用 PuppeteerJSDOM

Puppeteer

Puppeteer 是一个 Node 库,它提供了一组高级 API 来通过 DevTools 协议控制 Chrome 或 Chromium。使用 Puppeteer 可以创建和控制无头浏览器实例,并且可以在这些浏览器中执行页面操作、截图、生成 PDF 等。

示例代码:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch(); // 启动浏览器
  const page = await browser.newPage(); // 打开新页面
  await page.goto('https://example.com'); // 导航到目标页面
  await page.waitForSelector('#some-element'); // 等待某个元素出现
  const content = await page.content(); // 获取页面内容
  
  console.log(content); // 输出页面内容

  await browser.close(); // 关闭浏览器
})();

JSDOM

如果你只需要在 Node.js 环境中解析 HTML 文档并进行一些简单的 DOM 操作(不需要实际渲染),可以考虑使用 JSDOM。它是一个纯 JavaScript 实现的浏览器 DOM 模拟器。

示例代码:

const { JSDOM } = require('jsdom');

const htmlContent = `
<!DOCTYPE html>
<html>
<head><title>Example Page</title></head>
<body>
  <div id="content">Hello World!</div>
</body>
</html>
`;

const dom = new JSDOM(htmlContent);
const { window } = dom;

console.log(window.document.querySelector('#content').textContent); // 输出 "Hello World!"

总结

  • 如果你需要模拟真实的浏览器环境,推荐使用 Puppeteer
  • 如果只是需要解析静态 HTML 并进行简单的 DOM 操作,可以考虑使用 JSDOM

希望这些信息对你有帮助!

回到顶部