PhantomJS querySelectorAll()。textcontent什么都不返回

时间:2016-09-22 06:45:46

标签: javascript web-scraping phantomjs screen-scraping webgrabber

我创建了一个简单的Web scraper,通过使用phantomjs从网站上获取数据。当我使用querySelectorAll获取我想要的内容时,它对我不起作用。这是我的整个代码。

 var page = require('webpage').create();

var url = 'https://www.google.com.kh/?gws_rd=cr,ssl&ei=iE7jV87UKsrF0gSDw4zAAg';

page.open(url, function(status){

  if(status === 'success'){

    var title = page.evaluate(function(){
      return document.querySelectorAll('.logo-subtext')[0].textContent;
    });

    console.log(title);
  }
  phantom.exit();
});

请帮我解决这个问题。

非常感谢。

1 个答案:

答案 0 :(得分:1)

默认情况下,PhantomJS的虚拟屏幕尺寸为400x300。

var page = require('webpage').create();
console.log(page.viewportSize.width);
console.log(page.viewportSize.height);
  

400
  300

有些网站会注意到这一点,而不是您在桌面浏览器中看到的普通版本,它们提供了HTML和CSS的移动剥离版本。但我们可以通过设置所需的视口大小来解决这个问题:

page.viewportSize = { width: 1280, height: 800 };

还有一些网站会根据其进行嗅探并做出决定。如果他们不了解您的浏览器,他们可以显示移动版本是安全的,或者如果他们不想被刮,他们可以拒绝与PhantomJS的连接,因为它诚实地声明自己:

console.log(page.settings.userAgent);
  

Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 538.1(KHTML,与Gecko一样)PhantomJS / 2.1.1 Safari / 538.1

但我们可以设置所需的用户代理:

 page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0';

当处理这些脆弱的东西和网页抓取时,你真的应该注意到你可以得到的任何错误和系统消息。

因此没有PhantomJS脚本没有onError和onConsoleMessage回调:

page.onError = function (msg, trace) {
    var msgStack = ['ERROR: ' + msg];
    if (trace && trace.length) {
      msgStack.push('TRACE:');
      trace.forEach(function(t) {
        msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function +'")' : ''));
      });
    }
    console.log(msgStack.join('\n'));
};   

page.onConsoleMessage = function (msg) {
    console.log(msg);
};   

PhantomJS脚本调试的另一项重要技术是制作屏幕截图。 您确定PhantomJS能够看到您在Chrome中看到的内容吗?

 page.render("google.com.png");

在设置用户代理之前:

screenshot with native PhantomJS useragent

设置Firefox用户代理

after setting Firefox useragent