-
答案 1:
从整体搜索引擎角度,分成三个子系统:爬虫(URL管理和调度下载解析等)、索引(用于全文检索)、存储(解析后的内容和快照等);爬虫子系统部分,又分为四个组件:Seeder- > Manager- > Harvester- > Collector(- > Seeder).1) Seeder负责URL管理,也就是定向网站种子url,以及曾经抓过的所有url,可扩展存储网页指纹,历史抓取信息等2) Manager负责调度,根据你的抓取策略(定时、增量、随机等)从Seeder调取url生成抓取任务;3) Harvester有多个,竞争得到抓取任务并专心下载,下载后内容传递给Collector;4) Collector有俩任务,解析html、搜集新链接,并把解析后的内容根据需要传递给索引系统和存储系统,把搜集的新连接传递给Seeder模块。这个设计是参考了国外一些论文实现的,个人感觉有几个好处:a) 四个组件组成良性循环,结构清晰,分工和扩展容易;b) Seeder+Manager 负责长期目标:指定的下载策略控制,根据不同的适用场景可以由不同的算法;c) Harvester+Collector 负责短期目标:充分发挥计算机资源(CPU/Memory/IO/网络)完成下载和内容解析;几点说明:1) URL去重可以放到Seeder来做,一个Bloomfilter就行;2) Harvester网页下载实现可以用一些高效异步IO,比如java的NIO等,单个线程同时发起上千个并发下载没有任何问题;3) Collecter网页解析主要是个浪费CPU的事情,一般只能开个线程池并发处理,为了提高解析效率,不在乎链接发现很全的情况下,可以考虑正则表达式解析(非常快,推荐);如果是图片的话,Collector就好办了,判断下载完的资源如果是图片,直接到存储系统。当然里面还有很多细节话题需要考虑,在此先一并忽略了~~ -
答案 2:
不太清楚定向爬虫,没有做过;但是感觉可以把爬到的文档在数据库中根据URL建立索引,爬过的就不用再爬了;HTML解析上,也可以用广度优先(而不是深度优先),如果目录比较深的网站可以截断 -
答案 3:
赞同刘嘉瑜的回答,或者你可以用队列来做任务调度保证一个url只处理一次可以参照一下一些爬虫框架的设计,比如http://scrapy.org/ -
答案 4:
来一个全局的消重吧,要简单的话可以用bloomfilter,不过不支持删除操作,会存在错误率。稍微带逻辑可以redis试试,能够支持过期这样的操作。 -
答案 5:
最近看到的一个淘宝的搜索架构的文章blog.nosqlfan.com/html...
如何设计一个定向Web爬虫?
2012-01-19 17:42:50 来源: 点击:
相关热词搜索:
上一篇:TermKit 这个项目被看好吗?未来能否被取代?
下一篇:C++中vector元素的类型为指针,如何将其赋为NULL?