用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.管理式华为账号账户管理鲸鸿动能广告(中国大陆地区)游戏 教育 金融 房地产 短视频&新闻资讯 社交&婚恋&网络直播 在线阅读&短剧行业 食品酒水 医疗健康 工具软件 盲盒 通讯行业 生活美容 招商加盟 素材规范建议 素材尺寸要求 灵眸开屏广告素材制作指导 灵妙3D IP广告素材制作指导 鲸鸿动能投放违规管理规范 https://developer.huawei.com/consumer/cn/doc/promotion/ads_glszh01-0000001321238810
2.中国最有料的34个野史秘闻16幸福很简单林语堂和廖翠凤婚后商量说:“结婚证书只有在离婚时才有用,我们烧掉它吧,今后用不着它的。”一根火柴将结婚证书烧掉了。此后俩人果然相守了一生。他说幸福很简单:一是睡在自家的床上;二是吃父母做的饭菜;三是听爱人给你说情话;四是跟孩子做游戏。 https://www.meipian.cn/2jp8pin6
3.新闻加点料现在年轻人都是“主动”单身的?中工民生最近调查显示,中日韩三国越来越多人主动选择“无婚恋”的独居,而且这类人对这种生活方式的满意度呈上升趋势。统计显示,中国2018年第一季度的结婚率比5年前骤降30%。不少年轻人表示,不介意晚婚,甚至“一直单下去”。 网友A:我以为都和我一样是“被”单身的呢,更扎心了 https://www.workercn.cn/32851/201810/09/181009192742222.shtml
4.国际在线国际在线(www.cri.cn)是由中央广播电视总台主办的中央重点新闻网站,通过44种语言(不含广客闽潮4种方言)对全球进行传播,是中国使用语种最多、传播地域最广、影响人群最大的多应用、多终端网站集群。国际在线依托中央广播电视总台广泛的资讯渠道和媒体资源,在全球拥有40多个http://cri.cn/
5.可以谈恋爱结婚生子的游戏有哪些2023支持结婚生子手游合集随着游戏的发展,现在玩家除了在网上聊天谈恋爱外,还能结婚生子,今天为大家带来可以谈恋爱结婚生子的游戏有哪些2023 的游戏介绍,这类游戏中,玩家可以和我们伴侣在好友和路人见证和祝福下结婚,也可以生一个小宝宝,是不是很期待,那话不多说一起看看有哪些支持结婚生子的手游合集吧。 https://a.9game.cn/news/8063326.html
6.ID.3KPL选手定制款公益拍卖高燃举办上汽大众宠粉上热搜11 月 27 日,ID.3 KPL选手定制款公益拍卖晚会登陆上海宇宙电竞中心,四位“顶流玩家”一诺、Cat、暖阳、钎城化身ID.3公益大使,携全球限定的「ID.3 KPL选手定制款」到场与粉丝互动,支持荒漠化防治公益事业。当晚的公益拍卖活动得到粉丝热烈响应,共筹得超百万善款,该话题还一举冲入微博全站、汽车、游戏等板块热搜词条https://www.toutiao.com/article/7442597910467985960/
7.可爱的情侣名网络游戏情侣名接亲网[28]、回忆、格式化 回忆、删除式 [29]、你好可爱 嘘!小声点 [30]、她叫我疯子〃 他叫我傻子〃 二、网络游戏情侣名 衬人心欢 | 衬己心酸 生死相随 | 至死不渝 別自做多情 | 別自認為事 一生想拥有你 | 不想再失去你 灬茶清味 | 灬花清香 https://www.jieqinwang.com/baike/93129
8.暑期档综艺前瞻丨走出至暗时刻,爆款呼之欲出优酷王牌综艺《这!就是街舞》第五季将在暑期正式回归,舞蹈类综艺《了不起!舞社》、喜剧竞技真人秀《即兴喜剧大联盟》、全新游戏社交剧综《石头剪刀布》、全新潮流电音综艺《超感星电音》、寻味好友真言秀《我想和你吃顿饭》、情感关系真人秀《恋爱吧夏天》、婚恋情感真人秀《机智的婚姻生活》以及检察官职业纪实真人http://www.360doc.com/content/22/0620/16/74060417_1036756950.shtml
9.积目怎么搜索id积目能用id搜索吗通过ID搜索,我们可以快速找到自己的好友,也可以更加方便的添加陌生朋友。那么在积目APP中该如何使用ID来进行搜索呢?下面小编为大家带来了相关介绍,我们一起来了解下。 积目怎么搜索id? 积目现在暂时无单独搜索用户功能,所以无法通过ID来搜索其他用户。 积目是北京蓝莓时节科技有限公司旗下一款社交APP,国内垂直于90-https://app.3dmgame.com/gl/167244.html
10.凤凰网“我从中国的发展历程中读懂这个国家” 哈萨克斯坦患儿妈妈用中文写信感谢新疆医护人员 60秒带你看澳门地标建筑 重庆市委书记和骑手交谈,询问订单数、月收入 李钺锋被逮捕!曾大搞新型腐败、隐性腐败 现场视频:菲律宾船只恶意擦碰中国海警船 春节申遗成功! 安徽巢湖市博物馆数件文物发霉,密集分布白斑(图) https://www.ifeng.com/
11.聊聊聊聊网(原聊聊语音聊天网)是中国最早的专业语音视频聊天交友服务网站。真实聊天,约会交友,聊聊成为全球华人专业在线视频聊天择偶领域的第一品牌。 聊聊for iPhone 是一款非常时尚流行的语音聊天应用,让你的声音同时影响数千人;麦霸、mc喊麦的专属语音平台。 婚恋、交友、K歌、娱乐、游戏、闹嗑等线上活动正在各房间全天https://apps.apple.com/pt/app/%E8%81%8A%E8%81%8A-%E8%AF%AD%E9%9F%B3%E8%A7%86%E9%A2%91%E8%81%8A%E5%A4%A9%E4%BA%A4%E5%8F%8B%E5%B9%B3%E5%8F%B0/id519635322
12.OELOVE婚恋交友系统v3.5.rar资源OElove主要为满足企业及个人创业者对婚恋交友类网站的自定义快速搭建需求,OELove交友网站系统基于PHP Mysql开发的一套专业级本地化运营的婚恋、主题类交友系统,拥有交友、婚恋、微博、互动、心理测试等基础功能,运营者可直接运作也可以在此版本上进行二次开发模块及功能订制。 OElove 婚恋交友网站系统简介 OElove(中国https://download.csdn.net/download/weixin_38743506/11636270
13.领导留言板关于整顿婚恋机构和婚恋服务市场的建议 已办理 用户8***4留言ID:19155599 2023-10-30 14:50 淄博市团委组织公益相亲会是为了给在淄博就业的单身青年男女解决婚恋交友问题,绝大多数单身青年不喜欢政府部门联合婚介所组织的这种以游戏环节为主的相亲会。因为婚介所毕竟是以营利为目的,在报名政府部门公益相亲会的过程中http://liuyan.people.com.cn/threads/list?fid=1106