node.js请求具有异步脚本的网页

时间:2016-01-22 20:31:37

标签: javascript node.js request httprequest

我使用request模块下载网页非常简单。

我的问题是,我尝试下载的页面有一些异步脚本(具有异步属性),并且未通过http请求返回html文档而下载它们。

我的问题是如何使用/ with-out(最好带有)请求模块发出http请求,并且由于某些边缘情况,如上所述使WHOLE页面无异常下载。

2 个答案:

答案 0 :(得分:2)

听起来你正在尝试使用Javascript进行webscraping。

使用request是一种非常有趣的方法,可能会因为您的需求太低而耗费精力。这个主题非常广泛,但你应该研究更多专门构建的模块,如cheerio,x-ray和nightmare。

x-ray x-ray将允许您以类似jquery的方式直接从页面中选择元素,而不是解析整个身体。

nightmare提供了一个现代无头浏览器,使您可以像手动使用浏览器一样输入输入。有了这个,您应该能够更好地处理导致问题的ajax类型请求。

HTH祝你好运!

答案 1 :(得分:0)

仅使用请求,您可以尝试以下方法来提取异步脚本。

注意:我已经通过一个非常基本的设置对此进行了测试,并且还有一些工作要做,以使其健壮。但是,它对我有用:

测试设置

要设置测试,我创建一个html文件,其中包含正文中的脚本,如下所示:<script src="abc.js" async></script>

然后创建临时服务器以启动它(httpster)

刮板

"use strict";

const request = require('request');

const options1 = { url: 'http://localhost:3333/' }

// hard coded script name for test purposes
const options2 = { url: 'http://localhost:3333/abc.js' }

let htmlData  // store html page here

request.get(options1)
    .on('response', resp => resp.on('data', d => htmlData += d))
    .on('end', () => {
        let scripts; // store scripts here

        // htmlData contains webpage
        // Use xml parser to find all script tags with async tags
        // and their base urls
        // NOT DONE FOR THIS EXAMPLE

        request.get(options2)
            .on('response', resp => resp.on('data', d => scripts += d))
            .on('end', () => {
                let allData = htmlData.toString() + scripts.toString();
                console.log(allData);
            })
           .on('error', err => console.log(err))
    })
    .on('error', err => console.log(err))

这个基本的例子有效。您需要在页面上找到所有js脚本并提取我未在此处完成的URL部分。