SuperSpider——打造功能强大的爬虫利器
SuperSpider——打造功能强大的爬虫利器
1.爬虫的介绍

图1-1 爬虫(spider)
网络爬虫(web spider)是一个自动的通过网络抓取互联网 上的网页的程序,在当今互联网 中得到越来越广泛的使用。这种技术一般用来爬取网页中链接,资源等,当然,更为高级的技术是把网页中的相关数据保存下来,成为搜索引擎 ,例如著名的google和百度 。常见的爬虫应用还有像一淘这样的比价网站,电影推荐网站等。
为了让大家进一步感受到爬虫的魅力,笔者编写了一个爬取淘宝 和京东数据的比价网站(http://jiafei.org:8888/),如图1-2所示。由于淘宝 和京东的搜索结果页面中有部分内容引(如价格)是通过ajax动态获得的,再用javascript把内容写入到相应的标签中的,当搜索iphone 5s时,后台爬虫利用webkit生成去最终的dom树,爬取有用的数据,经过简单的处理后返回相应的结果。

图1-2 一个简单的比较网站
2.为何需要爬虫
爬虫对于扫描器来说至关重要,站在整个扫描器的最前线(如图2-1所示)。在一个专业扫描器中,一般首先会由爬虫爬取指定的页面,接着把爬到的url传递 给调度server,最后由调度server分发需要扫描的url给扫描agent来完成整个扫描过程。

图2-1 扫描器的组成
2.爬虫的架构与分析
web安全对于互联网 公司来说至关重要,为了
此文来自: 马开东博客 转载请注明出处 网址:http://www.makaidong.com
让 公司的扫描器与业界的扫描器看齐,server安全组自研了一款功能强大的爬虫——superspider,主要用来为漏洞扫描提供丰富的urls。 superspider的架构如图3-1所示,首先由下载器模块下载指定的页面,分析页面模块分析完成后一方面把需要的数据传递给存储模块,另一方面将爬 取的urls传递给去重模块,去重后放到url队列中,最后由调度器安排次序传递url给下载器下载新的页面。接下来详细讲讲分析页面,调度器和去重这3 个模块。

图3-1 爬虫的架构
3.1分析页面
简单的来说, 爬虫主要作用就是用来分析页面。
难点:因为现在是web2.0时代,绝大部分网页都会使用javascript处理页面,而且很多网页内容都是通过ajax技术加载的。因此,只是简单地解析html文件会远远不够。
解决:如何做到这点?编写一个基于webkit的爬虫superspider。下面将详细说明superspider所具有的5个功能强大的爬取能力。
a. 静态页面链接分析
简单点来说,就是分析html文档,例如下图的一个<a>标签的超链接,superspider会识别出href中的值为一个超链接,提取其值html_link.php?id=1。

b. javascript动态解析
下图为一段javascript代码,该代码的目的是在id为hi的a标签中提交属性href。

superspider利用webkit内核执行以上javascript代码生成出以下html代码,再通过静态页面链接分析获取js _link.php?id=1&msg=abc这个url。

c. 自动分析表单
superspider会自动识别出action中的值为所提交的地址,提取input标签中的name和value作为参数,最终生成出 post_link.php?id=1&msg=abc 这个url。

d. 自动交互
自动交换就是说要模仿出人的行为,
此文来自: 马开东博客 转载请注明出处 网址:http://www.makaidong.com
例如点击鼠标,按下回车键等,下图就是一个需要点击鼠标的例子。

superspider会自动识别出onclick是一个交换行为,从而执行里面的js 代码生成出以下html,从而爬到了 click_link.php?id=1 这个url。

e. hook所有的网络请求
这是一个ajax请求,有别于以上4种基于dom树解析的分析技术,要捉到其请求的url只能通过hook请求,而webkit文档中并没有提到hook 网络请求的方法。于是通过修改webkit代码hook住每一个由webkit发送出去的请求,从而拿到了 ajax_link.php?id=1&t=1这个url。

3.2调度器
superspider的调度器使用广度优先搜索策 略,具体的逻辑如下图所示。首先,从入口页面1.html中爬到了2.html, 3.html和4.html,依次把它们放到url队列中。接着取出2.html,把爬到的5.html和6.html放到url队列中,随后便开始爬取 3.html,依广度次序进行。

图3-2-1 爬虫调度的广度优先搜索策略
3.3去重
为了扫描的质量和效率,需要进行去重。例如大部分网站中日期作为其url的组成部分,尤其是门户网站。superspider使用将数字替换成d+的算法对url进行去重。例如,
1.http://video.sina.com.cn/ent/s/h/2010-01-10/163961994.shtml?a=1&b=10
2.http://video.sina.com.cn/ent/s/h/2009-12-10/16334456.shtml?a=12&b=67
对数字进行模式处理为:
http://video.sina.com.cn/ent/s/h/d+-d+-d+/d+.shtml?a=d+&b=d+
如果链接1已经爬取过,链接2与链接1类似, 不重复爬取。
试验证明这种方法简捷高效,漏爬率极低,大大提升扫描器的效率。
4.爬虫的具体实现
a.webkit的易用性
常用的chrome, safari等浏览器都是基于webkit内核,不过提起这个内核,大家可能会觉得有点庞大艰深。但如果只是对于应用层面来说,webkit使用起来还是 挺简易的。如图4-1所示,只需14行便可以写出一个浏览器。

图4-1 使用webkit编写的浏览器
b.难点解决
问题:webkit需要视窗系统才能正常启动,而服务器一般都没有视窗系统的,那么如何在后台稳定地运行webkit?之前是去掉webkit中的图形渲染,css等与gui有关的代码,太麻烦,易出众多bug。
解决:使用xvfb虚拟出一个视窗系统,只需把alert, confirm, prompt的代码注释掉(因为会让浏览器卡住),简单快捷稳定。
c.爬虫的逻辑代码
图4-2为爬虫的逻辑代码,在parse函数里利用webkit生成出来的dom树来做具体的第三部分所提到的分析逻辑。
图4-2 爬虫的逻辑代码
5.效果
superspider与wvs的爬虫对比,在著名的爬虫测试 平台http://demo.aisec.cn/demo/进行测试,该平台要求爬虫要完全具备3.1所提到的5个功能才能爬取到所有的url,上图为扫 描器的爬虫,下图为wvs的爬虫, 其中click_link.php (在3.1.d提到)是需要爬虫具有自动交换能力才能爬取到的。
结论:superspider全部都能爬到, 在自动交互方面比wvs表现更好
var url = window.location.href;document.write("此文链接:"+url+"
");document.write("转载请注明出处:"+document.title+"");
SuperSpider——打造功能强大的爬虫利器的更多相关文章
- Python 爬虫利器 Selenium 介绍
Python 爬虫利器 Selenium 介绍 转 https://mp.weixin.qq.com/s/YJGjZkUejEos_yJ1ukp5kw 前面几节,我们学习了用 requests 构造页 ...
- Python爬虫利器二之Beautiful Soup的用法
上一节我们介绍了正则表达式,它的内容其实还是蛮多的,如果一个正则匹配稍有差池,那可能程序就处在永久的循环之中,而且有的小伙伴们也对写正则表达式的写法用得不熟练,没关系,我们还有一个更强大的工具,叫Be ...
- 免费的在线Web文件管理器:Net2FTP,Pydio,eXtplorer,KodExplorer–功能强大
https://www.freehao123.com/web-ftp/ 经常有朋友在使用一些没有带文件管理器的空间时,苦于没有办法来解压上传的文件压缩包,而如果不先上传压缩包,直接上传文件夹的话耗费的 ...
- python爬虫利器Selenium使用详解
简介: 用pyhon爬取动态页面时普通的urllib2无法实现,例如下面的京东首页,随着滚动条的下拉会加载新的内容,而urllib2就无法抓取这些内容,此时就需要今天的主角selenium. Sele ...
- (转)Python爬虫利器一之Requests库的用法
官方文档 以下内容大多来自于官方文档,本文进行了一些修改和总结.要了解更多可以参考 官方文档 安装 利用 pip 安装 $ pip install requests 或者利用 easy_install ...
- web前端自动化测试/爬虫利器puppeteer介绍
web前端自动化测试/爬虫利器puppeteer介绍 Intro Chrome59(linux.macos). Chrome60(windows)之后,Chrome自带headless(无界面)模式很 ...
- 打造一个上传图片到图床利器的插件(Mac版 开源)
写markdown博客如何将截图快速上传到图床--记一个工具插件的实现(windows版 开源)(2017-05-31 20:23) 打造一个上传图片到图床利器的插件 鉴于写博客截图手动上传到图床的步 ...
- python并发爬虫利器tomorrow(一)
tomorrow是我最近在用的一个爬虫利器,该模块属于第三方的一个模块,使用起来非常的方便,只需要用其中的threads方法作为装饰器去修饰一个普通的函数,既可以达到并发的效果,本篇将用实例来展示to ...
- Python爬虫利器六之PyQuery的用法
前言 你是否觉得 XPath 的用法多少有点晦涩难记呢? 你是否觉得 BeautifulSoup 的语法多少有些悭吝难懂呢? 你是否甚至还在苦苦研究正则表达式却因为少些了一个点而抓狂呢? 你是否已经有 ...
随机推荐
- WPF - Build Error总结
1. are you missing an assembly reference 给项目添加新控件的时候,经常发现这种错误 Error 21 The type or namespace name 'C ...
- pyqt例子下拉列表
#!/usr/bin/env python # -*- coding: utf-8 -*- from PyQt4.QtCore import Qt from PyQt4.QtGui import QC ...
- (转载)图片左右滚动控件(带倒影)——重写Gallery
今天在网上找了些资料,做了一个图片左右滚动的Demo,类似幻灯片播放,同时,图片带倒影效果,运行效果如下图: 实现方式是重写Gallery,使用自定义的Gallery来实现这一效果,工程一共三个文件, ...
- HTML5新增的一些属性和功能之六——拖拽事件
拖放事件的前提是分为源对象和目标对象,你鼠标拖着的是源对象,你要放置的位置是目标对象,区分这两个对象是因为HTML5的拖放事件对两者是不同的. 被拖动的源对象可以触发的事件: 1).ondragsta ...
- DirectX Sample-Blobs实现原理
这个例子的实现主要包括两步: 1.计算三维采样坐标和color,实现代码是for( i = 0; i < NUM_Blobs; ++i )那个循环,计算完成以后g_pTexGBuffer[0]保 ...
- HDU 4907 Task schedule
对于询问q 假设q不存在直接输出q 否则输出后面第一个不存在的数 从2*10^5到1遍历一边ac #include<bits/stdc++.h> using namespace std; ...
- 20个经典bootsrtap后台html站点模板推荐
今天为大家推荐20款不同风格的Bootstrap后台管理模板,每一款都经典可用,能预览和下载,保证让你挑得眼花缭乱. 1,Simpli flag蓝色 Simpli Flat蓝色管理模板是一款採用Fla ...
- java 图片 批量 压缩 +所有压缩
/* oldsrc : 原图片地址目录 如 'd:/' newsrc : 压缩后图片地址目录 如 'e:/' widthdist,heightdist : 压缩后的宽和高 ...
- 《javascript设计模式》读书笔记四(单例模式)
1.单利模式简单介绍 在<设计模式>中单利模式是一种比較简单的模式,定义例如以下: 确保某一个类仅仅有一个实例,并且自行实例化并向整个系统提供这个实例. 在javascript中则将代码组 ...
- C#控制台吹泡泡算法
代码如下: static void Main(string[] args) { Bubbling(100, 100, "O", 1000); Console.ReadLine(); ...