用TinySpider进行网页抓取实例

本例中用到的maven坐标变化如下:

  1. <dependency>
  2. <groupId>org.tinygroup</groupId>
  3. <artifactId>org.tinygroup.spider</artifactId>
  4. <version>0.1.0-SNAPSHOT</version>
  5. </dependency>
复制代码

在百度中搜索笑话,看到这么一个网站:http://www.jokeji.cn/,点进去看看,里面的内容比较简单,也比较有趣,呵呵,就它了,我们今天的示例就是如何利用TinySpider来进行网页抓取。

示例1:获取某个分类下的笑话列表

首先在笑话分类中看到个爆笑男女,呵呵,先拿它小试一下,看看是否有效果。
首先编写一个main方法,内容如下:

  1. public class JokejiTest {
  2.     public static void main(String[] args) {
  3.         Spider spider = new SpiderImpl("GBK");
  4.         Watcher watcher = new WatcherImpl();
  5.         watcher.addProcessor(new PrintJokejiProcessor());
  6.         QuickNameFilter<HtmlNode> nodeFilter = new QuickNameFilter<HtmlNode>();
  7.         nodeFilter.setNodeName("div");
  8.         nodeFilter.setIncludeAttribute("class", "list_title");
  9.         watcher.setNodeFilter(nodeFilter);
  10.         spider.addWatcher(watcher);
  11.         spider.processUrl("http://www.jokeji.cn/list29_1.htm");
  12.     }
  13. }
复制代码

下面简单用通俗的话介绍一下,上面代码的作用:
首先构建一个爬虫,字符集是GBK,然后建立一个Watcher,Watcher用于在抓取的内容中,进行数据过滤。
如果过滤到内容呢,就执行PrintJokejiProcessor处理器进行处理。
后面设置过滤方式,是查找div标签,并且其class属性是list_title,最后,让爬虫去爬取http://www.jokeji.cn/list29_1.htm页面。
OK主程序就写完了,上面有个类PrintJokejiProcessor也是需要自己写的,内容如下:

  1. public class PrintJokejiProcessor implements Processor {
  2.     public void process(HtmlNode node) {
  3.         FastNameFilter<HtmlNode> filter = new FastNameFilter<HtmlNode>(node);
  4.         filter.setNodeName("a");
  5.         List<HtmlNode> aList = filter.findNodeList();
  6.         for (HtmlNode a : aList) {
  7.             System.out.println(a.getContent());
  8.         }
  9.     }
  10. }
复制代码

这个类的意思是,node就是上面说的包含list_title属性的div,然后从其里面找到所有属性名是a的节点,并打印其内容。
运行之,运行结果如下:

  1. 胖子是可爱滴,胖子更是的幽默滴 尽情的笑话我,别骂我2B就行了 这节奏,不糗死也得气疯掉 太损鸟,不挨揍,也得挨骂 爆笑的“二”哥 爆笑的妹子们,哥有点怕你们了 哈哈,逗的妹子很生气 奇葩情侣,雷你到恍惚 极品囧事,谁看谁爆笑 爆笑的二货们刚刚过完了年 幽默乐人的囧男女 二货的情人节笑话段子 一群爆笑又疯狂的游戏迷 结婚典礼的笑场囧事 一些非夷所思的搞笑糗事 你这么二,不怕别人笑话么? 他们来自淫民大学内涵系 搞笑的二货情侣 屌丝爆笑,这辈子别想有女友 脸都绿了,憋到内伤啊! 爆笑,一帮傻傻又可爱的二货
复制代码

从上面的的列表看,确实已经正确抓取的到数据,小试成功。

示例2:抓取所有的分类列表

先先Main方法

  1. public class JokejiCategoryTest {
  2.     public static void main(String[] args) {
  3.         Spider spider = new SpiderImpl("GBK");
  4.         Watcher watcher = new WatcherImpl();
  5.         watcher.addProcessor(new PrintJokejiCategoryProcessor());
  6.         QuickNameFilter<HtmlNode> nodeFilter = new QuickNameFilter<HtmlNode>();
  7.         nodeFilter.setNodeName("a");
  8.         nodeFilter.setIncludeAttribute("class", "user_14");
  9.         watcher.setNodeFilter(nodeFilter);
  10.         spider.addWatcher(watcher);
  11.         spider.processUrl("http://www.jokeji.cn/Keyword.htm");
  12.     }
  13. }
复制代码

再写里面的处理器:

  1. public class PrintJokejiCategoryProcessor implements Processor {
  2.     public void process(HtmlNode node) {
  3.         System.out.println(node.getContent());
  4.     }
  5. }
复制代码

下面是运行结果:

  1. 爆笑男女(1094) 社会(778) 冷笑话(737) 校园(607) 综合(448) 儿童(446) 夫妻(431) 爆笑签名(332) 家庭(307) 动物(305) 职场(276) 短信笑话(252) 幽默网文(211) 幽默笑话(150) 影视台词(132) 爱情(120) 医疗(109) 文艺(107) 名著暴笑(105) 哲理(99) 愚人(96) 节日笑话(92) 民间(89) 名人(87) 交通(86) 国际(70) 体育(60) 恋爱必读(51) 网络(50) 电脑(47) 宗教(47) 司法(44) 恐怖(42) 搞笑测试(38) 军事(34) 感情(32) 搞笑歌词(29) 顺口溜(27) 女人(27) 股市证券(21) 传说(13) 小笑话(9) 爆笑笑话(7) 求爱秘籍(6) 英语(5) 原创(4)
复制代码

呵呵,目录就打印出来了,当然后面附加了每个分类下的笑话数,要去掉它,太简单了因此,这里就不再耗费时间了。

示例3:打印所有分类下的笑话标题:

这里就简单的处理一下,把上面的两个类小改一下:
JokejiTest类的main方法修改成静态方法processUrl ,然后把下面的处理的URL变成参数传入

  1. public class JokejiTest {
  2.     public static void processUrl(String url) {
  3.         Spider spider = new SpiderImpl("GBK");
  4.         Watcher watcher = new WatcherImpl();
  5.         watcher.addProcessor(new PrintJokejiProcessor());
  6.         QuickNameFilter<HtmlNode> nodeFilter = new QuickNameFilter<HtmlNode>();
  7.         nodeFilter.setNodeName("div");
  8.         nodeFilter.setIncludeAttribute("class", "list_title");
  9.         watcher.setNodeFilter(nodeFilter);
  10.         spider.addWatcher(watcher);
  11.         spider.processUrl(url);
  12.     }
  13. }
复制代码

PrintJokejiCategoryProcessor类改成下面的样子

  1. public class PrintJokejiCategoryProcessor implements Processor {
  2.     public void process(HtmlNode node) {
  3.         System.out.println("===============================================");
  4.         System.out.println(node.getContent());
  5.         System.out.println("===============================================");
  6.         JokejiTest.processUrl("http://www.jokeji.cn"+node.getAttribute("href"));
  7.     }
  8. }
