这是我自己做的一个爬虫,是基于词频密度过滤、利用百度、谷歌、搜搜、360搜索4个引擎为种子来源的多线程爬虫,结果存入mysql。用到了jsoup和webclient。
github:https://github.com/wo4li2wang/MSpider
写这个纯是个人兴趣做的,因为我参加过数学建模,我一直想把数学模型用到程序里,所以尝试着写了这个东东,但好多功能没办法实现。希望大家能提供一些指导或改进的想法。
最近较贪玩儿,冒着可能梗儿屁的危险在这个骨节眼又把这个东东更新了下,现在它可以作为人肉某人的工具了,你可以试试拿这东东搜下你的网名或者你做过的没啥名气的项目,反正我试了,比如我以前做过的一些垃圾东东真还能爬出来。
2014年3月27日20:30:32
1.新增了搜索语句功能,可以像使用肚熊啊、谷歌啊那样用各种限制 比如
就相当于在所有搜索引擎里输入 site:…… 语法进行搜索,根据上面输入的关键词进行评分。当然,不输入搜索语句,则用关键词在搜索引擎中搜索。
2.可以自己附加种子链接,如果你觉得这四个引擎不咋靠谱的话……
3.增加了一些HTTP头信息,但是如果爬的流量太多,人家非说你是爬虫,非让你输入验证码,那我也没辙了
4.可以多层的爬(适合人肉非常难找的资源) ,如果是很常见的资源建议不要开这个功能。
代码需要重构一下,冗余的东东有些多,不够精简
1. 过滤算法
过滤关联度不大的网址,避免爬虫盲目搜索。目前只用到词频密度对网址和域名进行打分,在任务堆积较多(超过总队列长度90%)时,过滤掉相对评价分数小的网址。打算下一步得到关键词在全文的分布向量,用熵权系数法来比较各个关键词的分布情况,进一步优化过滤算法。原理和把纸撕成碎片然后对边缘进行拼合求关联度一样,关键词分布就像纸片的边缘,可以当做特征向量来求两两之间的商权系数,判断各关键词之间存在什么关系。(不过目前用词频密度过滤结果还算不错,大家可以试试看)
2. 整体结构
分为引擎搜索线程、爬虫线程和垃圾回收线程、数据库模块和任务队列4部分。这里自己画了个大致的结构图,如下:
引擎搜索线程采用单例模式,可以利用上述4中搜索引擎输入关键字得到结果,并将结果以一种特殊的数据结构放入任务队列中。引擎搜索线程用于获得爬虫种子,它受垃圾回收线程的控制。在队列任务不多的情况下利用site:host语句在各个引擎中搜索模型中host评分最高的网址,获得关联度更强的种子供爬虫使用。
爬虫线程的数量是可修改的(下一步打算结合内存和算法让其数量动态变化)。它们不断向任务队列里申请任务,得到分配后爬取网页,调用过滤算法,将有价值的结果放入队列并调用数据库模块写入数据库。
垃圾回收线程是后台线程,单例模式,时刻监控任务队列的情况,并在任务较多时清理垃圾,任务较少时启动引擎搜索线程获得更多爬虫种子。平时则关闭引擎搜索线程。
数据库模块采用单例模式,我没有用ThreadLocal(因为我的小电脑顶多运行8只爬虫,读写操作没那么频繁)。用同步块来执行读写操作。接受引擎搜索线程和爬虫线程的读写请求。它以host作为分类准则,对连接进行分类处理。不同的host存入不同的表内。
任务队列其实不是队列,它是对TreeSet的改造,还是采用单例模式╮(╯▽╰)╭,存放特殊数据结构的任务,供爬虫们使用。同时它也负责爬虫请求的任务分配。
3. 执行过程
1)调用引擎搜索线程run方法(注意不是start启动)初始化,从4个引擎上得到一定数量的种子
2)分别启动垃圾回收线程和所有爬虫线程,后续线程控制完全归垃圾回收线程控制。当然可以通过暂停按钮让所有线程阻塞。
启动mysql,输入create database mspider;
启动 com.td1madao.gui.MyFrame 即可启动GUI程序,也可以用 com.td1madao.gui.NoGui命令行启动
gui效果如图
在数据库里的效果如图(这里用MYSQL FRONT显示)
如果觉得功能不够,可以在com.td1madao.global.GlobalVar下修改默认配置,配置里提供了host黑名单、线程数量、算法等级、请求次数、任务队列长度等等,因为我不是很会做GUI,所以就没有在图形界面里实现这些功能。
如果想加入一些限制,可以采用如下语法
关键词(权重,是否必须存在)
权重是一个正实数,默认为1,表示这个关键词的重要程度
是否必须存在是一个布尔值,只能为true或false,表示这个关键词是否必须有,如果选true,不含这个关键词的连接会被过滤掉
比如:
JAVA 本科生 暑假 实习(4,true) 2014
那么实习这个词必须出现,且其词频密度权重为其他关键词的4倍(默认为1)。这样优先得到与实习关联强的连接
如果用括号限制,两个值必须都写,不能只写一个,关键词和括号之间不能存在空格!
[将要实现的功能] 如果有时间,打算增加同义词功能,比如:
奇虎/360/安全卫士(1,true) JAVA 后台
这样可以把 奇虎、360、安全卫士多个词当做同义词进行算法分析,搜索时类似搜索引擎的'OR'语法,但在算法实现上有点困难,有时间我会补充上。因为涉及到编译原理词法分析和语法分析的知识,稍微有点难做。
这只大爬虫的完全是出自个人的兴趣,程序结构、模型设计,算法设计和代码实现均个人完成,有的地方代码还不是很规范,很多设计模式也没有灵活运用上,希望大家不要笑话我o(╯□╰)o
ps:偷摸写点多余的东东。我是大三本科生,想在这个暑假去公司实习,希望哪位学长或学姐愿意给我一些建议或者觉得我应该向哪些求职公司准备。我的学习方向纯是JAVA 和JAVA WEB,感觉好多公司用得都是PHP或者C++,搞JAVA的公司实习真的好难找……
希望能对我毕业规划提供一些学习指导(当然如果真有人愿意给我推荐是最求之不得的咯),因为我家里没有搞IT的,比如将来就业该准备什么、怎么规划、应该学哪些热门技术、包括就业趋势,我只能问家里有搞IT的朋友或者自己瞎摸索T_T,考虑到毕业后要就业感觉各种没经验啊。
我的邮箱:[email protected]
我的qq:360810498
欢迎大家给我提一些建议或者经验