首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

定向抓取纵谈(转自淘宝搜索技术团队博客)

2013-10-22 
定向抓取漫谈(转自淘宝搜索技术团队博客)Age:表示抓取的网页过期的时间对于更新来说,目标是让平均age时间

定向抓取漫谈(转自淘宝搜索技术团队博客)

Age:表示抓取的网页过期的时间

定向抓取纵谈(转自淘宝搜索技术团队博客)

对于更新来说,目标是让平均age时间越小,freshness越高;一般的更新策略有两种:定期批量更新和按更新周期更新;定期批量更新指对一批URL,按照失效时间定期去刷新,按周期更新指的是按照页面更新变化频率而修正是更新频率,一般来说,更新越频繁的网页更新也就越快。

抽取策略:

XPATH是一个简单直观,但是很有效的一个方案,XPATH能精准的定位网页的任意一个位置,意味着我们可以很精准的抽取页面上的任意位置,当面临很多网站的时候,当然配置XPATH就是一个很艰巨的任务,也许存在一个自适应的XPATH识别的方法。

JS和AJAX

在java下面,HtmlUnit是一个不错的解决方案,HtmlUnit是Junit 的扩展测试框架之一,该框架模拟浏览器的行为,开发者可以使用其提供的API对页面的元素进行操作,套用官方网站的话HtmlUnit“是Java程序的浏览器”。HtmlUnit支持HTTP,HTTPS,COOKIE,表单的POST和GET方法,能够对HTML文档进行包装,页面的各种元素都可以被当作对象进行调用,另外对JavaScript的支持也比较好。一般来说,HtmlUnit是在java环境下解决JS的很好的选择

WebKit包含一个网页引擎WebCore和一个脚本引擎JavaScriptCore,它们分别对应的是KDE的KHTML和KJS;目前比较主流的浏览器Google Chrome和Apple的safari,都是基于WebKit的内核写的。使用浏览器作为抓取能更好的模拟用户浏览的行为,能够天然的解决JS和AJAX等问题,问题可能就是性能是一个瓶颈,

抓取频率

同时开启N个线程抓取一个网站,相信很快就会被对方网站封掉;因此抓取的频率也很重要;抓取网站同时不对对方网站造成压力;在robot.txt协议里面定义Crawl-delay来确定抓取的频率也是一种网站的通用的做法,对于一般的抓取而言,10到20秒抓取一次是一个比较保险的频率,也有提出10*t的抓取间隔(t是download时间)比较合理

定向抓取的框架

通用抓取架构,如下图

定向抓取纵谈(转自淘宝搜索技术团队博客)

多线程下载模块(Multi-threaded downloader)

该模块一般包含:

  1. 下载模块,下载网页,并应对一些web的一些错误,包括redirect等等
  2. DNS解析模块,网页数量很多的时候,我们需要一个本地的DNS解析模块来维护domain到IP的映射
  3. 链接抽取模块,抽取下一步要抓取的链接(follow link)

调度模块(schedule)

调度模块是抓取系统的核心,调度模块从url队列里面选择一批url喂到下载模块下载;其中会涉及到

  1. url调度,调度模块按照一定的策略,选取url进入抓取系统
  2. url除重,一定时期之内已经抓取的网页,不再抓取

实例:使用开源的scrapy爬虫抓取B2C站点的商品

Scrapy(http://scrapy.org/)是基于Twisted的异步处理框架,纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便,现在我们以scrapy为例子,简单配置一个抓取商品的例子。

Scrapy的安装请参考?http://doc.scrapy.org/intro/install.html#intro-install

  1. 定义起始页面:http://www.xxxx.com
  2. 定义详情页,例如:http://product.xxxx.com/product.htm?id=\d+
  3. 执行scrapy startproject mycrawler,新建一个mycrawler的工程
  4. 在mycrawler/mycrawler/spiders目录下,写抓取的python代码:mycrawlerspider.py
urljoin_rfc(response.url, url, response.encoding)

最后,在工程目录里面执行 scrapy crawl mycrawler

简单几步,我们就可以抓取得到一个站点想要的页面了,并且可以抽取指定xpath的内容。

一个简单的定向爬虫就搭建起来了,关键是一个能够大规模的分布式的爬虫可能是一个挑战,后续再进一步介绍如何在分布式环境进行大规模的抓取,以及抓取遇到的一些更为棘手的问题,see u

热点排行