我对 CasperJS 比较陌生,写过简单的抓取脚本,现在我面临一项更艰巨的任务:我想从 url 列表中抓取某种数据,但有些页面有时会“失败”,我有一个验证码解决服务,因为其中一些页面默认有验证码,但是 phantomjs 在渲染一些验证码时相当不一致,有时它们会加载,有时它们不会。
我认为的解决方案是使用无法加载验证码的页面重新运行脚本,以获得我需要的数据量。但我似乎没有让它运行,我想用整个东西创建一个函数,然后在casper.run()
方法内部调用它并检查如果不重新运行,抓取的数据量是否满足我需要的最小值,但我没有真的知道如何完成它,至于我所看到的 casperjs 在调用函数之前将步骤添加到堆栈中(如果我错了,请纠正我)。此外,我正在考虑使用该run.complete
事件,但不太确定该怎么做。我的脚本是这样的:
// This variable stores the amount of data collected
pCount = 0;
urls = ["http://page1.com","http://page2.com"];
// Create casperjs instance...
casper.start();
casper.eachThen(urls, function(response) {
if (pCount < casper.cli.options.number) {
casper.thenOpen(response.data, function(response) {
// Here is where the magic goes on
})
}
})
casper.run();
无论如何我可以将casper.eachThen()
块包装在一个函数中并做这样的事情吗?
casper.start();
function sample () {
casper.eachThen(urls, function(response) {
if (pCount < casper.cli.options.number) {
casper.thenOpen(response.data, function(response) {
// Here is where the magic goes on
})
}
})
}
casper.run(sample);
此外,我尝试使用 slimerjs 作为引擎来避免“不一致”,但我无法在我拥有的__utils__.sendAjax()
内部使用该方法casper.evaluate()
,所以它是一个交易破坏者。或者有没有办法在单独的实例中异步执行 GET 请求?如果是这样,我会很感激你的建议
更新:我从未设法用 casperjs 解决它,但我仍然为我的特定用例找到了解决方法,请查看我的答案以获取更多信息