【问题标题】:PhantomJS querySelectorAll().textcontent returns nothingPhantomJS querySelectorAll().textcontent 不返回任何内容
【发布时间】:2016-09-22 06:45:45
【问题描述】:

我创建了一个简单的网络爬虫,使用 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();
});

请帮我解决这个问题。

非常感谢。

【问题讨论】:

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


    【解决方案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");
    

    设置用户代理之前:

    设置 Firefox 用户代理后

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-31
      • 2020-04-27
      • 2019-04-06
      • 2012-02-15
      • 2020-09-07
      • 2021-11-22
      • 2015-11-06
      • 2013-11-14
      相关资源
      最近更新 更多