复制代码

就是说打出标题之后,再去利用URL进行下一层的数据抓取。
下面是调整之后的运行结果:

  1. ===============================================
  2. 爆笑男女(1094)
  3. ===============================================
  4. 胖子是可爱滴,胖子更是的幽默滴 尽情的笑话我,别骂我2B就行了 这节奏,不糗死也得气疯掉 太损鸟,不挨揍,也得挨骂 爆笑的“二”哥 爆笑的妹子们,哥有点怕你们了 哈哈,逗的妹子很生气 奇葩情侣,雷你到恍惚 极品囧事,谁看谁爆笑 爆笑的二货们刚刚过完了年 幽默乐人的囧男女 二货的情人节笑话段子 一群爆笑又疯狂的游戏迷 结婚典礼的笑场囧事 一些非夷所思的搞笑糗事 你这么二,不怕别人笑话么? 他们来自淫民大学内涵系 搞笑的二货情侣 屌丝爆笑,这辈子别想有女友 脸都绿了,憋到内伤啊! 爆笑,一帮傻傻又可爱的二货 
  5. ===============================================
  6. 社会(778)
  7. ===============================================
  8. 绝B坑爹,坑到气绝身亡 黑色幽默,荒唐的事儿真不少 碰到这种事,我一般都狂笑不语 坑爹都不带打草稿的 都意味深长的笑了 几段过年的冷幽默 莫和有钱人攀比,比不起呀! 爆囧的二货借钱 过年的爆囧段子,笑味四溢 春节笑话特辑,给笑友们拜年了 吐槽春运的冷段子 快过年了,搞笑开启过年模式 爆糗的买单,看谁脸皮厚 火车票它是个冷笑话 妹的,被鄙视了,好郁闷啊! 糊里糊涂,迷迷糊糊的郁闷挫事 吃喝方面的搞笑二货囧事 逗人糗事,非常非常的火大 可以学到生活技能的小笑话 这是该哭呢还是该笑啊! 近在身边的幽默生活讽刺 
  9. ===============================================
  10. 冷笑话(737)
  11. ===============================================
  12. 调皮禅师出没,小心冷倒 都不按套路来,有点乱套哈 天上到人间的冷段子,凌厉冻人 他们祖上是卖冰棍的,冷出身 冷的好笑,新鲜又冻人 认识的人都说:骚年,你好冷. 冷人的歌曲控,她(他)们的歌唱的很好 你这么冷,你家生火炉了吗? 笑话里面有年味儿 贱气如霜,真够冷! 颇为冻人的逗笑冷幽默 逗笑冷料,不由自主的想笑 专黑经典名著的冷笑话 爆逗冷语,不笑僵也得被冻僵 冷的经典,笑的开心 玩的就是没节操 太冷,适合躺被窝看的冷笑话 糟践名著的冷笑话 小冷怡情,解闷消愁 冷翻,二起来真是没个够啊! 冬天的笑话,冷的很! 
  13. ===============================================
  14. 校园(607)
  15. ===============================================
  16. 逗B学生的爆冷囧事 搞起笑来,学生的境界越来越高 大学生没几个学习的,都在干啥呢? 爆笑:二货老师,让学生受不了 学生调皮捣蛋,气得老师干瞪眼 听到老师说这些就头皮发麻 憋到老师内伤的二货家长 对寒假作业那是恨之入骨啊! 爆笑逆天的二球学生 狠有幽默精神的老师 学渣怎么就成了人渣了呢? 有二货同学在,不想笑会很难 每到期未,校园段子常出没 幽默有笑的男女趣话 学渣路上的风景真美好! 无药可救的搞笑学渣段子 二B同学雷翻天 幽默老师,让学生很悲催 校园的花朵,朵朵奇葩 校园的爆囧坑爹、损人事 气的老师暴跳如雷 
  17. ===============================================
  18. 综合(448)
  19. ===============================================
  20. 超含蓄的内涵笑话 精辟、机智幽默的问答 幽默的狠,暗暗发笑 囧到满脸惊讶的爆笑 幽默精品,别笑翻喽! 一些无知、脑残的爆冷糗事 嘎嘎,多委婉的搞笑吧! 内涵搞笑,源自那颗不甘寂寞的心 东拉西扯,闲趣爆笑 爆笑雷人,这些人真会玩 生活中的搞笑趣事,哭笑不得 非傻即呆,逗你开心 不经意间就闹出笑话 高水平的新编段子、歇后语 幽默冷人:无可救药的学生、朋友 十分搞笑的老年人 周未闲情,感人至深的情感微小说 幽默的调侃,冷人的讽刺 搞笑谜语,活动下你的大脑 拿人寻开心的冷幽默 蔬菜瓜果的幽默言语 
  21. ===============================================
  22. 儿童(446)
  23. ===============================================
  24. 爆笑小盆友,专治笑点高 儿童带给我们的欢乐太多了 熊孩子们厉害啊,把大人憋到内伤 让大人尴尬万分的熊宝宝 爆笑熊孩子,你知道的太多了 就是在哭,熊宝宝也能把你逗笑了 奇葩小伙伴,有萌有逆天 过年,总让人想起小时侯 贫嘴的小朋友,小心被爸妈揍 要把人笑疯掉的小伙伴 萌呆宝贝的爆笑糗事 这宝宝非让人笑爆不可 淘气孩子,笑的肚子疼 爆笑调皮的浑小子 笑死人也气死人的熊孩子 非常勤快、懂事的熊孩子 叫父母不淡定的爆笑熊孩子 爆笑的二货兄弟姐妹 儿童幽默,巨冷的萌宝贝 孩子,照顾点父母的情绪吧! 非萌呆即吃货的小伙伴 
  25. ===============================================
  26. 夫妻(431)
  27. ===============================================
  28. 二货夫妇,二到那里,笑到那里 二B老公让大家不缺笑 明嘲暗讽的逗B小两口 二不够的夫妻,叫你笑个够 逗B夫妻的搞笑囧事 都被老婆修理怕了。 没节操的闷骚夫妻 夫妻调侃的小幽默 幽默夫妻战,增加夫妻斗争经验 欢声雷动的婚礼现场 爆笑的重量级老公 互相嘲讽的开心小夫妻 假话连篇的幽默小夫妻 苦B爆笑,做老公的赶脚很不爽 狠不地道的搞笑老婆 最令人生畏的人是老婆 最爱看夫妻斗嘴、吃醋 夫妻间摩擦出搞笑的火花 老婆对我真好,太TM感动了!!! 爆糗夫妻,老婆又不高兴了 旁观者清,爆笑的弱夫悍妻 
  29. ===============================================
  30. 爆笑签名(332)
  31. ===============================================
  32. 俏皮的狠,一串笑语乐半天 常吐嘈,能调侃,幽默每一天 犀利吐槽,这几个意思?! 不说他们有多搞笑,说说他们有多2B 又损又冷的二货趣语 爆冷言录,弱弱的逗你笑一个 有点讽刺,更多的是有些2B 俏皮辣语,逗你乐得跟过年似的 多多吐槽,心情会变好 充满矛盾的搞笑趣语 俏皮二货,总和别人想的不同 幽默为风格,俏皮为风骨 句句戳中青年男女的心 把悲催当笑话诉说 青春逗之男女调侃趣语 俏皮幽默的趣侃、吐槽 多么痛的搞笑领悟 爆逗俏皮的闲情笑语 幽默冷话,要把调皮进行到底 总结2013,笑迎2014的跨年爆笑段子集锦 用苦B调侃来排解郁闷 
  33. ===============================================
  34. 家庭(307)
  35. ===============================================
  36. 幽默爸妈乐一家 这些老妈是棵不可靠的大树 让儿女超无语的亲爸妈 老爸是个搞笑达人 老爸老妈适合演小品 尖刻犀利的雷人爸妈 家里有个幽默的爸妈 爆囧的老人,真是家有一老,如有一宝 父母雷事,觉得他(她)们有些二 这恐怕是最“有爱”的爸妈了吧 熊孩子和雷爸妈的小笑话 欢声雷动的爆笑一家人 极二的爸妈,真是空前绝后啊 有种爹妈,叫不是亲生的 搞笑的家长,苦B的儿女 爆笑老爸老妈,房梁都能笑歪了 爆笑亲子,雷爹悍妈 笑掉大牙的雷神爹妈 孩子成了家长的开心果 奇葩父母,让孩子很无语 巨冷父母,都是幽默高高手 
  37. ===============================================
  38. 动物(305)
  39. ===============================================
  40. 爆冷有笑的动物,I孵了You 好冷的动物,跟寓言似的 冷若冰霜的搞笑小动物 爆笑动物,瞧见它们就想笑 爆冷萌翻天的动物伙伴们 幽默动物说出了我们的心声 动物们婚后的怨气真大啊! 滑稽的动物笑死人了 很有冷笑果的搞笑动物 很有灵性的爆笑狗狗 又冷又逗的超萌动物 好冷好幽默的小动物 动物的搞笑念头 动物的整容效果很搞笑 动物的搞笑杂侃 狼爱上羊,那是经过深思熟虑的 动物嘴里的的名言雷语 非常逗笑的爆冷动物 狗很生气,奋力辩解 动物王国的开心冷人事儿 动物的幽默“变迁” 
  41. ===============================================
  42. 职场(276)
  43. ===============================================
  44. 搞笑不俗的冷人小老板 冷人的职场笑料 爆笑,面试场上显“才华” 最苦B抓狂的事是加班! 要笑翻的爆囧同事 幽默贫嘴的2B同事 没有年终奖,只有年终殇 超坑爹的领导和老板 二B同事让人憋到内伤 老板真幽默,不服不行 办公室里开心靠二货 二货同事给上班增加了不少欢乐 又坏又损的幽默二货同事 精通幽默的生意人 科长给我们上了堂“扫盲”课 老王和的小王职场爆笑 奇葩同事能让上班有个好心情 微软收购诺基亚后,两个CEO的幽默对话 爆汗的职场趣事 笑翻一地的职场糗事 办公室里传来爆笑声 
  45. ===============================================
  46. 短信笑话(252)
  47. ===============================================
  48. 幽默浪漫的情人节短信 马年幽默祝福短信马上到 如此荡漾,不得不想歪! 元旦搞笑幽默短信送亲友 圣诞节祝福短信之幽默搞笑版 2013幽默搞笑国庆短信送亲友 精选逗人短信贺中秋 给超龄儿童的六一节幽默短信 一群雷人的二货、闷捣蛋 整蛊逗人短信一溜串 精选幽默短信迎三八 逗乐短信迎元宵 新年到!幽默拜年短信串串烧。 2013新年开心搞笑短信送亲友 极品整人短信串串烧 新年、春节的幽默短信送祝福 幽默逗人的元旦祝福短信 2012圣诞节笑话、短信 一组逗人的幽默整蛊短信 经典搞笑的光棍节短信集锦 万圣节幽默搞笑短信 
  49. ===============================================
  50. 幽默网文(211)
  51. ===============================================
  52. 幽默成语数学题、妙改诗词名句、歇后语 妹子们,胸小要自信,胸小好处多! 雷人不厌的神回复 毁人不倦的神回复 是长大后改变了我们的小时侯 辣妈吐槽带孩子苦 真有钱,土豪和他们都没法比 问题很平常,答案很搞笑,跟谜语似的 看春晚,只为能开心的吐槽 赏吃货风采,品吃货语录 若非脑残,便是神经病了 被窝才是真正的人间天堂 妙改诗词、名句,灰常搞笑 逗你会心微笑的俏皮辣侃 精彩夺目的幽默神回复 “斗地主”悟出的人生道理 笑翻,真是一群无耻之徒! 十句深受“鼓舞”的“名言警句” 最坑爹的游戏--人生,不玩都不行 一定会爆棚的装B活动 非常“有用”的生活小常识 
  53. ===============================================
  54. 幽默笑话(150)
  55. ===============================================
  56. 笑话集原创笑话精品展第二十七期 笑话集原创笑话精品展第二十六期 笑话集原创笑话精品展第二十五期 笑话集原创笑话精品展第二十四期 笑话集原创笑话精品展第二十三期 笑话集原创笑话精品展第二十二期 笑话集原创笑话精品展第二十一期 笑话集原创笑话精品展第二十期 笑话集原创笑话精品展第十九期 笑话集原创笑话精品展第十八期 笑话集原创笑话精品展第十七期 笑话集原创笑话精品展第十六期 笑话集原创笑话精品展第十五期 笑话集原创笑话精品展第十四期 笑话集原创笑话精品展第十三期 笑话集原创笑话精品展第十二期 笑话集原创笑话精品展第十一期 笑话集原创笑话精品展第十期 有点内涵的幽默小笑话 笑话集原创笑话精品展第九期 笑话集原创笑话精品展第八期 
  57. ===============================================
  58. 影视台词(132)
  59. ===============================================
  60. 小品《同学会》犀利台词 小品《偏方》经典台词(湖南卫视春晚) 2014春晚小品《扶不扶》台词集锦 春晚台词之小品《我就这么个人儿》精彩台词集锦 春晚台词之小品《扰民了您》精彩台词集锦 强力段子,专黑中国好声音 超得瑟的刘能语录 富春山居图的幽默犀利台词 西游降魔篇经典台词 《给你一千万》台词怪好笑类,河南人必看 《正者无敌》台词很爆笑啊 爱情公寓3搞笑台词第二季 爱情公寓3幽默台词 《饭局也疯狂》台词可真逗 新版西游记的爆笑雷人台词。 电影《大魔术师》经典台词,笑点十足诠释魔术人生! 吐槽2012春晚的笑人段子 小品《相亲2》搞笑台词、视频 冯巩小品:跟着媳妇当保姆台词+视频 搞笑雷人的失恋33天台词 导演与演员的小幽默 
  61. ===============================================
  62. 爱情(120)
  63. ===============================================
  64. 谈女人就离不开钱 红太狼这样的女人不能娶 婚恋生活锤炼出来的趣言妙语 几对情侣的爆逗趣事 恋爱像极了销售 情感俏皮话,也是大实话 专业的幽默情书精选 恋爱妙喻,恋爱像什么? 求婚被拒的搞笑理由 核桃姑娘,星期一姑娘和铅笔姑娘的感人“爱情” 夫妻小幽默,充满喜和乐 吐嘈感情和结婚 爱情这个神话有点悲催 谈情说爱的经典语录 情感男女的一句话爆笑 恋爱有关的小幽默 你要嫁人,不要嫁给这些人 恋爱情侣的笑人糗事 让人苦笑的恋爱男女 经典的爱情妙喻微小说 闲言碎语话男女 
  65. ===============================================
  66. 医疗(109)
  67. ===============================================
  68. 医院是个可以冷死人的地方 医患囧事,哭笑不得 爆笑医患,啼笑皆非的囧事 黑医生的医疗冷幽默 他们不是医疗专家,是冷笑话专家 医疗讽刺:坑爹的医生寻常见 爆冷的医生、护士与病人 医患之间逗人冷笑话 搞笑的医院院长修电视 爆冷的医生让人Hold不住 不同服用方法药品的幽默言语 别具特色的“药名”情书三封 幽默冷人的病人和医生 这些医生很雷很搞笑 搞笑‘戏说’医疗工具 做强盗远不如做医生 为医院科室写的幽默对联 医生看病的经典冷幽默 难倒医生的爆笑病号 巨冷的医患幽默 相当不着调的医生和病人 
  69. ===============================================
  70. 文艺(107)
  71. ===============================================
  72. 幽默之眼看成语2 巨有趣的看数字猜成语 幽默好玩的词语新解 幽默有趣的成语之最 超有趣的歌名组合,逗笑冷人 大小写字母闲侃生存之道 有些汉字可以拆开了解 幽默趣文:贬义词要褒义看 趣味横生的字说字话 小写字母之间的幽默饥讽 汉字之间的讥笑 春晚的槽点不断涌现 歪解动物成语、歇后语 趣味词典,汉字拆开来解释 悠闲的汉字之间讥讽、斗嘴 汉字逗趣:多看一眼,就会有新发现。 幽默的数字求婚 歪解成语,我是这样理解的。 幽默之眼看成语 英文字母的幽默拾趣 各种乐器的搞笑个性签名 
  73. ===============================================
  74. 名著暴笑(105)
  75. ===============================================
  76. 西游三国外传冷笑话版 三国故事的当代幽默演绎 分析发现,孙悟空其实是个女人 好雷爆冷的名著乱编 无良的名著恶搞冷笑话 恶搞名著到不忍心 偏冷的三国冷段子 水浒人物的职场感言 爆冷的闲侃西游记 唐诗宋词要幽默读 搞笑的四大名著倒过来写 三国西游混搭冷笑话 水浒人物最爱唱的流行歌曲 水浒人物就在我们的日常文章中 拿名著涮点冷幽默乐乐 吕布、鲁智深和包大人的冷笑话 三国人物上网干点啥? 拿西游、三国、水浒玩穿越 三国西游穿越版笑人冷料 冷笑话玩穿越,古人躺着也中枪 笑死人的四大名著冷笑话 
  77. ===============================================
  78. 哲理(99)
  79. ===============================================
  80. 陶冶心性的哲理妙语 幽默言录,很有哲理的赶脚 体悟生活的精练妙语 回味悠长的哲理故事 周未闲情,陶冶情操的人生佳句 修身养性妙语录,别有一番滋味在心头 幽默经典的阅世趣语 形象的妙喻,幽默的道理 比较有幽默感的生活经典感悟 幽默俏皮话里有哲理 有意义、有道理的幽默句子 颇具哲理的幽默良言 巧妙风趣的生活哲理趣话 生活里感悟到的幽默妙语 哲理小语,很有实现意义 以苦做乐,幽默人生 幽默的另类观点,颇有哲理 小有哲理的励志趣语 绝妙比喻诠释人生 感悟生活要有一棵幽默之心 人生感悟,幽默哲语 
  81. ===============================================
  82. 愚人(96)
  83. ===============================================
  84. 蠢人糗事,好白痴的赶脚 傻笑就是越傻越好笑 越傻越爆笑,特别是装傻 生活中的可笑蠢事 囧翻,正常人不会干这种事儿 老年人的精品糗事 爆囧,这智商真叫人捉急 囧,好一会儿才反应过来 尴尬糗事,想起来就脸红 怪味幽默,疑似智商有问题 二货界里的奇葩,争奇斗艳啊 又到愚人节,愚料几小节 愚人冷幽默,无知才会愚昧 爆笑愚人,一蠢到底 职场、生活里的爆笑同事 寄信、醉鬼和打劫等愚人爆笑 超有笑的愚人囧事 搞笑雷人:不是脑抽,就是真傻。 神级脑残惹人爆笑 特别冷的愚人蠢事小笑话 搞笑愚人逗你捂嘴偷乐 
  85. ===============================================
  86. 节日笑话(92)
  87. ===============================================
  88. 逗B们的搞笑情人节 爆笑诙谐的圣诞笑话,祝笑友们圣诞快乐! 光棍的好处可真不少! 国庆假期里的开心趣事 二货的中秋最快乐 中秋特供:笑话仁的月饼 回味七夕的冷段子 笑迎内涵的七夕节 植树节将至,树‘木’有话说 三八节,一个苦B男人的一天 盘点春节期间的段子、笑话 春节期间的逗笑趣事 2013情人节超恶搞笑话 雷语段子吐槽春节、春晚 2013春晚爆笑台词精彩合集 蛇的笑话歇后语 一些春节的笑话段子 年关将至,年货有话说 光棍节说棍 国庆假期陪你开心过 幽默趣侃月饼和中秋 
  89. ===============================================
  90. 民间(89)
  91. ===============================================
  92. 爆囧的大妈、老爷爷 偷奸耍滑的小寓言,十分坑爹 有张俏皮嘴,搞笑很轻松 可爱雷人的大爷、大妈 夏天啤酒喝多后的案例分析 恶心冷人的开心段子 广为流传的经典笑话 愚人娱乐,看谁最傻瓜 愚笨鲁莽的民间爆笑 搞笑吝啬,抠门到没法说 幽默风趣的文化人儿 讽刺一下那些臭显摆 吝啬的、贪心的,都蛮搞笑的 民间笑话,都是玩冷的高手 作家,舞蹈家等民俗名人小幽默 小笑话:看望犯人、冰啤酒和父亲的相片 几件荒唐爆笑事儿 爆笑的小偷、小贩、懒汉和起名专家 很逗笑的尴尬糗事 冷人又讽刺的古人幽默 吝啬笑话里的极品。 
  93. ===============================================
  94. 名人(87)
  95. ===============================================
  96. 精编恶搞名人、明星冷段子 汪峰段子,比上头条的那些人都要火 明星冷段子,中枪的会是谁? 欲哭无泪的郭小四 调侃明星的流行段子 明星、大腕们的幽默佚事 莫言的诺贝尔冷幽默 元芳体爆红:元芳,你怎么看 很带劲的韩乔生体 一些郭敬明的段子,颇为好笑 包青天系列冷笑话集锦 青天包大人最近很忙 名著名人过“五一” 拜读下赵丽华的幽默诗歌(梨花体) 名人经商,起个名字很轻松(明星体店名) 潮人凤姐,最近雷语频出 要像乔布斯那样活,不要像乔布斯那样死 移花接木,名人嘴里的俏皮话 跟世界名人学幽默感 达尔文、关羽等名个冷笑话。 姚明退役了,发点他的笑话纪念下, 
  97. ===============================================
  98. 交通(86)
  99. ===============================================
  100. 大雾的搞笑影响 乐在囧途,公交车上乐事多 车祸之后的爆笑奇闻 闯黄灯和酒驾的搞笑段子 笑声不断的公交车上 乘公交和乘飞机的冷幽默 让堵车也有个好心情 挤公交的搞笑成语版 飞机上的囧事乐死人 交通幽默:这些人真够难缠的. 一组幽默搞笑车贴 交通冷幽默,逗人乐翻天 搞笑大话挤公交 春运买票的俏皮网语 巨雷的春运内涵段子集锦 飞机上的冷人爆笑 搞笑词典驾照版 乘公交和住酒店的雷事儿 飞机上搞笑的乘务员和旅客 高油价下的节油终极攻略。 加油站加油看身份 
  101. ===============================================
  102. 国际(70)
  103. ===============================================
  104. 奥巴马看到了,鼻子会气歪的 国耻9.18,唾骂小日本正当时 美国、苏联和穆斯林的冷幽默 国际段子,拿美帝开涮 千万百计的嘲弄小日本 专开国际玩笑,开到联合国 狠骂小日本,以解心头之郁闷 理性反日,君子动口不动手 网友对西宫伸一之死的爆强评论 痛骂小日本的笑话段子 笑话气死小日本 国际段子,笑遍全球 国际笑话,经典讽刺 经典的国外小笑话几则 经典:笑话里面看国家特点。 G20与外星人的笑话。 爆笑的医生看美国强迫人民币升值。 来自美国的小幽默 国外爆笑:比比看看谁傻瓜 阿姆斯特朗举世闻名的一句话 朝鲜小学生作文:金爷爷哭了。 
  105. ===============================================
  106. 体育(60)
  107. ===============================================
  108. 奥运五环变四环的冷幽默 国足啊,真真的为你感到脸红 可怜滴国足,都被损成这样了! 有关足球的搞笑段子 非把球迷(足球)气晕不可 幽默段子告别本届奥运会 伦敦奥运冷笑话 各种体育项目的逗人雷语 伦敦奥运会的雷人花絮 为啥伦敦奥运冠军都咬金牌? 体育赛场项目、工具的幽默趣侃 体育项目之间的幽默神侃 奥运会不仅产生金牌,还产生笑话 火爆新鲜的伦敦奥运段子 奥运体育项目的搞笑调侃 各种球类之间互为偶像 吐槽伦敦奥运的爆笑段子 奥运会的小笑话几则 看欧洲杯能看出家庭纠纷来 调侃欧洲杯的火热爆笑段子 另类视角看体育项目 
  109. ===============================================
  110. 恋爱必读(51)
  111. ===============================================
  112. 男女情感的幽默剖析 大话男女,说到你的心窝里 内涵幽默,这代表几个意思呢? 妹子,你真是太逗了 你二的精彩,我们笑声鼓励 恋爱、婚前的精品幽默读物 有人太损,小心作茧自缚 泡妹子的辛酸事儿 经典趣侃婚恋男女 妙不可言的婚恋男女锦句 妙语侃婚恋,恋爱前必读 解读男女婚恋情感的幽默妙语 幽默情感妙语串烧 女孩眼里男生的问题多多 男人就像一盘菜 幽默的相亲和介绍对象 恋爱、婚姻的妙言妙语和深度解读 经典俏皮滴婚恋情感趣语 十分经典的幽默婚恋妙语录 经典恋爱妙语、小笑话 婚恋经典风趣语录 
  113. ===============================================
  114. 网络(50)
  115. ===============================================
  116. 买iPhone5的雷人段子 iPhone5的各种雷人吐槽段子 精典雷人的IT段子 谷歌收购摩托罗拉的段子 个人资料说明文字笑死人 非常搞笑的QQ个人说明签名 淘宝上的爆笑差评 雷人网名一小串。 上网就像谈恋爱 盘点2010年十大网络流行语--给力,我爸是李刚,... 2010网络年度雷人总结 调侃腾讯和360的小段子。 腾讯VS360,微软等也行动起来了。 黑客和电脑菜鸟的爆笑对话 调侃网民的冷笑话。 当俗话遇上互联网。 古人早已会使用互联网。 细致的观察,幽默的感悟。 幽默网络箴言录 最佳网名奖牌榜 搞笑网络流行语 
  117. ===============================================
  118. 电脑(47)
  119. ===============================================
  120. 巨冷搞笑的程序员 爆笑程序员的笑话集锦 iPhone和诺基亚的冷段子 电脑名词的生活化解释 Dota游戏中的搞笑事儿 电脑其实是个女的。 硬盘漏水、压死病毒和电脑写信 巨搞笑的IT行业笑话。 爆笑:天堂的破服务器。 洞房花烛夜之电脑版,笑死啦!哈哈~ 电脑与老婆 百度最强贴吧列表,有点无聊哦~~ 主席的QQ和他们QQ好友们 绝密啊!!! 淘宝上看到的好评与差评解释 无所不知的万能电脑 疯狂的网游迷 “小姐像我老婆”群主版 电脑冒烟现象的修复办法 软件版本号新解 电脑城有了以后 IT人士群聚喝酒的讲究(超级搞笑) 
  121. ===============================================
  122. 宗教(47)
  123. ===============================================
  124. 有关牧师的经典爆笑 逗人的和尚冷笑话 好冷的阎王、上帝和神父 菩萨、耶稣和传教士等冷笑话 神是这样安排人这一生的。 牧师和上帝的小笑话 保守忏悔秘密的神父 爆笑的上帝、天使、牧师和神父 幽默的牧师和圣彼得 牧师、神父和耶稣的小笑话。 经典宗教笑话几则 酒吧门外的修女与酒鬼 耶稣和撒旦的矛盾起因 上帝与牧师和神甫的笑话 牧师和尚和虔诚的基督徒 算命的算的可不单单是准。 人都是说谎和不忠实的 牧师座飞机 选择天堂还是地狱. 修女的假期 不小的收获 
  125. ===============================================
  126. 司法(44)
  127. ===============================================
  128. 荒唐滑稽的警匪爆笑 搞笑的犯人、法官和律师 爆笑:同情的说,这些犯人够惨的 荒诞不经,离奇搞笑 司法领域的冷人幽默 贼和骗子的冷幽默 法官、律师和富翁的冷幽默 劫匪、小偷的冷人爆笑 巨流行的警察淘宝体。 被告、骗子和抓小偷 犯人、小偷和拆弹专家 搞笑犯人和小偷 爆笑的犯人、律师和法官 司法领域冷冷的小笑话。 幽默的司法小笑话。 Police遇到的爆笑解释 抢匪的爆笑日记。 法庭之上的幽默 法庭一般是这样审案的。 调侃律师的笑话 法庭上的法官和贪官 
  129. ===============================================
  130. 恐怖(42)
  131. ===============================================
  132. 越想越怕,好吓人的赶脚! 恐怖啊,额滴神呐,吓尿了!!! 比闹鬼还恐怖,夜间勿看,胆小勿看 不要怕,只是有“一点点”恐怖 恐怖幽默,妈呀吓屎人 恐怖鬼笑话,吓的心砰砰直跳 吓人的鬼笑话,冷到恐怖 恐怖小笑话,胆小勿入哈 恐怖的半夜上厕所 彰显个性的墓碑铭 好恐怖啊,小心吓到你。 恐怖:有个吊死鬼,你敢不敢去看 深夜里的未班公共汽车。 太平间里的吓人话。 冷冷的,又有些恐怖。 阎王和鬼的笑话 超吓人短篇鬼故事 12个好玩又怕怕的鬼故事 奉献几个鬼故事,胆小的不要看哦~~ 两个倒霉鬼在酒吧喝酒聊手机 鬼片里面的基本定律 
  133. ===============================================
  134. 搞笑测试(38)
  135. ===============================================
  136. 找大师唠点冷料乐乐 巨准的星座性格特征,总有一款适合你 搞笑急转弯,明显反应不过来 这些倒霉郁闷事,你肯定碰到过不少 测下你的女友值不值得娶回家 春节来做脑筋急转弯 测测你脑残了没有! 猜猜脑筋急转弯,活跃下你的大脑, 脑筋不转弯,还真答不上来. 考验你智商的脑筋急转弯 你说这会是什么影片? 笑看12星座的性格特点 开心雷语,有些可以做签名。 如果房价大跌,如果你家有一亿元. 全方位测一下你的男友哈~ 看似简单的小测验 很准的测试,认真思考,一测一个准。 眼睛困了要做眼睛保键操。 人性悖论,倒霉事及星座排行 猜下这两个人是什么关系? 整蛊测试,挺灵的哈~ 
  137. ===============================================
  138. 军事(34)
  139. ===============================================
  140. 经典的军旅生活爆笑 军营里的开心幽默 军营内外的小笑话 爆笑的新兵训练和体检 搞笑的新兵和警员 露马脚、惩罚和诉苦等冷幽默 风趣军营小幽默 军营里体检、训练和跳伞等冷笑话. 经典的军营笑话 有趣军事小笑话。 韩国发现的朝鲜炮弹。 二战相关的几个小笑话。 幽默开心的军旅笑话 迎八一,军人的幽默。 军营里面的有趣事儿。 这就是军营的生活 混在部队的流行顺口溜 战场上的笑话,哈哈~~ 三则士兵笑话 美国将军的退休奖励计划 军旅笑话四则 
  141. ===============================================
  142. 感情(32)
  143. ===============================================
  144. 男女关系的俏皮调侃 调侃婚恋青年的逗笑妙语段子 幽默逗趣的情恋妙语 幽默有趣的情恋漫话 情恋妙侃,细细品味,还真是这样 泡妹子的一些温馨小伎俩 让人内心无比感慨的母爱 幽默趣语,道出情感真谛 “大剩”的日子不好过啊 结婚的搞笑理由 很写实的幽默情感箴言 有点变味的情感幽默 笑侃婚姻,婚姻是什么? 专业角度看爱情 幽默趣语妙侃婚恋男女 经典极品婚恋妙语 闲聊感情男女,妙语连珠 幽默男女的感情雷语 谈情说爱的情感小幽默 婚恋如营销,更像你的工作 情侣对话,女问男答,答的好,答的妙 
  145. ===============================================
  146. 搞笑歌词(29)
  147. ===============================================
  148. 搞笑歌曲改编校园版 超搞笑的经典歌曲恶搞改编 2012年春节联欢晚会经典台词整理。 搞笑减肥版忘情水 唱衰房价的搞笑歌词 小趣味:歌词显示明星的职业潜力。 经典歌词逗乐我。 乡村爱情故事 搞笑台词大全 听不清歌词闹笑话 一组改编歌曲搞笑版 大兵小将 搞笑台词 听错了的歌词,居然还会这么搞笑 50条超级变态的网名 群主啊,你在哪里 太贴切了!金庸人物一人一首主题歌 国人醒醒 2009年春节联欢晚会经典台词和搞笑台词 09春晚十大经典台词 笑在幸运52 大哥(股市版) 越来越绝的歌名 
  149. ===============================================
  150. 顺口溜(27)
  151. ===============================================
  152. 卖老鼠药的爆强顺口溜 一组绕口令,练练你的嘴皮子 闲谈生活风趣顺口溜 来自生活的趣语顺口溜 误人俗语和雷人顺口溜 绕口令大全,难倒你的嘴 风趣的脑筋急转弯和顺口溜。 很油菜的拍马屁和顺口溜。 你和他讲道理,他和你耍流氓。 四大顺口溜锦集 有困难怎么办?很好办! 来自民间的世象描绘 搞笑短信顺口溜 教师是什么? 经典:现在大家都是这么说的~ 很具特色的四大理想 9个经典顺口溜 等咱有了孩儿 名人和凡人 关于男人和女人的顺口溜 让人怀念的80后顺口溜大全 
  153. ===============================================
  154. 女人(27)
  155. ===============================================
  156. 女人最拿手的事是让男人吃不消 和闺蜜聊天真搞笑 笑谈男女的有趣句段 女人,是一个不错的幽默话题 女人50年的幽默变迁 相亲节目的女嘉宾眼里,历史名人她们也不满意 精典趣话,小侃女人 彪悍的已婚妇女 写给妻子这片“药”的说明书 经典:婚后女人的“市场营销” 女人的妙喻和爱情“名人名言” 爆笑网语议女人 假如女人是本书 太太试衣服,太太不在家 女人的身材都用什么形容? 碰到这样的你就说“那一定很贵” 看下都用什么比喻女人身材。 厉害的可怕的女人们 女人有关的经典笑话 世俗生活,调侃女人 女人千万不要去整容 
  157. ===============================================
  158. 股市证券(21)
  159. ===============================================
  160. 三国人物的炒股众生相 改编诗词名篇话股市 股市跌跌不休,动物们都不淡定了 名句改编侃股市 借动物巧说股市 炒股可把人害惨了 股市里的三国,三国里的股市 搞笑广告股市版 搞笑诗词话股市 七嘴八舌议炒股 古诗里的股市:大盘依旧在,几只股票红 动物也炒股。 股市暴跌下之抠门省钱秘笈 股市底部特征 股市里面伤心的幽默 经典的股市笑话 散户在指数拍卖会上 A股的九个特点 北京欢迎你之股市版 董卓请客(股市版) 令狐去股市迟到 
  161. ===============================================
  162. 传说(13)
  163. ===============================================
  164. 吝啬中的极品--吝啬村 武侠里面蹲马步的姿势看门派 纪晓岚和地狱里的工程师 七个最短的鬼故事,据说曾经有个人看完吓死了 一双会勾魂的眼睛 潘姓人家的讣闻 魔王与公主(很难看懂哦) 让人目瞪口呆~~请托好下巴,别掉地上了 嫦娥一号升空后各方反应 神奇的印第安老人 十二星座最“屌”的一句话 唐僧写给悟空的信 前世是谁埋的我 
  165. ===============================================
  166. 小笑话(9)
  167. ===============================================
  168. 和推销员逗乐与赌城售货机。 幽默笑话6个,笑翻你~ 关于辉腾的笑话 小笑话大全 80个包你笑翻天 三个社会小笑话 很搞的小笑话 8个经典小笑话 新发现的五个小笑话 三个小笑话 
  169. ===============================================
  170. 爆笑笑话(7)
  171. ===============================================
  172. 看懂的都是流()氓,看不懂的学学怎么变成流()氓。 一个人笑死了原因是看了这条笑话 5个经典小笑话 幽默笑话,经典幽默笑话8个,哈哈~~ 一句话经典笑话暴笑集合 十个暴笑口误 5个爆笑笑话 
  173. ===============================================
  174. 求爱秘籍(6)
  175. ===============================================
  176. 史上最有趣的男女关系"自然定律" 爱情经典对白 超级感动!对老婆应该这样说话 你说听过的最雷人的分手词 不信你不笑!我曾经追过的女孩子 情人节祝福短信,个人收藏78条经典情人节短信,情人... 
  177. ===============================================
  178. 英语(5)
  179. ===============================================
  180. 爆笑英语翻译中国的三字经 拼音字母也搞怪 美国笑话精选 爱情感人语句 37句中国式英语 
  181. ===============================================
  182. 原创(4)
  183. ===============================================
  184. 课堂幽默:摩擦力太小和关你屁事 我看港台三级片 史记·80后通史
