作者:Fr1day@0keeTeam

0x00 前言

在 浅谈动态爬虫与去重 中,分享了动态爬虫中触发事件、监控节点变动、URL去重等的实现方法。在接近一年的线上运行与迭代更新过程中,处理了很多bug,也遇到一些有趣的漏抓案例。

本文将详细分析几个有代表性的案例,希望能对各位的coding大业有所帮助。

0x01 一个都不能少

上图为被抓取页面的源码。两个  标签点击后会分别跳转到 /test4.php 和 /test5.php(抓取时页面已锁定,实际不会跳转,但可以监控到跳转的目标URL)。

但爬虫并未抓取到 http://localhost/test4.php。检查下phantomjs模块的具体调用日志:

可以看到 id=test4 节点对应的事件确实被触发了,而且还把锚点的变化都记录下来了。但就是没抓到 /test4.php 跳转的请求。

原本以为是因为锚点的问题,锚点阻止了后续的事件执行(一个不负责任的脑洞)。但经过一番调试,发现是触发事件的时候出问题了。

window.location.href 重复执行的时候,浏览器只会执行后面的一个,比如这段代码,可以粘贴到 Console 执行下,页面会跳转到 /456。

解决方案如下图,由于 Javascript 的异步非阻塞的特性,还加了个闭包来实现 sleep。

如果不想这么做的话,也可以通过 Hook location对象来解决。

一句话总结:触发事件一定要有时间间隔!

0x02 猝不及防的关闭

function BtnPsw_onclick() {

window.open("../Login/UpdatePass")

}

用户名:

密码:

phantomjs解析的时候,超时严重导致漏抓。通过伟大的注释调试法,可以发现问题在这行代码里:

动态分析时会主动去执行行内绑定的代码,即:window.close()。关闭了页面之后,PhantomJS后续绑定的事件都会失效,比如page.evaluate、page.onCallback、phantom.exit。没有执行exit函数,一直阻塞导致触发python的超时——狗带。

修复方案,在执行关闭页面的时候,PhantomJS的onClosing事件可以收到通知,示例代码如下:

还可以通过Hook来解决这个问题:

0x03 永远触发不完的事件

动态分析超时导致没有结果返回。动态爬虫里触发行内绑定事件的代码如下:

逻辑是遍历所有的节点的所有属性,执行以on开头的属性值,即 οnclick=alert(1) 这种。

但是抓取上面案例的时候,发现一直没有返回结果,使用伟大的print调试法打印了触发的具体内容后,发现页面一直在不停的触发同一个事件。

仔细看下页面源码:

登录应该是用JSONP来实现的,每次点击登录都会生成一个script标签,而且这个标签恰好还插入在了登录标签前面。

遍历数组的过程中,也在不断扩展这个数组。这就是问题的关键。

那应该怎么解决呢?用了个不太优雅的方法来实现JS深拷贝:

0x04 Hook是个哲学问题

test

function show(){

window.showModalDialog("another_page.html");

}

如上为漏抓页面的部分代码。爬虫进程超时,没有返回任何数据。

window.showModalDialog 是早期浏览器使用比较频繁的函数,用来弹出一个新页面,并且是阻塞执行的(所以造成爬虫超时被强行杀进程)。后来被 window.open 函数替代。替换的原因有:

1. showModalDialog 没有导航栏,无法进行后退、前进、收藏等操作

2. showModalDialog debug非常复杂(只能用alert调试法 2333)

3. 名字又长又难记(迷之猜测)

下图为正常打开的页面与 showModalDialog 打开的页面比较:

目前Chrome最新版已经不支持这个函数了,但Firefox、Safari、IE仍然支持。毫无意外的 PhantomJS 也支持。解决方案很简单,直接 Hook 函数就可以了:

这样的话,加上最开始就被 Hook 的 alert/prompt/confirm,现在已经 Hook 了四个可能会引起阻塞的函数了,是不是还有其他隐藏的存在呢?

写个脚本来检查下:

var page = require('webpage').create();

page.onConsoleMessage = function(msg){

console.log('> ' + msg );

return true;

};

page.open("http://127.0.0.1:8082", "GET", "", function (status){

console.log(status);

page.evaluateAsync(function(){

for(var i in window){

try {

if (typeof eval("window." + i) != "function") {

continue

}

}catch (e){

}

// if(i in {"showModalDialog": "1"}){

// continue

// }

try{

console.log(i)

eval("(function(){" + i + "();})()");

}

catch (e){

// console.log(e)

}

}

}, 10)

});

用 PhantomJS 加载任意页面,然后遍历 window 对象。首先出现阻塞卡顿的函数是 showModalDialog,再次运行脚本,跳过 showModalDialog 函数,然后….

顺畅的运行完成,说好的 alert/prompt/confirm 函数导致的阻塞呢?

复制脚本到浏览器中运行,倒是成功复现了 alert/prompt/confirm/print 导致的阻塞:

分析原因,应该是PhantomJS在封装onAlert、onPrompt、onConfirm接口的时候就对这几个可能产生阻塞的函数做了处理。

同样的原理,可以套用在其他的动态解析器上。举个栗子,在Chrome Headless里需要 Hook 哪些接口,你现在知道了吗?

