我正在使用这个卡佩吉斯节点应用程序:https://github.com/narainsagar/node-casperjs-aws-lambda
我已经让我的代码在本地工作,并上传到Lambda,但我需要将我的代码包装在里面exports.handler这样我就可以从API网关向函数传递数据。(我已经对不使用这个应用程序的其他函数这样做了。)当我将代码放在里面时exports.handler失败了。我已经测试了将事件数据添加到lambda内部的测试事件中,我尝试了硬编码。当我的代码在里面时,两者都失败了exports.handler.为什么exports.handler破坏这段代码?
不带导出处理程序的工作代码:
var ua = 'Mozilla/5.0 (iPad; CPU OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
var casper = require('casper').create({
viewportSize: {width: 768, height: 1024},
userAgent: ua
});
var login = {email: 'fakeemail@gmail.com', pw: 'fakepw'}
var usrObj = {
succ: {},
err: []
};
//exit function
function exit() {
setTimeout(function() {
casper.exit();
casper.bypass(1);
}, 10);
}
//success & error message function
function message(dat) {
if (dat === 'credentials') {
console.log('Error: Login credentials are missing');
return exit();
}
else if (dat) {
console.log(dat);
return exit();
}
if (usrObj['err'].length > 0) {
console.log('Error not empty...');
console.log(usrObj.err);
return exit();
}
else if (usrObj['succ']) {
console.log('Success not empty...');
console.log(JSON.stringify(usrObj.succ));
return exit();
}
}
//trim login credentials
login.email = login.email.trim();
login.pw = login.pw.trim();
if (login.email && login.pw) {
casper.start('https://vimeo.com/log_in');
casper.waitForSelector('form#login_form',
function success() {
this.echo(this.getCurrentUrl());
this.sendKeys('form#login_form input[name="email"]', login.email);
this.sendKeys('form#login_form input[name="password"]', login.pw);
this.click('form#login_form input[type=submit][value="Log in with email"]');
},
function fail() {
message('Error with Vimeo [page not loading]')
}
);
casper.waitForSelector('#page_header>h1>a',
function success() {
this.echo(this.getCurrentUrl());
usrObj['succ']['uname'] = this.getHTML('span.topnav_user_name');
usrObj['succ']['profile'] = this.getElementAttribute('li.topnav_user_profile>a', 'href');
var test = [];
if (!usrObj.succ.uname) {test.push('Username not retrieved')}
if (!usrObj.succ.profile) {test.push('Profile link not retrieved')}
if (test.length > 0) {message(test.join('<br />'));}
//else {message();}
},
function fail() {
message('Login not successful');
}
);
casper.thenOpen('https://vimeo.com/staceydavidgearz',
function success() {
this.echo('Stacey David Profile: ' + this.getTitle());
this.echo(this.getCurrentUrl());
var finish = function() {
usrObj['succ']['foll'] = true;
message();
}
//var foll = this.getHTML('button[data-fatal-attraction="container:profile_page|component:follow"] > span');
var foll = this.getElementAttribute('button[data-fatal-attraction="container:profile_page|component:follow"] > svg', 'viewBox');
if (foll === '0 0 10 10') {
this.click('button[data-fatal-attraction="container:profile_page|component:follow"]');
setTimeout(function() {
foll = this.getElementAttribute('button[data-fatal-attraction="container:profile_page|component:follow"] > svg', 'viewBox');
if (foll === '0 0 10 10') {
message('Can\'t follow SD');
}
else {finish();}
}, 250);
}
else {
finish();
}
},
function fail() {
message('Not going to Stacey David profile page.');
}
);
casper.run();
}
else {message('credentials');}
exports.handler代码失败:
var ua = 'Mozilla/5.0 (iPad; CPU OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1';
var casper = require('casper').create({
viewportSize: {width: 768, height: 1024},
userAgent: ua//,
//verbose: true,
//logLevel: 'debug'
});
exports.handler = function (event, context) {
var login = {};
var usrObj = {
succ: {},
err: []
};
//exit function
var exit = function() {
setTimeout(function() {
casper.page.close();
casper.exit();
casper.bypass(1);
}, 10);
};
//success & error message function
var message = function(dat) {
if (dat === 'credentials') {
usrObj['err'].push('Error: Login credentials are missing');
}
else if (dat) {
usrObj['err'].push(dat);
}
if (usrObj['err'].length > 0) {
console.log('Error not empty...');
console.log(JSON.stringify(usrObj.err));
context.fail(JSON.stringify(usrObj.err));
return exit();
}
else if (usrObj['succ']) {
console.log('Success not empty...');
console.log(JSON.stringify(usrObj.succ));
context.succeed(JSON.stringify(usrObj.succ));
return exit();
}
};
//trim login credentials
login.email = event.email;
login.pw = event.pw;
if (login.email && login.pw) {
casper.start('https://vimeo.com/log_in');
casper.waitForSelector('form#login_form',
function success() {
this.echo(this.getCurrentUrl());
this.sendKeys('form#login_form input[name="email"]', login.email);
this.sendKeys('form#login_form input[name="password"]', login.pw);
this.click('form#login_form input[type=submit][value="Log in with email"]');
},
function fail() {
message('Error with Vimeo [page not loading]')
}
);
casper.waitForSelector('#page_header>h1>a',
function success() {
this.echo(this.getCurrentUrl());
usrObj['succ']['uname'] = this.getHTML('span.topnav_user_name');
usrObj['succ']['profile'] = this.getElementAttribute('li.topnav_user_profile>a', 'href');
var test = [];
if (!usrObj.succ.uname) {test.push('Username not retrieved')}
if (!usrObj.succ.profile) {test.push('Profile link not retrieved')}
if (test.length > 0) {message(test.join('<br />'));}
//else {message();}
},
function fail() {
message('Login not successful');
}
);
casper.thenOpen('https://vimeo.com/staceydavidgearz',
function success() {
this.echo('Stacey David Profile: ' + this.getTitle());
this.echo(this.getCurrentUrl());
var finish = function() {
usrObj['succ']['foll'] = true;
message();
}
var foll = this.getElementAttribute('button[data-fatal-attraction="container:profile_page|component:follow"] > svg', 'viewBox');
if (foll === '0 0 10 10') {
this.click('button[data-fatal-attraction="container:profile_page|component:follow"]');
setTimeout(function() {
foll = this.getElementAttribute('button[data-fatal-attraction="container:profile_page|component:follow"] > svg', 'viewBox');
if (foll === '0 0 10 10') {
message('Can\'t follow SD');
}
else {finish();}
}, 250);
}
else {
finish();
}
},
function fail() {
message('Not going to Stacey David profile page.');
}
);
casper.run();
}
else {message('credentials');}
};
λ响应:
身体
[]
日志:
Calling casperJS: /var/task/node_modules/casperjs/bin/casperjs [ '/var/task/casperjs-script.js' ] { PHANTOMJS_EXECUTABLE: '/var/task/phantomjs' }
child process exited with code 1
请点击此链接:https://github . com/narainsagar/node-Casper js-AWS-lambda/issues/6 # issue comment-279177650
嗨,你可以通过casper参数支持将你的数据传递给scraper脚本:
对索引中的runCasper函数进行一些更改。js文件如下:
var childArgs = [
path.join(__dirname, scriptName),
***@***.***',
'--password=12345'
];
在casper脚本中,您可以获得如下参数数据:
var utils = require('utils');
utils.dump(casper.cli.get('email'));
utils.dump(casper.cli.get('password'));
// OR
// utils.dump(casper.cli.raw.get('email'));
// utils.dump(casper.cli.raw.get('password'));
希望这能有所帮助…
干杯,
纳兰
确保您还上传了依赖项“node_modules”和casper组件。给出该错误是因为在lambda执行中没有在require中找到该组件。
假设我们有以下三个类: 这将产生以下错误: 既然是整数,为什么它不选择类型?
问题内容: 考虑以下Java源代码: 该是。 为什么该语句有时会抛出? 谢谢。 问题答案: 线程安全 如果您的代码是多线程的,则有可能。例如: 如果在语句执行之后(但在循环之前)立即将另一个线程设置为,则您将获得一个。通过使用访问器(与延迟初始化结合使用)可以避免这种情况。 另外,如其他人所提到的,如果可能,请避免使用有利于泛型的此类循环构造。有关详细信息,请参见其他答案。 配件提供保护 如果始终
我使用以下代码执行HTTP POST请求并反序列化返回的值: 为了让它更容易使用,我尝试将代码封装在一个函数中,如下所示: 然而,当代码被放入函数中时,它就会停止工作。它抛出。似乎有些类型信息在途中丢失了。 null
因此,下面的代码,从txt文件中取序列号作为参数,在我的计算机上正常工作。每个数字都写在一行上。下面是代码: 但它在CodeEval中不起作用。站点编译器是这么说的: Fontconfig错误:无法加载默认配置文件线程“main”java.awt.HeadLessException:未设置X11显示变量,但此程序执行了需要它的操作。在java.awt.GraphicsEnvironment.Che
我的代码: 错误: 第8行的错误1064(42000):您的SQL语法中有一个错误;请查看与您的MySQL服务器版本相对应的手册,以便在第9行')'附近使用正确的语法
我想了解为什么一段代码不会抛出NullPointerException。 请考虑以下代码: 方法被重复调用,同时以下代码在单独的线程中运行: 只有一个实例。 从不引发NullPointerException。 但是,当方法暂停时,即使暂停0毫秒,也会按预期引发NullPointerException: 我的理解是,在理论上,在检查和调用之间存在竞争条件。在实践中,如果不引入暂停(即从后续方法调用中