在抓取之前让NodeJS / JSDom等待完全渲染

时间:2017-01-07 21:25:28

标签: javascript jquery node.js web-scraping jsdom

我试图从我需要登录的网站上抓取数据。不幸的是,我使用JSDom / NodeJS获得的结果与使用Web浏览器(如FF)时的结果不同。特别是,我没有使用用户名,密码和提交按钮获取登录表单。

我对Javascript的理解至少是异步的。但是,我认为"完成" JSDom的函数同步等待页面的完整呈现。我想我想做的是模拟HTTPS get并等待完整的document.ready完成。

var jsdom = require("jsdom");
var jsdom_global = require("jsdom-global");
var fs = require("fs");
var jquery = fs.readFileSync("./jquery-3.1.1.min.js", "utf-8");

jsdom.env({
  url: "https://wemc.smarthub.coop/Login.html#login:",
  src: [jquery],
  done: function (err, window) {
    var $ = window.$;
    if($("button#LoginSubmitButton").length) {
        console.log('Click button found');
    } else {
        console.log('Click button not found');
    }
    // The following text boxes are not coming back:
    // $("input#LoginUsernameTextBox")
    // $("input#LoginPasswordTextBox")

    // If I enable the line below, I see a lot less than I would if I
    // do a view source in any reasonable browser.
    //console.log($("body").html());


  }
});

1 个答案:

答案 0 :(得分:1)

通常情况下会发生这种情况,因为JSDOM在点击页面时不会执行JS。在这种情况下,返回的唯一元素将是服务器呈现的HTML。

您可以尝试使用PhantomJS等无头浏览器模块,看看它是如何实现的。在JSDOM github page.

的底部有一个关于两者之间区别的部分