我正在使用下面的CasperJS脚本递归解析谷歌为查询site:https://www.launchgood.com/project/
提供的(多页)搜索结果。
var links = [];
var casper = require('casper').create();
function getLinks() {
var currentLinks = document.querySelectorAll('h3.r a');
return Array.prototype.map.call(currentLinks, function(e) {
rawHref = e.getAttribute('href');
urlPattern = /.*(https?[:/]+[^&]+).*/g;
cleanHref = urlPattern.exec(rawHref);
return cleanHref[1];
});
Array.prototype.push.apply(links, currentLinks);
this.echo(' - ' + currentLinks.join('\n - '));
}
function parseAndContinue() {
links = this.evaluate(getLinks);
// now click 'Next'
if(this.exists('a.fl')) {
this.thenClick('a.fl');
this.then(parseAndContinue);
} else {
this.exit();
}
}
casper.start('http://google.com/ncr', function() {
// search from google form
this.fill('form[action="/search"]',
{ q: 'site:https://www.launchgood.com/project/' }, true);
});
casper.then(parseAndContinue);
casper.run();
这似乎在一个永无止境的循环中一遍又一遍地搜索第二页,而不是前进到下一页。
我做错了什么?
答案 0 :(得分:1)
除了不打印任何东西外,你看起来很好。 getLinks
是在页面上下文中计算的函数。 this
指的是页面上下文中的全局对象,window
。您无法访问页面上下文中的casper
,因为它是沙盒,只能传入或传出基本对象。它无法访问在其外部定义的变量(无法访问links
)。
function getLinks() {
var currentLinks = document.querySelectorAll('h3.r a');
return Array.prototype.map.call(currentLinks, function(e) {
var rawHref = e.getAttribute('href');
var urlPattern = /.*(https?[:/]+[^&]+).*/g;
var cleanHref = urlPattern.exec(rawHref);
return cleanHref[1];
});
}
function parseAndContinue() {
var links = this.evaluate(getLinks);
console.log(JSON.stringify(links, undefined, 4));
// now click 'Next'
if(this.exists('a.fl')) {
this.thenClick('a.fl');
this.then(parseAndContinue);
} else {
this.exit();
}
}
此外,return
语句后不会执行任何代码
请更加小心,不要左右创建全局变量。