复制代码

呵呵,还没有呢,因为你会发现有的分类下是有分页的,现在只是打出了第一页的内容。

示例4:处理分页

接下来呢,为了避免有人去直接抓取人家的网页,我会贴局部代码,但是不会贴完整的代码了。当然,你能根据局部代码,整出完整的,那说明你聪明过人,偶也没有办法了。
其实,一个页面里,可以添加多个Watcher。
比如说,在笑话列表页面,再增加一下Watcher类似下面这样:

  1. Watcher nextPage=new WatcherImpl();
  2. QuickNameFilter<HtmlNode> nextPageFilter = new QuickNameFilter<HtmlNode>();
  3. nextPageFilter.setNodeName("div");
  4. nextPageFilter.setIncludeAttribute("class","next_page");
  5. nextPage.setNodeFilter(nextPageFilter);
  6. nextPage.addProcessor(new NextPageProcessor());
  7. spider.addWatcher(nextPage);
复制代码

就可以把后续页面都抓住了,抓住之后怎么处理呢?有这么个类NextPageProcessor:

  1. public class NextPageProcessor implements Processor {
  2.     @Override
  3.     public void process(HtmlNode node) {
  4.         FastNameFilter<HtmlNode> filter = new FastNameFilter<HtmlNode>(node);
  5.         filter.setNodeName("a");
  6.         List<HtmlNode> aList = filter.findNodeList();
  7.         for (HtmlNode a : aList) {
  8.             if(a.getAttribute("href").startsWith("list")){
  9.                 JokejiTest.processUrl("http://www.jokeji.cn/"+a.getAttribute("href"));
  10.             }
  11.         }
  12.     }
  13. }
