相关疑难解决方法(0)

Puppeteer:在.evaluate()中传递变量

我正在尝试将变量传递给Puppeteer中page.evaluate()函数,但是当我使用以下非常简化的示例时,变量是未定义的.evalVar

我是Puppeteer的新手,找不到任何构建的例子,所以我需要帮助将该变量传递给page.evaluate()函数,以便我可以在里面使用它.

const puppeteer = require('puppeteer');

(async() => {

  const browser = await puppeteer.launch({headless: false});
  const page = await browser.newPage();

  const evalVar = 'WHUT??';

  try {

    await page.goto('https://www.google.com.au');
    await page.waitForSelector('#fbar');
    const links = await page.evaluate((evalVar) => {

      console.log('evalVar:', evalVar); // appears undefined

      const urls = [];
      hrefs = document.querySelectorAll('#fbar #fsl a');
      hrefs.forEach(function(el) {
        urls.push(el.href);
      });
      return urls;
    })
    console.log('links:', links);

  } catch (err) {

    console.log('ERR:', err.message);

  } finally {

    // browser.close();

  }

})();
Run Code Online (Sandbox Code Playgroud)

javascript evaluate web-scraping puppeteer

85
推荐指数
5
解决办法
4万
查看次数

如何在javascript中序列化地图?

所以......在js中有这种类型被称为Map,它真的很好......它比迭代和计算的对象更快,所以我真的很喜欢它。但是……您不能像处理对象那样传递 Maps。

我知道我可以将 Map 转换为 JSON,但这样做的成本很高,而且它首先失去了使用 Maps 的意义。

JSON 格式不适用于地图……它适用于对象。

所以...让我们从 JSON 格式稍微移动一下。

有没有办法让我以Map任何方式将 a序列化为一个字符串,以便我可以做相反的事情 - 从所说的序列化Map到最终得到一个Map

最好这种方法应该JSON.stringify和它的对应方法一样容易执行JSON.parse

我想使用Map它,因为它更快更好,但我需要将我的数据作为字符串发送。字符串的格式并不重要,只要我能把它解析回Map

javascript

11
推荐指数
2
解决办法
9918
查看次数

为什么我不能在使用Puppeteer的exposeFunction()函数中访问'window'?

我有一个非常简单的Puppeteer脚本,用于exposeFunction()在无头Chrome中运行一些东西.

(async function(){

    var log = console.log.bind(console),
        puppeteer = require('puppeteer');


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

    var functionToInject = function(){
        return window.navigator.appName;
    }

    await page.exposeFunction('functionToInject', functionToInject);

    var data = await page.evaluate(async function(){
        console.log('woo I run inside a browser')
        return await functionToInject();
    });

    console.log(data);

    await browser.close();

})()
Run Code Online (Sandbox Code Playgroud)

这失败了:

ReferenceError: window is not defined
Run Code Online (Sandbox Code Playgroud)

其中指的是注入的功能.如何window在无头Chrome内部进行访问?

我知道我可以做evaluate(),但这不适用于我动态传递的函数:

(async function(){

    var log = console.log.bind(console),
        puppeteer = require('puppeteer');

    const browser = await puppeteer.launch(); …
Run Code Online (Sandbox Code Playgroud)

google-chrome node.js headless-browser puppeteer

7
推荐指数
2
解决办法
5036
查看次数

如何使用evaluateOnNewDocument和exposeFunction?

最近,我在一个新项目中使用了 Puppeteer。

我对 API 的一部分有一些我不明白的问题。文档对于这些API的介绍非常简单:

  1. page.exposeFunction
  2. page.evaluateOnNewDocument

可以给我一个详细的演示以便更好地理解吗?

javascript puppeteer

5
推荐指数
1
解决办法
1万
查看次数

如何使用Puppeteer动态注入函数进行评估?

我正在使用Puppeteer用于无头Chrome.我希望评估页面内部的一个函数,该函数使用在其他地方动态定义的其他函数的部分.

下面的代码是最小的示例/证明.实际上functionToInject()并且otherFunctionToInject()更复杂并且需要页面DOM.

const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(someURL);       

var functionToInject = function(){
    return 1+1;
}

var otherFunctionToInject = function(input){
    return 6
}

var data = await page.evaluate(function(functionToInject, otherFunctionToInject){
    console.log('woo I run inside a browser')
    return functionToInject() + otherFunctionToInject();
});

return data
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,我得到:

错误:评估失败:TypeError:functionToInject不是函数

我理解的是:functionToInject没有被传递到页面的JS上下文中.但是如何将其传递到页面的JS上下文中?

javascript headless-browser google-chrome-headless puppeteer

4
推荐指数
1
解决办法
5102
查看次数