安全开发者的小黄鸭,会不定期的分享我在苦逼开发过程中遇到的一些问题、解决方案,以及新的姿势技巧,大多数推送的文章会比较短。
如果你在安全开发方面有什么问题,也可以直接回复公众号,我会抽时间解答~
一句话总结:触发事件一定要有时间间隔!
先来看抓取的页面源码:
两个标签点击后会分别跳转到 /test4.php 和 /test5.php(抓取时页面已锁定,实际不会跳转,但可以监控到跳转的目标URL),但**爬虫并未抓取到 http://localhost/test4.php**。
检查下phantomjs模块的具体调用日志:
可以看到 id=test4 节点对应的事件确实被触发了,而且还把锚点的变化都记录下来了。但就是没抓到 /test4.php 跳转的请求。
原本以为是因为锚点的问题,锚点阻止了后续的事件执行(一个不负责任的脑洞)。但经过一番调试,发现是触发事件的时候出问题了。
window.location.href 重复执行的时候,浏览器只会执行后面的一个,比如这段代码,可以粘贴到 Console 执行下,页面会跳转到 /456。
那应该如何解决?
重启电脑,然后重装系统
骗你的。触发事件的时候,要留一个短短的间隔。(浏览器: 你太快了
由于 Javascript 的异步非阻塞的特性,还加了个闭包来实现 sleep。
如果不想这么做的话,也可以通过 Hook location对象来解决。
虽然 location对象 在最近版本的 chrome 里已经不能 Hook 了,但像 phantomjs/qtwebkit 之类的以 webkit 为核心的解析器并不会及时的去更新,实测可行。但从可持续发展的角度来看,更推荐第一种方法。
因为是浏览器的特性导致的漏抓,所以这个问题不仅会出现在 PhantomJS 中,用其他解析器也是一样的。但解决方案都是通用,大佬们可以检查下自己的爬虫了。
实际上,@世琪 老司机很早就跟我说过这个问题了,但是因为一直没遇到badcase,所以一直处于搁置的状态,搁置的久了,就忘了....今天红老师把badcase丢给我,还捣腾了半天才发现问题...
想了解更多 Hook 和 触发事件 相关的,可以点击 阅读原文,查看我之前在安全客上发表的文章《浅谈动态爬虫与去重》。