Ourren

关注技术,记录生活.

跟我一起学Ajax爬虫原理(系列1)

| 留言

转载请注明:文章出自http://blog.ourren.com by ourren

目录 1、引言 2、研究现状 3、论文实例讲解 4、总结 参考文献

1、引言 随着WEB2.0流行开源,DIV+CSS已经成为网站开发的标配,而Ajax则是在这个中间起着连贯不同页面的粘合剂。这给爬虫开发人员来带来了较大的压力,不管是搜索引擎开发人员,还是我们这些安全屌丝,如何最全面地爬取网站链接和参数已经成为如何优于其他同类产品的优势,比如最近崛起的AISEC扫描器[1],其主打首款支持AJAX爬虫检测的特点更是在其他安全产品中脱颖而出,受到安全人员的好评,那么AJAX爬虫究竟是如何工作的呢,作者带着这个疑问对相关技术进行了理解,现分享如下。PS,如何你还不知道什么是Ajax、DOM的话,最好Google下(多搜索对你有好处~)。 2、研究现状 AJAX,也就是Asychronous Javascript and XML,由于采用了Javascript驱动的异步请求/响应机制,以往的爬虫们缺乏Javascript语义上的理解,基本上是无法模拟触发Javascript的异步调用并解析返回的异步回调逻辑和内容。另外AJAX的应用中,Javascript会对DOM结构进行大量地变动,甚至页面所有的内容都是通过Javascript直接从服务器端读取并动态绘制出来,这个对于“习惯了”DOM结构相对不变的静态页面,简直是无法理解的.由此可以看出,以往的爬虫是基于协议驱动的,而对于AJAX这样的技术,所需要的“爬虫”引擎必须是基于事件驱动的。要实现事件驱动。

学术界发表的相关论文有Crawling Ajax-driven Web 2.0 Applications[3],AJAX Crawl:Making AJAX Applications Searchable[4]等(下个系列再添加)其中第一篇文章中采用的是rbNarcissus(验证和分析Javascript代码,非执行)[5], Watir(一款基于ruby的自动化测试工具,通过代码操作浏览器)[6],提出了这类爬虫面临这下面三方面的问题:

  • Javascript分析与Ajax之间的交互
  • DOM事件的处理和解释分发
  • 动态DOM内容语义的创建

3、论文实例讲解 第一篇文章中的作者从三方面解决上面的问题:

  • 如何处理事件驱动的爬虫?

例如一个网站的源码是:

[code]<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”> Dynamic site

[/code]

很明显,如果基于协议的爬虫是无法爬取该网站的链接和内容的,页面的内容是通过Javascript来动态创建的,而这类创建一般都是通过XHR请求来创建的。

  • 如何分析Javascript代码?

我们需要工具来对网页中的Javascript进行分析,看是否调用了XHR,这里就可以用rbNarcissus来进行分析

[code]D:\crawl-ajax> jsparser.rb master.js —- XHR call mapping —- http.onreadystatechange getQuote[XHR found] getPrice loadmyarea[XHR found]

loadhtml[XHR found]

—- Function mapping —- http.onreadystatechange getQuote [+]http.onreadystatechange getPrice [+]getQuote loadmyarea [+]http.onreadystatechange loadhtml [+]http.onreadystatechange ————————–[/code]

处理结果发现有XHR调用,并得出了一些内部关联getQuote,loadmyarea和loadhtml,因此就需要浏览器去触发这类行为。

  • 利用IE和Watir进行测试?

可以利用一些自动化工具进行测试,为了更好地观察效果,采用irb(命令行交互)进行测试,如何要更好地查看网络通信,可以用burp设置代理。

[code]D:\crawl-ajax> irb –simple-prompt

require ‘watir’ => true include Watir => Object require ‘webtraffic’ => tru[/code]

新建IE对象

[code]>> ie=IE.new[/code]

请求页面,

[code]>> ie.goto(“http://ajax.example.com”) => 4.847[/code]

查看页面链接

[code]>> ie.show_links index name id href text/src 1 Login http://ajax.example.com/login.asp 2 News http://ajax.example.com/news.asp 3 Your area Javascript:loadmyarea()

=> nil

[/code]

可以看到有三个链接,通过发现一个链接还有JavaScript代码,打开链接3,

[code]>> ie.links[3].html => “Your area

ie.links[3].href => “javascript:loadmyarea()”[/code]

再次点击页面:

[code]>> ie.links[3].click => “”

[/code]

最后这个链接生成了个人页面。

通过前面的技术得到了下面这些链接:

[code]>> ie.show_links index name id href text/src 1 http://ajax.example.com/login.asp Login 2 http://ajax.example.com/news.asp News 3 javascript:loadmyarea() Your area 4 http://ajax.example.com/trade.asp Online trade 5 http://ajax.example.com/bank.asp Your Bank 6 http://ajax.example.com/mail.asp Mail => nil

[/code]

下面继续分析按钮事件:

[code]>> ie.buttons.length => 1

ie.buttons[1].html => “” ie.buttons[1].click => “” [/code]

发现这个页面调用了getPrice这个函数,而这个页面又将参数提交到了/myquote.asp这个页面

通过XHR和按钮就把页面所有的内容全部链接抓出来了。

4、本节总结

这节主要对AJAX爬虫的需求出发,阐述了该类爬虫面临的一些困难,并以一篇paper进行阐述其详细过程,通过这个实例相信对整个过程也有一定的了解,下篇文章继续,周末愉快~

参考文献 1)AIScanner http://www.aisec.cn 2)网络爬虫如何抓取web2.0 Ajax页面 http://blog.minidx.com/2007/10/31/39.html 3)Crawling Ajax-driven Web 2.0 Applications http://www.infosecwriters.com/text_resources/pdf/Crawling_AJAX_SShah.pdf 4)AJAX Crawl: Making AJAX Applications http://e-collection.library.ethz.ch/eserv/eth:30709/eth-30709-01.pdf 5)rbnarcissus http://code.google.com/p/rbnarcissus/ 6) Watir http://watir.com/