0x05 总结

虽然在 Chrome Headless 出来之后,PhantomJS 变得索然无味。但是同样都基于Webkit内核,所遇到的问题和解决方案也大多相通,不必拘泥于形式。

如果有动态分析和爬虫方面的问题/想法,欢迎微博私信我 @吃瓜群众-Fr1day

注:水印图片来自于“安全小黄鸭”,是我个人公众号,不涉及版权问题。

php 爬虫去重,浅谈动态爬虫与去重(续)相关推荐

  1. python 模拟浏览器selenium_浅谈python爬虫使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...

  2. 浅谈网络爬虫中广度优先算法和代码实现

    前几天给大家分享了网络爬虫中深度优先算法的介绍及其代码实现过程,没来得及上车的小伙伴们可以戳这篇文章--浅谈网络爬虫中深度优先算法和简单代码实现.今天小编给大家分享网络爬虫中广度优先算法的介绍及其代码 ...

  3. 如何用python抓取文献_浅谈Python爬虫技术的网页数据抓取与分析

    浅谈 Python 爬虫技术的网页数据抓取与分析 吴永聪 [期刊名称] <计算机时代> [年 ( 卷 ), 期] 2019(000)008 [摘要] 近年来 , 随着互联网的发展 , 如何 ...

  4. 浅谈Python爬虫(五)【网易云热评爬取实例】

    浅谈Python爬虫(五) 目的:爬取网易云歌单所有歌曲的信息及热评 Python环境:3.7 编译器:PyCharm2019.1.3专业版 存储格式:JSON 1.分析网页 进入网易云音乐首页,点击 ...

  5. 动态磅是怎么原理_浅谈动态地磅的原理及未来发展方向

    浅谈动态地磅的原理及未来发展方向: 文章介绍了动态地磅的结构和工作原理,针对动态地磅的分类做了全面的概述,分别对不同的动态地磅做了对比及详细的阐述,说明选择和使用动态地磅器的注意事项,凸显了轴组式动态 ...

  6. 子沐教你Scrapy——浅谈Python爬虫

    本章工作任务 任务1:为什么学习Python爬虫 任务2:什么是爬虫 任务3:urllib的应用 任务4:cookie实际使用 任务5:正则表达式 本章技能目标及重难点 编号 技能点描述 级别 1 为 ...

  7. python爬虫实例教程-python动态爬虫的实例分享

    本文主要和大家分享python动态爬虫的实例分享,用Python实现常规的静态网页抓取时,往往是用urllib2来获取整个HTML页面,然后从HTML文件中逐字查找对应的关键字.如下所示:#encod ...

  8. Django用来作为爬虫框架浅谈

    首先该框架采用了分布式路由管理机制,其次自带数据库管理后台十分强大 那么分布式路由管理机制 可以实现高并发的爬虫 同时也可以远程监控爬虫的运行情况 只要你的电脑上有浏览器 还可以查看数据库且摆脱l传统 ...

  9. crawler_浅谈网络爬虫

    题记: 1024,今天是个程序猿的节日 ,哈哈,转为正题,从事了一线网络爬虫开发有近1000天.简单阐述下个人对网络爬虫的理解. 提纲: 1:是什么 2:能做什么 3:怎么做 4:综述 1:是什么 w ...

最新文章

  1. myeclipse10安装了activiti插件后创建BPMN 文件时报错,
  2. Java判断语句 循环语句
  3. 信息安全系统设计基础第九周学习总结
  4. 通过×××路由器实现跨网段访问
  5. 毕业论文 | 基于单片机的多功能智能小车设计论文(电路+程序+论文)
  6. lseek函数的使用
  7. VS Code的golang开发配置 之 代码提示
  8. (20)Xilinx FPGA型号(FPGA不积跬步101)
  9. MySQL的FROM_UNIXTIME()和UNIX_TIMESTAMP()函数的区别
  10. Spring Boot 多环境配置(properties和yaml方法的比较)
  11. Unity延迟和重复调用方法
  12. 亲密关系沟通-【唤起亲密】-在平淡关系中创造高质量沟通
  13. python零基础能学吗-零基础小白多久能学会python
  14. log4j中将SocketAppender将日志内容发送到远程服务器
  15. 正式开始学习GO语言
  16. jQuery(非插件)制作商城放大镜效果
  17. django模板-if标签、for标签、自定义标签和过滤器
  18. 服务器安装动易组件,动易SiteWeaver6.8安装方法
  19. 交换机端口vlan模式
  20. 如何实现Iframe透明

热门文章

  1. 别再用ls、cat命令了,这有一套全新升级版,简洁快速还易上手
  2. 提升 NLP 实战技能的一点建议
  3. YOLO算法史上最全综述:从YOLOv1到YOLOv5
  4. 强强联合!Papers with Code 携手 arXiv,上传论文、提交代码一步到位
  5. 计算机视觉领域如何从别人的论文里获取自己的idea?
  6. Linux之远程登录、远程拷贝命令 ssh scp
  7. Mongodb的的增删改查
  8. VUE的本地应用-V-TEXT
  9. 网络工程师_TCP握手之类的
  10. 【深度学习】正则化技术全面了解