我正在使用PhantomJS作为爬虫;如果页面中没有JS,我可以假设它在onLoadFinished
触发时已完全加载,但如果页面中有JS,我需要稍等一下,让脚本有机会完成任务。这是我目前正在检测JS:
var pageHasJS = page.evaluate(function () {
return (document.getElementsByTagName("script").length > 0 ||
document.evaluate("count(//@*[starts-with(name(), 'on')])",
document, null, XPathResult.NUMBER_TYPE,
null).numberValue > 0);
})
这会查找<script>
代码和onsomething
属性的元素。
Q1:还有其他HTML构造可以将JS隐藏到页面中吗? javascript:
网址不计算在内,因为任何内容都不会被点击
Q2:有没有更好的方法进行第二次测试?我相信使用querySelector
无法做到这一点,因此诉诸XPath,但也许还有一些其他功能可以完成同样的任务。
问题3:加载后,爬网程序不与页面交互。 {1}}事件是我知道的唯一遗留事件属性,在没有用户交互的情况下触发。还有其他人吗?换句话说,用onload
或甚至document.evaluate("count(//@onload)", ...)
替换第二个测试是否安全?
答案 0 :(得分:1)
您可以拦截实际的HTTP请求(查看onResourceRequested / onResourceReceived),并在加载所有资源后截取屏幕截图,而不是检查脚本标记并提供固定的时间。看看ajax-render