复制代码

就是把翻到的页找出来,执行同样的处理,就可以了。运行一下,乖乖,所有的分类及分类下的标题都打印出来了。

示例5:具体的笑话的抓取

具体的笑话抓取,代码片断不能贴了,只说原理。
访问一个页面,很简单的就可以找到内容的节点,并抓取内容出来。
在列表的位置里不是有个打印笑话标题的处理么,只要把href中的连接读出来,传递到具体的笑话抓取的部分,就可以完成整个笑话网站的内容抓取。至于抓取到数据之后你是打印一下就好还是存放数据库还是....想干啥干啥,那就是看你自己的了。


示例6:给TinySpider增加多线程处理

值得注意的是,如果要处理的网站有防爬虫机制,这样子很快会触发对方反应的。这里假设没有,仅讨论如何增加多线程处理模式。

  1. public class NextPageProcessor implements Processor {
  2.     @Override
  3.     public void process(HtmlNode node) {
  4.         FastNameFilter<HtmlNode> filter = new FastNameFilter<HtmlNode>(node);
  5.         filter.setNodeName("a");
  6.         List<HtmlNode> aList = filter.findNodeList();
  7.         for (HtmlNode a : aList) {
  8.             if(a.getAttribute("href").startsWith("list")){
  9.                 JokejiTest.processUrl("http://www.jokeji.cn/"+a.getAttribute("href"));
  10.             }
  11.         }
  12.     }
  13. }
