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:
- 在 .create() 中包含用户代理让我在控制台中没有结果。
- 注释掉用户代理但包括 Verbose 和 Loglevel,给我 "Apples" 结果
- 注释掉所有内容给我正确的结果(Casperjs 和 Phantomjs)
我的问题:
- 我不明白为什么同时打开 Verbose 和 LogLevel 会得到 "Apples" 结果,正如您在 casper.start 函数中看到的那样。
- 为什么打开用户代理给我 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
。因此,您可以互换使用它们。
我正在加载带有预设搜索词 ("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:
- 在 .create() 中包含用户代理让我在控制台中没有结果。
- 注释掉用户代理但包括 Verbose 和 Loglevel,给我 "Apples" 结果
- 注释掉所有内容给我正确的结果(Casperjs 和 Phantomjs)
我的问题:
- 我不明白为什么同时打开 Verbose 和 LogLevel 会得到 "Apples" 结果,正如您在 casper.start 函数中看到的那样。
- 为什么打开用户代理给我 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
。因此,您可以互换使用它们。