如何扫描数千个网站并分析每个网站的JavaScript对网页的DOM所做的更改

时间:2014-09-25 18:43:41

标签: javascript dom

我的任务是:

给定一个URL,解析其html页面(简单),提取所有javascripts(简单),并分析每个javascript正在做什么/每个javascript如何更改DOM。

我尝试过: 各种JavaScript引擎 - 不会帮助,不了解DOM phantomjs / casperjs - page.evaluateJavaScript API看起来很有前途,但无法让它工作,无处可寻找任何文档/示例

任何建议都非常感谢。谢谢。

2 个答案:

答案 0 :(得分:2)

您似乎在寻找MutationObserver。这种方法允许您注册您的代码将被告知有关DOM的更改。

您似乎需要在每个要知道的元素上设置MutationObserver,如果它发生变化。为此,您需要遍历DOM,将MutationObservers添加到元素中。

通常,您应该避免在大多数生产代码中使用MutationObservers,因为它们会显着影响性能。但是,听起来你想要专门研究一些代码的操作,而不是在常规使用中使用它。为此,它们应该没问题。

示例代码:

// select the target node
var target = document.querySelector('#some-id');

// create an observer instance
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    console.log(mutation.type);
  });    
});

// configuration of the observer:
var config = { attributes: true, childList: true, characterData: true };

// pass in the target node, as well as the observer options
observer.observe(target, config);

// later, you can stop observing
observer.disconnect();

附加阅读和上述代码列表取自MutationObserver page on MDN。该页面将示例代码的来源列为this blog post

编辑2:

对于您所描述的如此庞大的任务("可编程扫描数千个网站"),您可能更容易下载Firefox的源代码并修改该代码以记录更改每个页面的JavaScript都会生成页面的DOM。这可以非常合理地记录哪个代码段,哪个函数,甚至源代码中的哪个行号都在进行更改。

您希望"可编程扫描数千个网站"。这不是一个小项目,需要大量的自动化工具。存在用于自动化浏览器操作的工具(例如Selenium)。浏览器已经所有解释JavaScript代码并对DOM进行更改,同时知道正好代码的哪一行/函数正在进行更改。对公开可用的源代码进行最小的更改,只是转发到控制台发生更改,更改的行/功能等等是 easy 解决方案。浏览器已将函数/行转储到控制台以获取JavaScript异常。所有这些都需要对源代码进行微小的更改,以调用将JavaScript函数和行号转储到控制台的现有函数。控制台可以是redirected to store output in a file

答案 1 :(得分:0)

在我的脑海中,有几种方法可以查看一段JavaScript代码并找出正在更改的元素。

// Single Element
    var elementById = document.getElementById("elementID"); // Reference by ID
    var elementByClass = document.getElementByClass("elementClass"); // Reference by Class
    var elementByTag = document.getElementByTagName("elementTag"); // Reference by Tag Name

// Multipe Element
    var elementsByClass = document.getElementsByClassName("elementsClass"); // Reference by Class
    var elementsByTag = document.getElementsByTagName("elementsTag"); // Reference by Tag

如果您需要进一步的帮助,请更直接地提出您的问题。