请问Nodejs有没有爬虫模块可以实现解析ajax网站

请问Nodejs有没有爬虫模块可以实现解析ajax网站

不是在XHR返回这些内容后,插入到html里边去

8 回复

当然,Node.js 社区提供了多种强大的工具来处理 AJAX 网站的数据抓取。一个非常流行的选择是使用 Puppeteer 这个库,它允许你通过无头浏览器(Headless Browser)来模拟真实的用户行为,从而能够执行 JavaScript 并获取渲染后的页面内容。

Puppeteer 示例代码

const puppeteer = require('puppeteer');

(async () => {
    // 启动一个无头浏览器实例
    const browser = await puppeteer.launch({ headless: false }); // 设置为 true 可以让浏览器在后台运行
    const page = await browser.newPage();

    // 导航到目标网页
    await page.goto('https://example.com/ajax-loaded-content', { waitUntil: 'networkidle2' });

    // 等待特定的元素加载完成
    await page.waitForSelector('#specificElementId');

    // 获取页面渲染后的 HTML
    const content = await page.content();
    console.log(content);

    // 或者你可以直接获取某个元素的文本内容
    const specificText = await page.$eval('#specificElementId', el => el.textContent);
    console.log(specificText);

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

解释

  1. Puppeteer: 它是一个 Node 库,可以控制 Chrome 或 Chromium 通过 DevTools 协议。这使得我们可以自动化网页的导航、表单填写、点击按钮等操作。

  2. 无头模式: headless: false 参数让你可以在有界面的浏览器中看到操作过程。如果你不需要可视化输出,可以将其设置为 true 以提高效率。

  3. 等待页面加载: page.goto 方法会导航到指定 URL,并且可以通过 { waitUntil: 'networkidle2' } 来确保页面上的所有资源都已加载完毕。

  4. 选择器: page.waitForSelector 方法用来等待某个 DOM 元素出现在页面上,这对于处理动态加载的内容特别有用。

  5. 获取内容: page.content() 返回当前页面的完整 HTML,而 page.$eval 则允许你执行类似 jQuery 的选择器,并获取该元素的属性或文本内容。

通过这种方式,Puppeteer 可以有效地处理那些依赖于 AJAX 加载数据的网站,确保你能抓取到最终渲染出来的页面内容。


什么是:解析ajax网站 ?

ajax 返回的一般是JSON数据,已经是带结构的了。如果返回的是HTML,可以用 jsdom + jquery 进行页面搜寻。

现在遇到一个爬行问题,目标网站的 “ajax”是服务器端已经完成了的,他把我的目标内容写在script里面,通过模板语言,在页面尾部插入了一堆准备插入到html里的、带转义的字符串,然后加载自身封装的js方法把这些字符串插入到页面里边,导致无法正确根据html内容,来生成dom对象。

之前好像有讨论过。。。。用phantomjs。。。

楼主这个问题解决的怎么样了?

有解决方案么?能不能共享一下?

求共享

要实现解析AJAX网站,可以使用一些强大的Node.js库。这些库可以帮助你模拟浏览器行为并处理动态加载的内容。常用的库包括PuppeteerCasperJSNightmare。其中,Puppeteer是最受欢迎的选择之一。

示例代码:使用Puppeteer

首先,你需要安装Puppeteer库:

npm install puppeteer

然后,你可以使用以下示例代码来获取经过AJAX加载的数据:

const puppeteer = require('puppeteer');

(async () => {
    // 启动浏览器
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    // 访问目标网页
    await page.goto('https://example.com', { waitUntil: 'networkidle2' });

    // 获取页面内容
    let content = await page.content();
    console.log(content);

    // 执行JavaScript以模拟用户操作,比如点击按钮等
    await page.evaluate(() => {
        // 这里可以写入执行AJAX请求或点击按钮的JavaScript代码
        document.querySelector('#someButton').click();
    });

    // 等待新的内容加载完成
    await page.waitForSelector('#newContent');

    // 获取更新后的内容
    let updatedContent = await page.content();
    console.log(updatedContent);

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

解释

  1. 启动浏览器:使用puppeteer.launch()启动一个无头浏览器实例。
  2. 访问网页:使用page.goto()访问目标网页,并设置waitUntil: 'networkidle2'等待所有网络活动停止。
  3. 获取初始内容:使用page.content()获取当前页面的内容。
  4. 执行JavaScript:使用page.evaluate()在页面上下文中执行JavaScript代码。例如,点击某个按钮来触发AJAX请求。
  5. 等待新内容加载:使用page.waitForSelector()等待新的元素加载完成。
  6. 获取更新后的页面内容:再次使用page.content()获取更新后的页面内容。
  7. 关闭浏览器:最后使用browser.close()关闭浏览器。

通过这种方式,你可以有效地抓取和解析经过AJAX加载的网页内容。

回到顶部