复制代码

没有增加多线程处理的模式,是上面的这个样子。如何把它处理成多线程模式呢?SoEasy,首先增加一个对线程组的工程依赖。

  1. <dependency>
  2.     <groupId>org.tinygroup</groupId>
  3.     <artifactId>threadgroup</artifactId>
  4.     <version>${project.version}</version>
  5. </dependency>
复制代码

接下来,把上面的类重构成下面的样子。

  1. public class NextPageProcessor implements Processor {
  2.     @Override
  3.     public void process(HtmlNode node) {
  4.         FastNameFilter<HtmlNode> filter = new FastNameFilter<HtmlNode>(node);
  5.         filter.setNodeName("a");
  6.         List<HtmlNode> aList = filter.findNodeList();
  7.         MultiThreadProcessor processPages = new MultiThreadProcessor("DownPage");
  8.         for (HtmlNode a : aList) {
  9.             if(a.getAttribute("href").startsWith("list")){
  10.                 processPages.addProcessor(new PageProcessor("http://www.jokeji.cn/"+a.getAttribute("href")));
  11.             }
  12.         }
  13.         processPages.start();
  14.     }
  15.     class PageProcessor extends AbstractProcessor{
  16.         private final String url;
  17.         public PageProcessor(String url) {
  18.             super("PageProcessor");
  19.             this.url=url;
  20.         }
  21.         protected void action() throws Exception {
  22.             JokejiTest.processUrl(url);
  23.         }
  24.     }
  25. }
