无法使用Puppeteer来刮取dolartoday.com的输入值

时间:2018-03-23 04:08:21

标签: javascript node.js web-scraping puppeteer

我想用{/ p>抓取元素value的{​​{1}}

#result

但它仍然记录以下错误:

 const puppeteer = require('puppeteer');

    (async () => {
      const browser = await puppeteer.launch();
      const page = await browser.newPage();
      await page.goto('https://dolartoday.com');
      await console.log(page.evaluate(() => document.getElementById('result')));

      await browser.close();
    })();

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:0)

首先,您尝试在await(一个同步函数)上而不是console.log()(一个异步函数)上使用page.evaluate()运算符。

您还尝试将Page DOM元素返回到Node.js环境,该环境将不起作用,因为page.evaluate()期望返回serializable

如果您想返回网页上value元素的#result,则应按照以下方式重写逻辑:

console.log(await page.evaluate(() => document.getElementById('result').value));

此外,导航时间已超过30000毫秒(默认最大值)。您可以使用page.goto()函数中的timeout选项来延长最大导航时间:

await page.goto('https://dolartoday.com', {
  timeout: 60000,
});

您还可以使用page.setRequestInterception()page.on('request')拒绝不必要的资源加载到网页中。这将使您的网页加载更快:

await page.setRequestInterception(true);

page.on('request', request => {
  if (['image', 'stylesheet', 'font'].indexOf(request.resourceType()) !== -1) {
    request.abort();
  } else {
    request.continue();
  }
});

您的最终程序应如下所示:

'use strict';

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  await page.setRequestInterception(true);

  page.on('request', request => {
    if (['image', 'stylesheet', 'font'].indexOf(request.resourceType()) !== -1) {
      request.abort();
    } else {
      request.continue();
    }
  });

  await page.goto('https://dolartoday.com', {
    timeout: 60000,
  });

  console.log(await page.evaluate(() => document.getElementById('result').value));

  await browser.close();
})();