Javascript node.js使用异步脚本请求网页

Javascript node.js使用异步脚本请求网页,javascript,node.js,request,httprequest,Javascript,Node.js,Request,Httprequest,我正在下载一个网页使用模块,这是非常直接的 我的问题是,我试图下载的页面有一些异步脚本(具有异步属性),并且它们没有与http请求返回的html文档一起下载 我的问题是,如何使用/不使用(最好是使用)请求模块发出http请求,并让整个页面无例外地下载,如上所述,这是由于一些边缘情况。听起来像是在尝试使用Javascript进行Web垃圾处理 使用request是一种非常基本的方法,它可能太低级,而且对您的需求来说太耗时。主题相当广泛,但您应该了解更多专门构建的模块,如cheerio、x射线和噩梦

我正在下载一个网页使用模块,这是非常直接的

我的问题是,我试图下载的页面有一些异步脚本(具有异步属性),并且它们没有与http请求返回的html文档一起下载


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

听起来像是在尝试使用Javascript进行Web垃圾处理

使用
request
是一种非常基本的方法,它可能太低级,而且对您的需求来说太耗时。主题相当广泛,但您应该了解更多专门构建的模块,如cheerio、x射线和噩梦

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

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


祝你好运

使用only request,您可以尝试以下方法来提取异步脚本

注意:我已经用一个非常基本的设置测试了它,要使它健壮还需要做一些工作。然而,这对我来说很有效:

测试设置 为了设置测试,我创建了一个html文件,其中包括一个脚本,如下所示:

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

刮刀
这个基本的例子有效。您需要在页面上找到所有js脚本,并提取我在这里没有完成的url部分。

使用无头浏览器,maybe@mithril_knight嗨,谢谢你的回复,看看我对克里斯凯利帖子的评论。仍在寻找解决方案。:)还在挣扎,如果有人能帮我找到解决办法,我会很感激你说的对,基本上我是在刮网。我使用regex数组来查找返回文档中可能的URI,因为使用cherrio/jsdom/x-ray等是不够的,因为src/href属性值中没有URI。除此之外,这种无头浏览器也做不到,因为我试图实现的是归档和镜像一个网站(比如HTTrack)。我已经完成了大部分代码,我选择使用请求来处理http请求,但问题是,与在浏览器中打开网站不同,请求模块返回的文档不包含任何异步请求script@Jorayen就在这种情况下,我不得不改用phantomjs,之前我用过cheerio,但和你一样,它没有加载异步脚本内容问题是在“end”事件上完成第一个请求后,htmlData中不包含任何异步脚本,因此我无法真正找到那些asyn脚本标记,这就是我的问题
"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))