node.js请求包含asynchronous脚本的网页

我正在使用非常简单的请求模块下载网页。

我的问题是,我试图下载的页面有一些asynchronous脚本(具有asynchronous属性),他们不下载与HTTP请求的HTML文档返回。

我的问题是如何使用/不带(最好带)请求模块发出http请求,并且由于某些边缘情况使得整个页面没有例外地下载,如上所述。

听起来就像你正在尝试使用Javascript做webscraping。

使用request是一个非常有趣的方法,可能太低层次,并且会耗费您的需求。 这个话题非常广泛,但你应该看看更多的目的build立模块,如cheerio,X射线和噩梦。

X射线 X射线将让你直接从页面中以jquery的方式select元素,而不是parsing整个身体。

恶梦提供了一个现代化的无头浏览器,使您可以inputinput,就像手动使用浏览器一样。 有了这个,你应该能够更好地处理导致你的问题的ajaxtypes的请求。

HTH,祝你好运!

只使用请求,你可以尝试下面的方法来拉asynchronous脚本。

注:我已经testing了这个非常基本的设置,并有一些工作要做,以使其健壮。 但是,它为我工作:

testing设置

为了设置testing,我创build了一个html文件,其中包含一个脚本,如下所示: <script src="abc.js" async></script>

然后创build临时服务器来启动它(HTTTER)

刮刀

 "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)) 

这个基本的例子工作。 你将需要find页面上的所有js脚本,并提取我没有在这里完成的url部分。