0

我有一个网站,我正在尝试自动从中抓取数据。我有一个合法帐户,需要通过以编程方式收集数据来让我的生活更轻松。问题是,对于我的 puppeteer 代码的每次迭代,我的帐户都会重新登录,经过几轮编码后,我从服务 (MLS) 收到一封电子邮件,他们注意到我的帐户上有可疑活动。我的问题是,是否可以实时编写 puppeteer 代码,以便我可以在同一会话中测试不同的代码行?

到目前为止,我已经尝试过:

const puppeteer = require('puppeteer');
const fs = require("fs");
const browser = puppeteer.launch({headless: false, ignoreHTTPSErrors: true, args: ['--start-maximized'], defaultViewport: null, slowMo: 150})
const page = browser.newPage();
page.goto('https://idp.sdmls.com/idp/Authn/UserPassword',{waitUntil: 'networkidle2'});

Chromium 窗口打开,但没有别的。我在命令行窗口中得到这个:

> const puppeteer = require('puppeteer');
undefined
> const fs = require("fs");
undefined
>
> const browser = puppeteer.launch({headless: false, ignoreHTTPSErrors: true, args: ['--start-maximized'], defaultViewport: null, slowMo: 150})
undefined
> const page = browser.newPage();
TypeError: browser.newPage is not a function
> page.goto('https://idp.sdmls.com/idp/Authn/UserPassword',{waitUntil: 'networkidle2'});
ReferenceError: page is not defined
>
4

1 回答 1

0

puppeteer.launch是一个异步函数,它返回一个Promise. 这意味着您应该awaitasync函数中使用它,或者将后续代码放入.then().

由于您想使用 Node.js 命令行,因此您不能直接await使用它。有几种选择:

选项1:将您的代码放入.then()

$ node
Welcome to Node.js v12.1.0.
Type ".help" for more information.
> const options = {headless: false, ignoreHTTPSErrors: true, args: ['--start-maximized'], defaultViewport: null, slowMo: 150};
...
> const puppeteer = require('puppeteer');
undefined
> const browserPromise = puppeteer.launch(options);
undefined
> const pagePromise = browserPromise.then(browser => { return browser.newPage(); });
undefined
> pagePromise.then(page => { page.goto('http://stackoverflow.com'); });
Promise { <pending> }

选项 2(适合调试,但不要尝试在您的实际代码中使用它):将 promise 结果保存到全局对象中并重用。

> puppeteer.launch(options).then(browser => { global.browser = browser; });
Promise { <pending> }

等待一段时间,直到 promise 解决并分配全局对象,然后继续:

> global.browser.newPage().then(page => { global.page = page; });
Promise { <pending> }

再等一下,然后继续:

> global.page.goto('http://stackoverflow.com')
Promise { <pending> }
于 2019-07-05T02:21:07.963 回答