繁体   English   中英

我可以在node.js命令行窗口中逐行编写人偶脚本吗?

[英]Can I script puppeteer line by line in the node.js command line window?

我有一个网站正在尝试自动从中抓取数据。 我有一个合法帐户,需要通过编程收集数据来简化生活。 问题是,对于伪造者代码的每次迭代,我的帐户都重新登录,并且经过几轮编码后,我从服务(MLS)收到一封电子邮件,他们注意到我的帐户存在可疑活动。 我的问题是,是否可以实时编写操纵p的代码,因此我可以在同一会话中测试不同的代码行?

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

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
>

puppeteer.launch是一个异步函数,它返回Promise 这意味着您应该在async函数中await它,或者将后续代码放入.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> }

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

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

再次等待,然后继续:

> global.page.goto('http://stackoverflow.com')
Promise { <pending> }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM