1.scrapy+redis使用
(1)应用
这里redis与scrapy一起,scrapy作为crawler,而redis作为scrapy的调度器。如架构图中的②所示。
图1 架构图
(2)为什么选择redis
redis作为调度器的实现仍然和其特性相关,可见《一淘搜索之网页抓取系统分析与实现(1)——redis使用》(http://blog.csdn.net/u012150179/article/details/38226711)中关于redis的分析。
2.redis实现scrapy scheduler
关于此部分内容可见《scrapy-redis实现分布式爬取分析与实现》(http://blog.csdn.net/u012150179/article/details/38091411)和《scrapy-redis源码分析》(http://blog.csdn.net/u012150179/article/details/38226253)两篇文章。
3.scheduler细节分析
作为crawler的调度器,必然要涉及到网页抓取优先级、链接有效性、链接更新速度等的判断,关于一淘网页抓取系统,是这样定义的。
对一个通用的爬虫个,我们要定义
- 抓取策略,那些网页是我们需要去下载的,那些是无需下载的,那些网页是我们优先下载的,定义清楚之后,能节省很多无谓的爬取
- 更新策略,监控列表页来发现新的页面;定期check页面是否过期等等
- 抽取策略,我们应该如何的从网页中抽取我们想要的内容,不仅仅包含最终的目标内容,还有下一步要抓取的url
- 抓取频率,我们需要合理的去下载一个网站,却又不失效率
抓取策略
使用URL的正则特征是一个简单但却很高效的模式;对于定向抓取,一般的网站的URL有一定的特征,比如可能仅仅关心 .html, .htm, .asp, .aspx, .PHP, .jsp, .jspx类型的网页;或者是如果可以得到目标网站的正则,则可以大大的降低抓取的数量;又或者我们无需关心某一类网页,比如我们不抓取bbs.taobao.com下面的内容;仅仅需要抓取淘宝的商品页面(http://item.taobao.com/item.htm?id=d+ )。通过URL的正则能极大的降低抓取数量;
也可以通过网页的文本特征来确定;不过要复杂得多了,一般需要一定数量已知页面的训练集合,然后提取页面的文本特征,然后通过向量空间模型或者其其他基于主题词提取的模型计算目标网页和训练集网页的距离,决定是否是目标网页。
更新策略
Freshness:表示抓取到的网页是否已经被修改
Age:表示抓取的网页过期的时间
对于更新来说,目标是让平均age时间越小,freshness越高;一般的更新策略有两种:定期批量更新和按更新周期更新;定期批量更新指对一批URL,按照失效时间定期去刷新,按周期更新指的是按照页面更新变化频率而修正是更新频率,一般来说,更新越频繁的网页更新也就越快。
抽取策略:
XPATH是一个简单直观,但是很有效的一个方案,XPATH能精准的定位网页的任意一个位置,意味着我们可以很精准的抽取页面上的任意位置,当面临很多网站的时候,当然配置XPATH就是一个很艰巨的任务,也许存在一个自适应的XPATH识别的方法。
***********************************
younghz add:
对于freshness: 如果在t时刻网页内容和本地副本相同,那么说明本地存储是fresh的,不用更新,否则freshness = 0。
对于age:表示网页过期时间。如果t时刻网页被修改,那么age置为0。否则它的值为当前时刻与上次修改时刻的差。
***********************************
4.参考文章
[1]定向抓取漫谈
[2]淘宝摘星
转载自:http://blog.csdn.net/u012150179/article/details/38226915