用TinySpider进行网页抓取实例OSCHINA

首先在笑话分类中看到个爆笑男女,呵呵,先拿它小试一下,看看是否有效果。

首先编写一个main方法,内容如下:

首先构建一个爬虫,字符集是GBK,然后建立一个Watcher,Watcher用于在抓取的内容中,进行数据过滤。

如果过滤到内容呢,就执行PrintJokejiProcessor处理器进行处理。

OK主程序就写完了,上面有个类PrintJokejiProcessor也是需要自己写的,内容如下:

publicclassPrintJokejiProcessorimplementsProcessor{publicvoidprocess(HtmlNodenode){FastNameFilterfilter=newFastNameFilter(node);filter.setNodeName("a");ListaList=filter.findNodeList();for(HtmlNodea:aList){System.out.println(a.getContent());}}}这个类的意思是,node就是上面说的包含list_title属性的div,然后从其里面找到所有属性名是a的节点,并打印其内容。

运行之,运行结果如下:

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

先先Main方法

publicclassPrintJokejiCategoryProcessorimplementsProcessor{publicvoidprocess(HtmlNodenode){System.out.println(node.getContent());}}下面是运行结果:

这里就简单的处理一下,把上面的两个类小改一下:

JokejiTest类的main方法修改成静态方法processUrl,然后把下面的处理的URL变成参数传入

publicclassJokejiTest{publicstaticvoidprocessUrl(Stringurl){Spiderspider=newSpiderImpl("GBK");Watcherwatcher=newWatcherImpl();watcher.addProcessor(newPrintJokejiProcessor());QuickNameFilternodeFilter=newQuickNameFilter();nodeFilter.setNodeName("div");nodeFilter.setIncludeAttribute("class","list_title");watcher.setNodeFilter(nodeFilter);spider.addWatcher(watcher);spider.processUrl(url);}}PrintJokejiCategoryProcessor类改成下面的样子

下面是调整之后的运行结果:

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

接下来呢,为了避免有人去直接抓取人家的网页,我会贴局部代码,但是不会贴完整的代码了。当然,你能根据局部代码,整出完整的,那说明你聪明过人,偶也没有办法了。

其实,一个页面里,可以添加多个Watcher。

比如说,在笑话列表页面,再增加一下Watcher类似下面这样:

WatchernextPage=newWatcherImpl();QuickNameFilternextPageFilter=newQuickNameFilter();nextPageFilter.setNodeName("div");nextPageFilter.setIncludeAttribute("class","next_page");nextPage.setNodeFilter(nextPageFilter);nextPage.addProcessor(newNextPageProcessor());spider.addWatcher(nextPage);就可以把后续页面都抓住了,抓住之后怎么处理呢?有这么个类NextPageProcessor:

具体的笑话抓取,代码片断不能贴了,只说原理。

访问一个页面,很简单的就可以找到内容的节点,并抓取内容出来。

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

org.tinygroupthreadgroup${project.version}接下来,把上面的类重构成下面的样子。

要把单机的TinySpider变成分布式的,首先要解决的一个问题就是UrlRepository的问题,UrlRepository是避免URL被重复处理的机制,保存有所有已经处理过的URL列表。那可以用各种方式来写这个URL仓库,可以用数据库,可以用缓冲,或者其它复杂的手段来现。

接下来就如何进行分布式抓取了:

先来开发个工人:

publicclassWorkerPageextendsAbstractWorker{privatestaticfinallongserialVersionUID=5873591269002335547L;publicWorkerPage()throwsRemoteException{super("page");}publicWarehousedoWork(Workwork)throwsRemoteException{Listurls=work.getInputWarehouse().get("urls")for(Stringurl:urls){JokejiTest.processUrl(url);}returnnull;}}工人从输入仓库里拿出url列表,然后循环处理之。

然后要实现一个任务分解器:

