查找和打印网页大小(以字节为单位)和所有标记的计数<a>



我正在开发一个将URL参数作为输入的CLI工具。我正在使用jsdom包在节点内创建一个伪DOM.js以解决问题。我正在使用以下香草-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="">

在我的节点.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);

}(;

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

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

无论内容如何,它在所有输入中都保持不变。

还有其他解决方案吗,因为基本上我想要的是在节点内实现浏览器 DOM.js而我传递我的 URL 是要处理的输入参数,如上面的代码片段所示。

您遇到了多个问题。

最琐碎的是,您正在计算"页面大小(以字节为单位("(强调添加(,但将字符串长度除以 1024,这就是您计算千字节的方法。请注意,字符串长度仅在有限的情况下等于字节长度。

一个更大的问题是你没有定义"页面大小"的含义。例如,人们经常将"页面大小"称为服务器发送到浏览器的初始有效负载的大小。为此使用outerHTML并不可靠,因为有效载荷可能已被压缩。如果您想要的是提供给浏览器以制作页面的HTML 的大小,outerHTML仍然不可靠,因为它向您显示清理后的HTML,而不是浏览器收到的原始 HTML

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

另一个问题是,当一个页面是使用 JavaScript 构建的时,没有通用的信号可以用来知道页面正在构建"完成"。您需要决定与您相关的事件。例如,我认为显示"登录"按钮时构建的页面。您必须等待该事件。我在这里松散地使用术语"事件"。可能有一个实际的 DOM 事件对应于您想要或不对应的内容。 (请注意,DOMload事件不会等待 JavaScript 代码完成其工作。一旦页面的 HTML 被处理,并且在任何可能进一步修改页面的异步 JavaScript之前,它就会发出。

最新更新