复制代码

运行一看,下载页面确实已经变成多线程的了。

示例7:TinySpider与分布式集成

Tiny框架有个特点,就是干啥的就是干啥的,比如示例6当中,解决多线程的,有个专门的线程组工程来解决,网络爬虫只专注于网络爬虫机制相关的内容。那么要做分布式,也是一样子,Tiny有个专门的分布式工程。引入就可以加入分布式机制。
要把单机的TinySpider变成分布式的,首先要解决的一个问题就是UrlRepository的问题,UrlRepository是避免URL被重复处理的机制,保存有所有已经处理过的URL列表。那可以用各种方式来写这个URL仓库,可以用数据库,可以用缓冲,或者其它复杂的手段来现。
接下来就如何进行分布式抓取了:
先来开发个工人:

  1. public class WorkerPage extends AbstractWorker {
  2.     private static final long serialVersionUID = 5873591269002335547L;
  3.     public <span></span>WorkerPage<span></span>() throws RemoteException {
  4.         super("page");
  5.     }
  6.     public Warehouse doWork(Work work) throws RemoteException {
  7.         List<String>urls=work.getInputWarehouse().get("urls")
  8.         for (String url:urls) {
  9.             JokejiTest.processUrl(url);
  10.         }
  11.         return null;
  12.     }
  13. }