publicclassUrlSplitterimplementsWorkSplitter{privatestaticfinallongserialVersionUID=551260312611646323L;publicListsplit(Workwork,Listworkers)throwsRemoteException{Listlist=newArrayList();Listurls=work.getInputWarehouse().get("urls");longstart=0;longend=urls.size()-1;;longcount=urls.size();longstep=count/workers.size();for(inti=0;i

接下来就是构建主任务中心了:

publicstaticvoidmain(String[]args)throwsIOException,ClassNotFoundException,InterruptedException{JobCenterjobCenter=newJobCenterLocal();JobCentercenter=newJobCenterRemote();for(inti=0;i<5;i++){center.registerWorker(newWorkerPage());}ForemanpageForeman=newForemanSelectAllWorker("page",newPageSplitter());center.registerForeman(pageForeman);}当然也可以在很多台计算机上都增加工人进来:

publicstaticvoidmain(String[]args)throwsIOException,ClassNotFoundException,InterruptedException{JobCenterjobCenter=newJobCenterRemote();JobCentercenter=newJobCenterRemote();for(inti=0;i<5;i++){center.registerWorker(newWorkerPage());}}注意,上面的代码不同之处,在于一个是JobCenterLocal和JobCenterRemote,Local相当于服务器,Remote相当于客户端,因此,只能有一个Local,可以有多个Remote。上面把分布式的工作做好准备了,接下来进行分布式调用:

还是修改PrintJokejiProcessor

如此,就可以通过N台机器来共同完成页面抓取了。

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

THE END
1.情感共鸣:10句直击人心触动万千婚姻的台词婚姻与生活无论遇到什么风雨,我们都要携手同行。当我们风雨同舟时,我们的婚姻才会历久弥新。 这10句台词只是婚姻中众多经典台词的冰山一角。它们蕴含着婚姻的真理和智慧。当我们用心体会这些台词时,它们可以帮助我们更好的理解和经营自己的婚姻。https://www.diyihun.com/baike/23030.html
2.婚姻爱情婚姻家庭是爱情的城堡,因为爱情结合在一起的两个人,是幸福快乐的,也是婚姻能长久的基础。也是两个人对待爱情的诚意,不以结婚为目的谈恋爱都是耍流氓。这句话听起来好像很难听,却是事实。 真心实意的爱情,都想要给对方安全感,给彼此一个承诺,希望把最好的都给彼此,想长长久久的在一起,一起成长,一起奋斗成就https://www.jianshu.com/p/9ad5ac25d80b
3.最好的婚姻,不叫搭伙,而是余生!会泽千里缘婚恋,我们的口号是:让天下没有难配的婚姻!我们的会员来自各行各业,有医生、护士、教师、公务员、律师、技术人员、军人、企业老板、公司白领、个体户等。心心相印特色服务是 :通过个人性格分析可了解性格特点和差异,个人性格的软肋与局限,扫描探究自我和他人内心https://mp.weixin.qq.com/s?__biz=MzIwODU3NDY5MA==&mid=2247548095&idx=2&sn=b1d0defa8cd50476c94de3e4e33b5e54&chksm=9656929770504aefe67ee7a4bd9be8a284ac258062aff0cf45039a5569a55c6095773c63fd62&scene=27
4.非诚勿扰2经典语句生日感言的经典语句网络文章非诚勿扰经典语录 非诚勿扰经典语录 有意者电联,非诚勿扰。旁白:二十一世纪什么最贵?和谐 范先生:你https://bbs.openke.cn/thread-294964-1-1.html
5.面对爱情的做法测试题(精选11篇)篇4:理智面对爱情的经典语录 2 对于喜欢和你对着干的人,首先要客观的反省自己,改正自己,消除自己的原因。其次,看清楚她是多么幼稚,让她一个人不开心好了。 3 对待恋人要信任,要不就别把他当恋人。 4 男生不要轻易说出与承诺有关的话,女生不要轻易做需要别人承诺或负责的事。学会在某种程度上,保护好自己。https://www.360wenmi.com/f/filemk336u6e.html
6.婚后感言范文11篇(全文)有关婚后感言的精彩说说 1. 不重视婚姻的女人是个婚姻问题,太重视婚姻的女人是个婚姻难题。 2. 一个人真的遇见爱情,恐怕还是要结婚的。婚姻应该是爱情的自然的归宿。爱情是双方相互理解、相互欣赏、相互交融的过程。爱情达到这样一个程度,就需要婚姻这个形式。婚姻家庭既是物质的承载,也是心灵的港湾。它给你提供了https://www.99xueshu.com/w/file3a8equvo.html
7.结婚十年怎么发朋友圈十年风雨夫妻语录经典接亲网以上就是小编为你带来的“结婚十年怎么发朋友圈 十年风雨夫妻语录经典”的全部内容啦。相恋不易,相守更是难得,十年相濡以沫,如此情深定当不负。曾经心心念念的人,此刻就在身边;曾经互相奔赴的人,此刻就在眼前;曾经拼命追逐的人,此刻正与你手牵手、肩并肩。此缘,当珍惜;此情,当感激;此人,当珍爱。https://www.jieqinwang.com/baike/50517
8.世上最经典的婚姻爱情感言情如鱼水是夫妻双方最高的追求,但是我们都容易犯一个错误,即总认为自己是水,而对方是鱼。——BBS经典语录 吃胃能消化的食物,娶自己能养活的女人。——一男人长寿的秘诀 夫妻俩过日子要像一双筷子: 一是谁也离不开谁; 二是什么酸甜苦辣都能在一起尝。——这种筷子只能是经久耐磨的象牙筷,而不是一次性方便筷http://www.360doc.com/content/06/1025/17/8921_240054.shtml
9.形容风景好的叠词1、流水潺潺形容溪水、泉水等流动的声音或是形容水缓缓流动的样子。 2、流水涓涓形容细水缓缓流动的样子。 3、生机勃勃形容生命力旺盛的样子。 4、郁郁葱葱形容草木苍翠茂盛,气势美好蓬勃,生机勃勃的样子。 5、波光粼粼形容水石明净,指水波被阳光照射到的样子。 6、流水淙淙形容流水的声音且水很干净。花https://m.edu.iask.sina.com.cn/jy/2xSXzu0DPFT.html
10.张冲:莎翁活在今天,凭语言便夺网红之冠嘉宾新著先睹51【编辑感言】 歌德这样评价莎士比亚:我见到他的第一页,就使我的一生都属于他了。作者张冲曾做客文汇讲堂,对于莎士比亚借鉴各种传说、神话整合为自己的创新,机智幽默的台词,巧妙的戏剧结构,隐含的超前观念都给予了诠释,而这本不厚的书里,以戏说戏的方式,一一解构,并且时常以现代的情形做比方,对于语言着重肯定了妙趣http://wenhui.whb.cn/zhuzhan/jtxw/20191120/304121.html
11.《欢迎光临》经典台词(三十七集全)(欢迎光临)剧评【第一集 】光正偶遇女神,三人搬进合租房。1、张光正旁白:员工宿舍,地下一层。冬天吹进塞北的风,夏天还有江南的雨。在这片号称薯片敞口随便吃、,永远不用担心变软的干燥城市里,这简直就是一片潮人胜地。2、张光正、陈精典、王牛郎三人在五星级酒店附近看房中介:晴天沐浴紫外线,雨天瀑布窗外悬。一居室五千一个月https://movie.douban.com/review/14444346/