使用CasperJS递归解析Google搜索结果

时间:2016-02-18 19:26:50

标签: javascript casperjs

我正在使用下面的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();

这似乎在一个永无止境的循环中一遍又一遍地搜索第二页,而不是前进到下一页。

我做错了什么?

1 个答案:

答案 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语句后不会执行任何代码 请更加小心,不要左右创建全局变量。