有一种方法,可以使用Nightmare或类似工具来访问json响应?

时间:2019-05-15 11:06:56

标签: javascript nightmare

我遇到一个类似于this的问题,其中我正在使用Nightmare登录页面并浏览页面。在此页面中,某些请求会获得json响应以填充数据(在“网络”标签中可见)。有什么方法可以访问此json而不是解析页面本身?

var Nightmare = require('nightmare');
const nightmare = Nightmare({ show: true });
nightmare
    .goto('https://my.url/')
    .type('#user_id', 'myUserId')
    .type('#password', 'passw0rd')
    .click('#button-login')
    .wait(3000)
    .goto('specific-url') // this URL loads a page with some data
    .end()
    .then(console.log)    // this prints stuff like HTTP response: OK
    .catch((error) => {
    console.error('Search failed:', error);
});

感谢您的帮助。谢谢

1 个答案:

答案 0 :(得分:1)

由于我没有使用过噩梦或已安装的节点,因此无法自己进行测试,但根据我读过的here的知识,这也许可以解决问题:

var Nightmare = require('nightmare');
const nightmare = Nightmare({ show: true });
nightmare
    .goto('https://my.url/')
    .type('#user_id', 'myUserId')
    .type('#password', 'passw0rd')
    .click('#button-login')
    .wait(3000)
    .goto('specific-url') // this URL loads a page with some data
    .wait(1000)
    .evaluate(() => {
        var jsonUrl = 'needs to contain the address of the JSON backend';
        var filename = './json-result.json';
        var file = fs.createWriteStream(filename);
        var request = http.get(jsonUrl, function (response) {
          response.pipe(file);
        });
      }
    )
    .end()
    .then(console.log)    // this prints stuff like HTTP response: OK
    .catch((error) => {
      console.error('Search failed:', error);
    });

这要求您拥有一个被调用的静态URL,然后将返回JSON响应。如果您需要传递其他参数,则最好在evaluate()块内使用XMLHttpRequest,如所述的here