1.爬虫的介绍
javascript
图1-1 爬虫(spider)php
网络爬虫(web spider)是一个自动的经过网络抓取互联网 上的网页的程序,在当今互联网 中获得愈来愈普遍的使用。这种技术通常用来爬取网页中连接,资源等,固然,更为高级的技术是把网页中的相关数据保存下来,成为搜索引擎 ,例如著名的google和百度 。常见的爬虫应用还有像一淘这样的比价网站,电影推荐网站等。
css
为了让你们进一步感觉到爬虫的魅力,笔者编写了一个爬取淘宝 和京东数据的比价网站(http://jiafei.org:8888/),如图1-2所示。因为淘宝 和京东的搜索结果页面中有部份内容引(如价格)是经过ajax动态得到的,再用javascript把内容写入到相应的标签中的,当搜索iphone 5s时,后台爬虫利用webkit生成去最终的dom树,爬取有用的数据,通过简单的处理后返回相应的结果。
html
图1-2 一个简单的比较网站java
2.为什么须要爬虫
web
爬虫对于扫描器来讲相当重要,站在整个扫描器的最前线(如图2-1所示)。在一个专业扫描器中,通常首先会由爬虫爬取指定的页面,接着把爬到的url传递 给调度server,最后由调度server分发须要扫描的url给扫描agent来完成整个扫描过程。ajax
图2-1 扫描器的组成算法
2.爬虫的架构与分析chrome
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+"