当刮取Google搜索时更改设置特定用户代理字符串时,CasperJS会返回不同的结果

时间:2016-04-03 12:44:42

标签: javascript web-scraping phantomjs casperjs

我正在加载带有预设搜索字词的Google搜索页面(" Apples")。然后我想在搜索框中键入以查找其他内容,但它没有按预期运行(代码下方的详细说明)。

var links = [];
var casper = require('casper').create({
    // verbose: true, 
    // logLevel: "debug" 
    // pageSettings: {
    //  userAgent: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5'
    // }
});

function getLinks() {
    var links = document.querySelectorAll('h3.r a');
    return Array.prototype.map.call(links, function(e) {
        return e.innerText;
    });
}

casper.start('https://www.google.com/#safe=off&q=Apples', function() {
    // search for 'casperjs' from google form
    this.fill('form[action="/search"]', { q: 'casperjs' }, true);
    casper.capture('screenshot/googleresults1.png');

});

casper.then(function() {
    // aggregate results for the 'casperjs' search
    links = this.evaluate(getLinks);
    casper.capture('screenshot/googleresults2.png');
    // now search for 'phantomjs' by filling the form again
    this.fill('form[action="/search"]', { q: 'phantomjs' }, true);

});

casper.then(function() {
    // aggregate results for the 'phantomjs' search
    links = links.concat(this.evaluate(getLinks));
});

casper.run(function() {
    // echo results in some pretty fashion
    this.echo(links.length + ' links found:');
    casper.capture('screenshot/googleresults3.png');
    this.echo(' - ' + links.join('\n - ')).exit();
});

我遇到的错误:

  • 在.create()中包含用户代理在控制台中没有给出任何结果。
  • 评论用户代理但包括详细和Loglevel,给了我" Apples"结果
  • 评论一切都给了我正确的结果(Casperjs和Phantomjs)

我的问题:

  1. 我不明白为什么同时使用Verbose和LogLevel给我" Apples"你可以在casper.start函数中看到结果。
  2. 为什么启用用户代理会给我0结果?
  3. 还有其他人得到这个吗?如您所见,通过搜索框中输入的填充函数,正确的结果应该是Casperjs和Phantomjs。

    我的3次捕获的截图 Screenshot1
    Screenshot2
    Screenshot3

    在我的控制台中重复几次程序后,在某些情况下,第一次填充操作似乎不会继续。因此,它刮擦了Apple。但是,我想知道为什么会这样?我应该改为使用其他功能吗?

1 个答案:

答案 0 :(得分:2)

Google会根据用户代理,视口大小和其他指标提供不同的页面。

不同的页面可以在PhantomJS中无法正常运行的其他JavaScript中显示出来(点击和提交内容总是一个问题)。也可以在不同配置(用户代理,视口大小)之间添加,删除或更改其ID。

您应截取屏幕截图(casper.capture(filename))并保护当前页面来源(fs.write(filename, casper.getHTML())),以查看与您在桌面浏览器中看到的内容相比是否存在差异。

脚本中的特定问题:

  • 如果没有页面加载,则应使用其中一个casper.wait*函数来等待更改的内容。 casper.then()是一个异步步骤函数,通常只捕获整页加载 在该注释中,casper.fill()立即完成,但页面可能需要一段时间,直到实际加载了输入的内容。因此,casper.capture()之后立即使用casper.fill()将无法提供预期结果。

  • CasperJS函数内的
  • this始终引用casper。所以,你可以互换使用它们。