【发布时间】:2014-02-06 18:54:03
【问题描述】:
在经典 HTML 中很容易
$('a').map(function(){return this.href}).toArray()
但是,如果导航是通过 JavaScript 完成的,例如:
<a href='#' onclick='someFn()'>Some link</a>
如果不执行 someFn 函数,就不可能知道 url,如果你执行它 - 它不会返回 url,而是导航页面(我无法控制 someFn 函数并且不知道里面有什么或如何改变它)。
因此,为了从页面中获取所有 N 个链接,您必须加载所有这些 N 个页面。这是非常缓慢且低效的。
如何解决?
可能的解决方案 - 如果可以拦截对 window.location 的调用 - 问题已解决。您只需单击所有这些链接并检查window.location 的值,而无需加载新页面。但我不知道这是否可以做到(我使用 phantomjs 似乎无法做到)。
注意
HTML 中没有 URL,即使在 JavaScript 执行之后也是如此。是的,在某些情况下,您可以使用浏览器模拟器来执行 JS,然后解析在浏览器中动态生成的 HTML。但事实并非如此,我使用浏览器模拟器(phantomjs),但即使在 JS 执行之后,HTML 中也没有 URL 和导航,所有导航都在纯 JS 中完成,使用
<a onclick=tonsOfWeirdBlackBoxFunctionsYouCantChange>
【问题讨论】:
-
你想用那个存档什么?也许还有另一种方法可以做到这一点。例如,您可以只解析链接的整个代码,无论它们出现在什么上下文中。
-
基本上,我需要访问网站的一些页面,我无法访问所有页面,因为它们太多了。我可以通过 URL 检测它是否是我需要访问的页面。我需要获取要分析的 URL 列表并选择要访问的 URL(无需全部加载)。
-
所以只解析源代码寻找任何看起来像 URL 的东西没有错,对吧?忽略上下文。这仍然不会为您提供动态创建的 URL,但是,如果不执行 javascript,这是不可能的。
-
不,URL 不是动态创建的,即使在执行 JS 之后,HTML 中也没有 URL,所有导航都在 JavaScript 中完成,在那些黑框
someFn函数中。如果不对每个链接执行 URL,就不可能知道 URL。
标签: javascript web-scraping web-crawler phantomjs