问题描述
最近我在做一个爬虫毕业设计,爬虫分为2个队列,对应两张数据表seeds和targets,seeds是尽可能多的爬url,targets是分析seeds中的url是否为我所要的,是则插入,否则过掉。而我现在的问题是,由于网页上的url可以看成是多叉树(因为每个链接进去后,又会爬到更多的链接……),所以seeds队列的记录以指数级增长,而targets却几乎是线性增长的,很明显跟不上seeds速度,所以现在出现一种情况是程序执行10多秒后,seeds表中爬到了8000多个url,但targets表才100来个记录。。这样的话seeds显得过于臃肿,而targets却比较空闲。请教各位朋友是如何解决这两者的矛盾呢? 问题补充:关于过滤问题,我是这样想的:我现在要爬新浪博客下的文章(对应的url我称为target),即需要在磁盘上保存满足正则表达式http://blog.sina.com.cn/s/blog_[0-9a-z]{16}.html(\?tj=1)*的url所对应的页面。经过分析,这些target一般会包含在某些页面中,这些页面我称为seed,它的url满足正则表达式:(http://blog.sina.com.cn/s/blog_[0-9a-z]{16}.html(\?tj=1)*)|(http://blog.sina.com.cn/[0-9a-z]+),即seed为形如http://blog.sina.com.cn/s/blog_xxxxxxxxxxxxxxxx.htmlhttp://blog.sina.com.cn/s/blog_xxxxxxxxxxxxxxxx.html?tj=1http://blog.sina.com.cn/xxxxx的url。因此,我至少要设置两张表,即targets和seeds,targets顾名思义就是存放要保存到磁盘下的url,而seeds就是保存有可能包含target的url。seeds中的每一条记录可能就是一个target,也可能仅仅是找潜在的target的普通url。
解决方案
采用正则表达是来过滤是一个很通用的做法,有的还有模版之类的。但是你现在的是爬新浪微薄的博客对吧,不知道你是通过什么知道http://blog.sina.com.cn/s/blog_xxxxxxxxxxxxxxxx.html 就是你要的target因为blog static id 都是加密过的 blogId, 所以你可以看到就算一个博主下面所有的blog static id 都是没有规律的所以我觉得你可以通过关系来爬,比如从博主,找到博友,在来找文章感觉有点博客搬家的感觉
解决方案二:
你是要自己实现爬虫功能,还是要利用现有的爬虫技术?如果是采用现有的,Java开源Web爬虫技术地址:http://www.open-open.com/68.htm
解决方案三:
3、对url的抓取,设置过滤规则,确认没有必要的就不入库
解决方案四:
1、targets可以使用多线程来处理,这样效率会高很多2、将处理完或不需要的seeds删除、或者移动到历史表
解决方案五:
不知道你的过滤策略是什么?直接过滤http://www.example.com这样的一级域名?还是要http://www.example.com/xxx/xxx对url链接内容进行过滤