复制代码

工人从输入仓库里拿出url列表,然后循环处理之。
然后要实现一个任务分解器:

  1. public class UrlSplitter implements WorkSplitter {
  2.     private static final long serialVersionUID = 551260312611646323L;
  3.     public List<Warehouse> split(Work work, List<Worker> workers) throws RemoteException {
  4.         List<Warehouse> list = new ArrayList<Warehouse>();
  5.         List<String>urls=work.getInputWarehouse().get("urls");
  6.         long start = 0;
  7.         long end = urls.size()-1;;
  8.         long count = urls.size();
  9.         long step = count / workers.size();
  10.         for (int i = 0; i < workers.size(); i++) {
  11.             Warehouse subInputWarehouse = new WarehouseDefault();
  12.             int e=0;
  13.             if (i == workers.size() - 1) {
  14.                 e=end;
  15.             } else {
  16.                 e= step * (i + 1);
  17.             }
  18.             subInputWarehouse.put("urls", urls.subList(step * i + start,e);
  19.             list.add(subInputWarehouse);
  20.         }
  21.         return list;
  22.     }
  23. }
复制代码

上面的任务就根据工人数据对要处理的url进行分解,分解成多个仓库。
接下来就是构建主任务中心了:

  1. public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
  2.     JobCenter jobCenter = new JobCenterLocal();
  3.     JobCenter center = new JobCenterRemote();
  4.     for (int i = 0; i < 5; i++) {
  5.         center.registerWorker(new WorkerPage());
  6.     }
  7.     Foreman pageForeman = new ForemanSelectAllWorker("page", new PageSplitter());
  8.     center.registerForeman(pageForeman);
  9. }
