您的位置:首页 > 编程语言 > Java开发

WebMagic Java 爬虫的简单应用

2015-04-14 16:34 357 查看
前段时间做旅游本体的知识库,我和老师反应说景点之间关系太少了,导致整个图很稀疏。。

“你去wiki上抓一批数据吧”,就这样被自己坑了。

由于一直在用java做项目,ZWQ师兄推荐的是selenium,这个我想说真的很强大,还支持JS渲染,不过当我看到这篇的时候,我决定学一下WebMagic。

项目中文文档地址:http://webmagic.io/docs/zh/

这个项目很容易上手,只要把架包导进来,简单的爬虫只要实现PageProcessor类接可以了。

public void process(Page page) {

if(page.getHtml().toString().contains("消歧")){
//System.out.println("1" + page.getUrl().toString());
Document doc = Jsoup.parse(page.getHtml().toString());
Element ele = doc.select("div.mw-content-ltr").first();
Element ul = ele.getElementsByTag("ul").first();
page.putField("addr", ul.text());

System.out.println("1:" + cntx ++);
}

//else if(page.getHtml().xpath("//div[@id='noarticletext']/p/b/text()") != null && page.getHtml().xpath("//div[@id='noarticletext']/p/b/text()").toString().contains("没有")){
else if (page.getHtml().toString().contains("维基百科目前还没有与上述标题相同的条目")){
System.out.println("2" + page.getUrl().toString());
System.out.println("2:" + cnty ++);
}
else {

String th = "";
String td = "";
String test = "";
//System.out.println("3" + page.getUrl().toString());
Document doc = Jsoup.parse(page.getHtml().toString());
Element ele = doc.select("div.mw-content-ltr").first();

Element tbody = ele.getElementsByClass("infobox").first().getElementsByTag("tbody").first();

for(int i = 1;i < 15;i ++){
//th = page.getHtml().xpath("//table[@class=infobox]/tbody/tr[" + i + "]/th//text()").toString();
//td = page.getHtml().xpath("//table[@class=infobox]/tbody/tr[" + i + "]/td//text()").toString();
if(tbody.children().size() <= i)break;
Element thx = tbody.child(i).child(0);
th = thx.text();
//System.out.println(tbody);
if(tbody.child(i).children().size() > 1){
Element tdx = tbody.child(i).child(1);
td = tdx.text();
//System.out.println(thx.text());
}
if(th != null && td != null && th != "" && td != ""){

//page.putField(th, td);
//test += th + ":" + td + "\n";
page.putField(th, td);
//System.out.println(th + ":" + td);

}
//System.out.println("done");
th = "";td = "";
}

//writer.write(th + ":" + td + "\n");

System.out.println("3:" + cnt ++);
}


消歧页面我就简单判断此页面包不包含消歧,没有词条的。。。

这里只抓词条页的infobox里面的值,生成键值对。消歧页把所有地址都抓下来。

想用Xpath获得节点的值,可每个页面都不尽相同,询问HBQ师兄给出了用Jsoup的建议,发现真的很好用。

需要注意的事Element的child方法,如果i超过chrildensize的话会出错,因为这个问题好多页面虽然抓到了但没保存本地,我估计错误被PageProcessor接收了,没扔出来。

最终去抓的旅游景点有23743个,wiki上有消歧页的有651个,有词条页的有2264个

消歧页的结果是这样的:

url:    http://zh.wikipedia.org/zh-cn/剑山 addr:    山名: 剑山 (台湾),台湾百岳之一 剑山 (大连),位于中国大连的山峰 剑山 (德岛县),位于日本德岛县,日本百名山之一 剑山 (北海道上川支厅),位于日本北海道上川郡下川町 剑山 (北海道十胜支厅),位于日本北海道上川郡清水町与河西郡芽室町边界 剑山 (青森县),位于日本青森县陆奥市 剑山 (东京都),位于日本东京都小笠原村 剑山 (兵库县),位于日本兵库县西宫市 剑山 (冈山市),位于日本冈山县冈山市 剑山 (新见市),位于日本冈山县新见市 剑山 (奈义町),位于日本冈山县胜田郡奈义町 剑山 (爱媛县),位于日本爱媛县西条市 剑山 (横滨市),日本神奈川县横滨市青叶区之地名 剑山 (插花),东亚传统插花工具 剑山 (列车),日本JR四国营运的特急列车 剑山 (小行星),小行星带中一颗小行星 剑山 (歌曲),日本歌手北山毅主唱的歌曲


有词条页面的infobox结果是这样的:

url: http://zh.wikipedia.org/zh-cn/厦门大学 校训:	自强不息·止于至善
创建时间:	1921年 中华民国十年
学校类型:	私立(1921年至1937年) 公立(1937年至今)
校长:	朱崇实
职工:	2,431人
学生:	38,211人
校址:	 中国福建省厦门市 本部:思明区思明南路422号 海韵校区:思明区曾厝埯西路 翔安校区:翔安区翔安南路  中国福建省漳州市 漳州校区:龙海市南滨大道300号  马来西亚分校 吉隆坡在建 2015年招生
校区:	市区(本部、海韵校区) 城乡(漳州校区、翔安校区) 海外(马来西亚分校)
总面积:	7868亩(524.5公顷)
电话:	+86-592-2181579
代表色:	蓝 白
加入机构:	中华人民共和国教育部
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: