查找并打印网页大小(以字节为单位)和所有<a> tags

时间:2018-06-14 06:14:49

标签: javascript html node.js dom jsdom

I'm working on a CLI tool that takes URL arguments as input. I'm using jsdom package的计数,以在node.js中创建伪DOM,以解决问题。我正在使用以下vanilla-js脚本:

console.log('Page Size (in bytes): ', (document.getElementsByTagName('HTML')[0].outerHTML.length) / 1024);
console.log('Count of <a> tags: ', document.getElementsByTagName('a').length);
<a href="">
<a href="">
<a href="">
<a href="">
<a href="">

如下所示在我的node.js环境中:

'use strict';

const jsdom = require("jsdom");
const { JSDOM } = jsdom;

// run loop for first argument till last
process.argv.slice(2, process.argv.length).forEach(function () {

// getting the url as argument
var pgurl = "" + process.argv[2];
console.log('For ', pgurl);

const document = (new JSDOM(``, {
    url: pgurl,
    pretendToBeVisual: true
})).window.document;

console.log('Page Size (in bytes): ', (document.getElementsByTagName('HTML')[0].outerHTML.length) / 1024);
console.log('Count of <a> tags: ', document.getElementsByTagName('a').length);

});

现在,由于最初的浏览器内解决方案对我有用,我尝试在node.js上实现,并且作为参数传递的https://facebook.com,它显示以下输出:

For  https://facebook.com
Page Size (in bytes):  0.0380859375
Count of <a> tags:  0

在所有输入中保持相同,无论内容如何。

有没有其他解决方案基本上我想要的是在我传递我的URL时在node.js中实现浏览器DOM是要处理的输入参数,如上面的代码片段所示。

1 个答案:

答案 0 :(得分:1)

你有很多问题在继续。

最简单的是你正在计算一个&#34;页面大小(以字节为单位)&#34; (强调添加)但将字符串长度除以1024,这是你计算千字节数所做的。请注意,字符串长度仅在有限数量的情况下等于字节长度。

更大的问题是你没有定义你的意思&#34;页面大小&#34;。例如,人们经常谈论&#34;页面大小&#34;作为服务器发送到浏览器的初始有效负载的大小。使用outerHTML对此不可靠,因为有效负载可能已被压缩。如果您想要的是为浏览器提供的HTML 的大小outerHTML仍然不可靠,因为它会向您显示已清理 > HTML而不是浏览器收到的原始HTML

另一个问题是像Facebook这样的网站使用JavaScript构建他们的页面,因此JavaScript代码必须首先运行。默认情况下,JSDOM不执行JavaScript。原因是JSDOM无法保证在JSDOM处理的页面上执行的JavaScript无法执行恶意操作。请参阅this explanation

另一个问题是,当使用JavaScript构建页面时,没有通用信号可以用来知道页面已经完成了#34;正在建设。您需要确定哪些事件与您相关。例如我认为在&#34;登录&#34;按钮显示。你必须等待那个事件。我使用了“&#34; event&#34;松散地来到这里。可能存在与您想要或不符合的实际DOM事件。 (请注意,但是DOM load事件不会等待JavaScript代码执行其工作。它会在页面的HTML处理完毕后立即发出,之前 任何可能进一步修改页面的异步JavaScript。)