复制代码

当然也可以在很多台计算机上都增加工人进来:

  1. public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
  2.     JobCenter jobCenter = new JobCenterRemote();
  3.     JobCenter center = new JobCenterRemote();
  4.     for (int i = 0; i < 5; i++) {
  5.         center.registerWorker(new WorkerPage());
  6.     }
  7. }
复制代码

注意,上面的代码不同之处,在于一个是 JobCenterLocal和JobCenterRemote,Local相当于服务器,Remote相当于客户端,因此,只能有一个Local,可以有多个Remote。
上面把分布式的工作做好准备了,接下来进行分布式调用:
还是修改PrintJokejiProcessor 

  1. public class PrintJokejiProcessor implements Processor {
  2.     public void process(HtmlNode node) {
  3.         FastNameFilter<HtmlNode> filter = new FastNameFilter<HtmlNode>(node);
  4.         filter.setNodeName("a");
  5.         List<HtmlNode> aList = filter.findNodeList();
  6.         List<String>urls=new ArrayList<String>();
  7.         for (HtmlNode a : aList) {
  8.             urls.add("http://www.jokeji.cn/"+a.getAttribute("href"));
  9.         }
  10.         Warehouse inputWarehouse = new WarehouseDefault();
  11.         Work work = new WorkDefault("page", inputWarehouse);
  12.         inputWarehouse.put("urls",urls);
  13.         Warehouse outputWarehouse = center.doWork(work);
  14.         JobCenter center = new JobCenterRemote();
  15.         center.doWork(work);
  16.     }
  17. }
复制代码

如此,就可以通过N台机器来共同完成页面抓取了。
相对前面的例子,确实用分布式,内容要多一些,但是应该还好了,代码行不多,只是概念多了一点,因此要去学习分布式计算相关的知识了:
http://my.oschina.net/tinyframework/blog/196486
http://my.oschina.net/tinyframework/blog/196373

结尾

上面的类名,方法名,变量名都是随便取的,重构之。一个完整的网站内容抓取就算完工了。最后统计了一下源代码,不到200行。import语句比真正干活的代码还多,真正干活的在方法中的语句也就100行左右。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页