完成所有脚本和页面加载后,如何获取所有html数据? (木偶)

时间:2019-02-06 22:16:13

标签: javascript node.js parsing web-scraping puppeteer

最后,我弄清楚了如何使用Node.js。安装了所有库/扩展。因此puppeteer可以正常工作,但是像以前使用Xmlhttp一样...它仅获取页面的模板/正文,而没有必要的信息。页面上的所有脚本都会在浏览器(Web应用程序?)中打开几秒钟后激活。加载整页后,我需要在某些标签内获取信息。另外,我会问,是否有可能使用纯JavaScript,因为我没有使用类似jQuery的代码。所以对我来说加倍困难...

这是我到目前为止所拥有的。

const puppeteer = require('puppeteer');
const $ = require('cheerio');
let browser;
let page;

const url = "really long link with latitude and attitude";

(async () => puppeteer
  .launch()
  .then(await function(browser) {
    return browser.newPage();
})
  .then(await function(page) {
    return page.goto(url).then(function() {
      return page.content();
    });
  })
  .then(await function(html) {
    $('strong', html).each(function() {
      console.log($(this).text());
    });
  })
  .catch(function(err) {
    //handle error
  }))();

我只在强标签内获得模板默认主体元素。但是它应该包含的数据不止10个。

3 个答案:

答案 0 :(得分:14)

如果您想要与检查相同的完整html?在这里:

    const puppeteer = require('puppeteer');

    (async function main() {
      try {
        const browser = await puppeteer.launch();
        const [page] = await browser.pages();

        await page.goto('https://example.org/', { waitUntil: 'networkidle0' });
        const data = await page.evaluate(() => document.querySelector('*').outerHTML);

        console.log(data);

        await browser.close();
      } catch (err) {
        console.error(err);
      }
    })();

答案 1 :(得分:0)

一些注意事项:

  1. 您不需要cheeriopuppeteer,也不需要重新解析page.content():您已经具有运行所有脚本的完整DOM,并且可以评估{{ 1}}上下文,例如在使用page.evaluate()的浏览器中,并在Web API上下文和Node.js API上下文之间传输可序列化的数据。

  2. 尝试仅使用异步/等待,这将简化您的代码和流程。

  3. 如果需要等到所有脚本和其他依赖项都加载完毕,请在page.goto()中使用window

  4. 如果您怀疑文档脚本需要一些时间才能达到所需的状态,请使用各种测试功能,例如page.waitForSelector()或退回到page.waitFor(milliseconds)

这是一个简单的脚本,可在页面中输出所有标签名称。

waitUntil: 'networkidle0'

您可以更详细地指定任务,我们可以尝试编写更合适的内容。


www.bezrealitky.cz的脚本(任务来自下面的评论):

'use strict';

const puppeteer = require('puppeteer');

(async function main() {
  try {
    const browser = await puppeteer.launch();
    const [page] = await browser.pages();

    await page.goto('https://example.org/', { waitUntil: 'networkidle0' });

    const data = await page.evaluate(
      () =>  Array.from(document.querySelectorAll('*'))
                  .map(elem => elem.tagName)
    );

    console.log(data);

    await browser.close();
  } catch (err) {
    console.error(err);
  }
})();

答案 2 :(得分:-1)

let bodyHTML = await page.evaluate(() => document.documentElement.outerHTML);