CasperJS returns 抓取 Google 搜索时更改特定用户代理字符串设置时的不同结果

CasperJS returns different results when change setting a specific user agent string when scraping Google search

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

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();
});

我遇到的bug:

我的问题:

  1. 我不明白为什么同时打开 Verbose 和 LogLevel 会得到 "Apples" 结果,正如您在 casper.start 函数中看到的那样。
  2. 为什么打开用户代理给我 0 个结果?

还有其他人得到这个吗?如您所见,通过在搜索框中输入的两个填充函数,正确的结果应该是 Casperjs 和 Phantomjs。

我的 3 次截图


在我的控制台中重复该程序几次后,在某些情况下,第一次填充操作似乎没有进行。因此,它刮了苹果。但是,我想知道这是为什么?我应该改用另一个功能吗?

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

不同的页面可以在额外的 JavaScript 中表现出来,这在 PhantomJS 中不正确 运行(点击和提交内容总是一个问题)。也有可能在不同配置(用户代理、视口大小)之间添加、删除元素或更改它们的 ID。

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


脚本中的特定问题:

  • 如果没有页面加载,那么您应该使用casper.wait*功能之一来等待更改的内容。 casper.then() 是一个异步步骤函数,通常只捕获整页加载。
    请注意,casper.fill() 会立即完成,但页面可能需要一段时间才能实际加载输入的内容。因此,在 casper.fill() 之后立即使用 casper.capture() 不会给出预期的结果。

  • CasperJS 函数内部的
  • this 总是引用 casper。因此,您可以互换使用它们。