javascript - http GET 从浏览器的 DOM 元素上返回完全不同的 HTML 元素和 innerHTML

标签 javascript node.js dom web-scraping element

目标:
将整个 HTML 页面(此特定 url) 导出到“newFileOnLocalDisk.txt”以供离线数据研究。

遇到的问题:
能够将此特定 URL 的 HTML 导出到“newFileOnLocalDisk.txt” ...但是...导出的 HTML 元素和值与浏览器 DOM 上的内容不匹配。

const http = require('http');
const url = 'http://www.bursamalaysia.com/market/securities/equities/prices/#/?filter=BS02&page=3';

const httpGet = url => {
    return new Promise((resolve, reject) => {
      http.get(url, res => {
        res.setEncoding('utf8');
        let body = ''; 
        res.on('data', chunk => body += chunk);
        res.on('end', () => resolve(body));
      }).on('error', reject);
    });
};

async function exportToLocalHTMLfile () {
    const body = await httpGet(url);
        /*********************************************************
        * What's returned to console.log is totally different
        * from what is in browser's DOM Elements / inspect element
        * 
        * Question #1:
        * How can we export "as-is or in raw HTML" directly from  
        * less-friendly pages like this?
        * 
        *********************************************************/
        console.log(body); //<-- will be later exported to TEXT file. Codes removed to keep this article leaner.
    }

    exportToLocalHTMLfile();

console.log(body) 返回以下摘录。这与浏览器的 DOM 元素完全不同

<html><head>
<meta http-equiv="Pragma" content="no-cache"/>
<meta http-equiv="Expires" content="-1"/>
<meta http-equiv="CacheControl" content="no-cache"/>
<noscript>Please enable JavaScript to view the page content.</noscript>

<APM_DO_NOT_TOUCH>
<script language="javascript">
//<![CDATA[

(function(){
    var securemsg;
    var packmsg;
    var CryptoUtils;

try{(function(){try{var _S,IS,lS=1,LS=1,ZS=1,__=1,i_=1,I_=1,j_=1;for(var J_=0;J_<IS;++J_)lS+=2,LS+=2,ZS+=2,__+=2,i_+=2,I_+=2,j_+=3;_S=lS+LS+ZS+__+i_+I_+j_;window.JS===_S&&(window.JS=++_S)}catch(l_){window.JS=_S}var L_=window.sdkljshr489=!0;function o_(S){window.sdkljshr489&&S&&(L_=!1);return L_}function O_(){}o_(window[O_.name]===O_);o_("undefined"===window.vodsS0);window.vodsS0=null;o_(/\x3c/.test(function(){return"\x3c"})&/x3d/.test(function(){return"0";"x3d"}));
var Z_=window.attachEvent||/mobi/i.test(navigator.userAgent),_ .... (end of excerpt)

请注意,“newFileOnLocalDisk.txt”中不可读的内容长度为 61,055 个字符。它们都不像 id="bm_price_container"

中的任何数据

如果有比 const http = require('http'); 更好的方法或策略来完成此任务,请指出方法?提前感谢您在闪耀光芒方面付出的时间和努力。

最佳答案

您需要一个 Node.js 模块来在 headless 浏览器中加载页面,以执行页面中的所有 JavaScript 代码并动态更新 DOM。例如,您可以尝试 GoogleChrome/puppeteer .

'use strict';

const puppeteer = require('puppeteer');

(async function main() {
  try {
    const browser = await puppeteer.launch();
    const [page] = await browser.pages();

    await page.goto(
      'http://www.bursamalaysia.com/market/securities/equities/prices/#/?filter=BS02&page=3',
      { waitUntil: 'networkidle0' },
    );
    await page.waitFor(5000);

    const html = await page.content();
    console.log(html);

    await browser.close();
  } catch (err) {
    console.error(err);
  }
})();

关于javascript - http GET 从浏览器的 DOM 元素上返回完全不同的 HTML 元素和 innerHTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54919094/

相关文章:

node.js - 让 RethinkDB 运行数据更改请求

node.js - 在 Node JS TLS 中将密码从 SSLv3 (DHE-RSA-AES256-SHA) 添加/启用到 TLS 1.2

javascript - ng-model 不适用于 AngularJS 中的单选按钮

类中的 Javascript 数组属性仅在从函数调用时返回

php - 如何使用CKEditor作为表单输入?

c++ - 在 C++ 中将 MSHTML 用于 GUI,是否有教程?

javascript - nodeIndex 是 IE 中有效的 DOM 元素属性吗?

javascript - 如何限制 jQuery 中的 DOM 操作 - 追加元素

javascript - 使用 webgl 在鼠标移动上创建一个连续动画回到原始状态的涂抹/液化效果

javascript - 检测何时在另一个组件中调用函数。