本文导读
- 本文是《WebCollector 自动探测 URL 地址》、《 WebCollector 页面附件信息 metaData 与 MatchType》内容的延续与扩展
- 《WebCollector 自动探测 URL 地址》自动探测 URL 适合整个网站中大面积的内容爬取,对于网站中小部分的精确爬取手动探测 URL 更加适合
- 《 WebCollector 页面附件信息 metaData 与 MatchType》已经有了手动探测的例子,本文是对它的扩展与深入理解
- 本文是对 webCollector 官网例子 DemoTypeCrawler 的扩展,cn.edu.hfut.dmic.webcollector.example.DemoTypeCrawler。
新浪新闻-要闻
需求分析
- 爬取 新闻新闻 首页中的要闻头条部分,仍然获取文章的 标题、发布时间、正文内容、正文中的图片地址
列表页
- 如下所示为 页面右击 "查看页面源码" 的要闻 部分源码,重点是要能找出它的超链接选择器,显然使用 "div#syncad_1 a" 即可获取
<div class="ct_t_01" id="syncad_1" data-sudaclick="yaowen" style="padding-bottom: 3px;overflow: hidden;">
<h1 data-client="headline"><a target="_blank" href="http://news.sina.com.cn/c/xl/2018-08-17/doc-ihhvciiw5684240.shtml">习近平对首个“中国医师节”作出重要指示</a></h1><h1 data-client="headline"><a target="_blank" href="http://news.sina.com.cn/c/xl/2018-08-16/doc-ihhvciiw0972788.shtml">十九届中央委员中 他是首个被处理的</a></h1>
<p data-client="throw">[<a target="_blank" href="http://news.sina.com.cn/c/2018-08-16/doc-ihhvciiw0724604.shtml">处理7部级1人被立案</a> <a target="_blank" href="http://news.sina.com.cn/zx/2018-08-16/doc-ihhvciiw0560915.shtml">没收长生违法所得</a> <a target="_blank" href="http://news.sina.com.cn/c/2018-08-17/doc-ihhvciiw2136053.shtml">吉林处理13名领导干部</a>]</p><p data-client="throw">[<a target="_blank" href="http://news.sina.com.cn/c/2018-08-17/doc-ihhvciiw3111773.shtml">吉林省委连夜开会:坚决拥护中央决定</a> <a target="_blank" href="http://news.sina.com.cn/c/2018-08-16/doc-ihhvciiw1469324.shtml">责令辞职引咎辞职啥区分</a>]</p>
<h1 data-client="headline"><a target="_blank" href="http://mil.news.sina.com.cn/china/2018-08-17/doc-ihhvciiw4482719.shtml">美报告称中国为武统台湾作准备:阻美军介入</a></h1>
<p data-client="throw">[<a target="_blank" href="http://news.sina.com.cn/w/2018-08-17/doc-ihhvciiw4401010.shtml">若美国干预 寻求最短时间取胜</a> <a target="_blank" href="http://news.sina.com.cn/c/2018-08-17/doc-ihhvciiw4566082.shtml">称中国可能正训练打击美国目标</a>]</p>
<h1 data-client="headline"><a target="_blank" href="http://news.sina.com.cn/c/2018-08-17/doc-ihhvciiw4197115.shtml">被指抄袭的红芯浏览器致歉:宣传夸大</a></h1>
<p data-client="throw">[<a target="_blank" href="http://news.sina.com.cn/c/2018-08-17/doc-ihhvciiw4197115.shtml">红芯:不应特别强调国产自主</a> <a target="_blank" href="http://news.sina.com.cn/c/2018-08-17/doc-ihhvciiw2083022.shtml">创始人履历造假</a> <a target="_blank" href="http://news.sina.com.cn/s/2018-08-17/doc-ihhvciiw3787966.shtml">回应业内不买账</a>]</p>
</div>
内容页
代码爬取
package com.lct.webCollector;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.plugin.ram.RamCrawler;
import com.lct.util.SystemUtils;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* WebCollector 2.40新特性 page.matchType
* 在添加CrawlDatum时(添加种子、或在抓取时向next中添加任务),
* 可以为CrawlDatum设置type信息
* <p/>
* type的本质也是meta信息,为CrawlDatum的附加信息
* 在添加种子或向next中添加任务时,设置type信息可以简化爬虫的开发
* <p/>
* 例如在处理列表页时,爬虫解析出内容页的链接,在将内容页链接作为后续任务
* 将next中添加时,可设置其type信息为content(可自定义),在后续抓取中,
* 通过page.matchType("content")就可判断正在解析的页面是否为内容页
* <p/>
* 设置type的方法主要有3种:
* 1)添加种子时,addSeed(url,type)
* 2)向next中添加后续任务时:next.add(url,type)或next.add(links,type)
* 3)在定义CrawlDatum时:crawlDatum.type(type)
*
* @author hu
*/
public class MyTypeCrawler extends RamCrawler {
@Override
public void visit(Page page, CrawlDatums next) {
/**
* 除非是 CrawlDatum 显示指定的 meta ,否则 page.meta 是取不到值的
* page.matchType 才能获取隐士的 meta 的 type 值
* 所以 page.meta("type") 的值 会为 null,写出来为的是 以示提醒
*/
String type = page.meta("type");
String url = page.url();
System.out.println("当前页面类型:" + type + " >>> 页面地址:" + url);
if (page.matchType("tagList")) {
/**
* 当是列表页时,获取其中的内容页地址,同时为地址设置 MetaData(元信息)
*/
next.addAndReturn(page.links("div#syncad_1 a")).type("content");
} else if (page.matchType("content")) {
/**
* 当前页面是内容页时,直接获取内容
* 这里选择通过选择器的方式进行获取,也可以使用 ContentExtractor 内容快速提取
* selectText 方法底层就是 select(cssSelector).first().text()
* text() 方法会获取当前元素中的文本内容,无论嵌套在当前元素下多少级,都会获取
* 这些选择器
*/
String title = page.selectText("h1.main-title");
String dataStr = page.selectText("span.date");
String content = page.select("div#article").first().text();
System.out.println("\t正文标题:" + title);
Date date = SystemUtils.parseDateStr(dataStr);
if (date != null) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("发布时间:" + dateFormat.format(date));
} else {
System.out.println("发布时间:null");
}
Elements imgElements = page.select("div#article img");
for (Element element : imgElements) {
System.out.println(">>>>>图片地址:" + element.attr("src"));
}
System.out.println("正文内容:" + content);
}
}
public static void main(String[] args) throws Exception {
MyTypeCrawler myTypeCrawler = new MyTypeCrawler();
myTypeCrawler.addSeed("https://news.sina.com.cn/", "tagList");
/**
* 设置是否自动抽取符合正则的链接并加入后续任务
* autoParse 默认为 true,即使没有指明为false,只要未设置 url 正则表达式,同样不会自动探测
* 设置线程数为 30
*/
myTypeCrawler.setAutoParse(false);
myTypeCrawler.setThreads(30);
/**
* 千万要记得设置爬取的层级深度,否则默认为 start(Integer.MAX_VALUE);
*/
myTypeCrawler.start(2);
}
}
爬取结果
2018-08-17 16:06:31 INFO cn.edu.hfut.dmic.webcollector.crawler.Crawler - start depth 1
2018-08-17 16:06:31 INFO cn.edu.hfut.dmic.webcollector.crawldb.DBManager - start merge
2018-08-17 16:06:31 INFO cn.edu.hfut.dmic.webcollector.crawldb.DBManager - merge fetch database
2018-08-17 16:06:31 INFO cn.edu.hfut.dmic.webcollector.crawldb.DBManager - merge link database
2018-08-17 16:06:31 INFO cn.edu.hfut.dmic.webcollector.crawldb.DBManager - end merge
2018-08-17 16:06:31 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - init segmentWriter:cn.edu.hfut.dmic.webcollector.plugin.ram.RamDBManager
2018-08-17 16:06:31 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - create generator:cn.edu.hfut.dmic.webcollector.plugin.ram.RamGenerator
2018-08-17 16:06:31 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - use generatorFilter:cn.edu.hfut.dmic.webcollector.crawldb.StatusGeneratorFilter
当前页面类型:null >>> 页面地址:https://news.sina.com.cn/
2018-08-17 16:06:32 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - done: [200] Key: https://news.sina.com.cn/ (URL: https://news.sina.com.cn/)
2018-08-17 16:06:32 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - -activeThreads=0, spinWaiting=0, fetchQueue.size=0
2018-08-17 16:06:32 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - clear all activeThread
2018-08-17 16:06:32 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - close generator:cn.edu.hfut.dmic.webcollector.plugin.ram.RamGenerator
2018-08-17 16:06:32 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - close segmentWriter:cn.edu.hfut.dmic.webcollector.plugin.ram.RamDBManager
2018-08-17 16:06:32 INFO cn.edu.hfut.dmic.webcollector.crawler.Crawler - depth 1 finish:
total urls: 1
total time: 1 seconds
2018-08-17 16:06:32 INFO cn.edu.hfut.dmic.webcollector.crawler.Crawler - start depth 2
2018-08-17 16:06:32 INFO cn.edu.hfut.dmic.webcollector.crawldb.DBManager - start merge
2018-08-17 16:06:32 INFO cn.edu.hfut.dmic.webcollector.crawldb.DBManager - merge fetch database
2018-08-17 16:06:32 INFO cn.edu.hfut.dmic.webcollector.crawldb.DBManager - merge link database
2018-08-17 16:06:32 INFO cn.edu.hfut.dmic.webcollector.crawldb.DBManager - end merge
2018-08-17 16:06:32 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - init segmentWriter:cn.edu.hfut.dmic.webcollector.plugin.ram.RamDBManager
2018-08-17 16:06:32 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - create generator:cn.edu.hfut.dmic.webcollector.plugin.ram.RamGenerator
2018-08-17 16:06:32 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - use generatorFilter:cn.edu.hfut.dmic.webcollector.crawldb.StatusGeneratorFilter
当前页面类型:null >>> 页面地址:http://news.sina.com.cn/c/xl/2018-08-16/doc-ihhvciiw0972788.shtml
当前页面类型:null >>> 页面地址:http://news.sina.com.cn/c/2018-08-17/doc-ihhvciiw2083022.shtml
正文标题:十九届中央委员中 他是首个被处理的
正文标题:号称站巨人肩膀上创新的浏览器 创始人履历也造假
当前页面类型:null >>> 页面地址:http://news.sina.com.cn/c/zj/2018-08-17/doc-ihhvciiw6668542.shtml
正文标题:红芯仅仅“披了一层皮” 为何能吸引2.5亿融资?
当前页面类型:null >>> 页面地址:http://news.sina.com.cn/c/xl/2018-08-17/doc-ihhvciiw5684240.shtml
正文标题:习近平对首个“中国医师节”作出指示
当前页面类型:null >>> 页面地址:http://news.sina.com.cn/c/2018-08-17/doc-ihhvciiw3111773.shtml
正文标题:吉林省委:坚决拥护中央对长生问题疫苗案处理决定
当前页面类型:null >>> 页面地址:http://news.sina.com.cn/s/2018-08-17/doc-ihhvciiw3787966.shtml
当前页面类型:null >>> 页面地址:http://news.sina.com.cn/w/2018-08-17/doc-ihhvciiw4401010.shtml
正文标题:红芯浏览器疑造假 业内:有创新但自主可控仍存疑
正文标题:美报告称中国为台海冲突作准备:用最短时间取胜
发布时间:2018-08-16 02:00:00
当前页面类型:null >>> 页面地址:http://news.sina.com.cn/c/2018-08-17/doc-ihhvciiw4197115.shtml
>>>>>图片地址:http://n.sinaimg.cn/news/crawl/43/w500h343/20180816/q_yn-hhvciiw0962779.jpg
正文内容: 原标题:十九届中央委员中,他是首个被处理的 中共中央政治局常务委员会8月16日召开会议,听取关于吉林长春长生公司问题疫苗案件调查及有关问责情况的汇报。中共中央总书记习近平主持会议并发表重要讲话。....省略 800 字......
正文标题:红芯浏览器致歉:宣传夸大 不应特别强调国产自主
发布时间:2018-08-17 09:32:00
>>>>>图片地址:http://n.sinaimg.cn/news/transform/155/w550h1205/20180817/7hwl-fzrwica1044968.jpg
正文内容: 原标题:红芯浏览器致歉:宣传中存在夸大,不应特别强调国产自主 8月17日,红芯浏览器所属公司官方微信号推送了《红芯致歉信》。 致歉信称,红芯在近期的融资宣传过程中,存在一定程度的夸大,给公众带来了误导,“这一点我们有不可推卸的责任,我们确实做错了,在此郑重地向大家道歉。”....省略 300 字......
发布时间:2018-08-17 08:59:00
>>>>>图片地址:http://n.sinaimg.cn/news/crawl/650/w440h210/20180817/vtZ_-hhvciiw3736295.jpg
>>>>>图片地址:http://n.sinaimg.cn/news/crawl/59/w550h309/20180817/pc_d-hhvciiw3736378.jpg
>>>>>图片地址:http://n.sinaimg.cn/news/gif_image/752/w2144h1008/20180817/68ED-hhvciiw3737661.gif
>>>>>图片地址:http://n.sinaimg.cn/news/crawl/7/w550h257/20180817/1gwP-hhvciiw3738849.jpg
>>>>>图片地址:http://n.sinaimg.cn/news/crawl/787/w550h237/20180817/2vcR-hhvciiw3738900.jpg
>>>>>图片地址:http://n.sinaimg.cn/news/crawl/115/w550h365/20180817/6rne-hhvciiw3739223.jpg
>>>>>图片地址:http://n.sinaimg.cn/news/crawl/670/w268h402/20180817/1WHu-hhvciiw3739275.jpg
正文内容: 原标题:红芯浏览器遭“换肤”质疑,业内发声:有创新但自主可控仍存疑 来源:科技日报 8月15日,国产浏览器公司红芯宣布基于自主可控的浏览器核心技术完成2.5亿元融资。....省略 500 字......
......省略几千行.......
2018-08-17 16:06:36 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - -activeThreads=1, spinWaiting=0, fetchQueue.size=0
当前页面类型:null >>> 页面地址:http://mil.news.sina.com.cn/china/2018-08-17/doc-ihhvciiw4482719.shtml
正文标题:美报告:解放军为台海冲突作准备 要用最短时间取胜
发布时间:2018-08-17 01:00:00
正文内容: 参考消息网8月17日报道 境外媒体称,美国国防部16日发布《2018年中国军力报告》指出,中国军事现代化的目标,有可能是为降低美国的核心能力与技术优势。这份报告也披露中国大陆目前正为台湾海峡的“可能状况”作军事准备。 据台湾“中央社”8月17日报道,16日公布的这份报告强调中国大陆的军事、经济和外交影响力日增,而北京正利用这点快速建立在国际上的影响力,以及确立地区霸权地位。 在大陆的空中武力方面,这份报告指出,解放军轰炸机正在发展打击尽可能远离大陆目标的能力。 报告说:“过去3年间,解放军快速扩大远洋轰炸机作战区域,增加在重要海洋地区作战的经验,并可能训练攻击美国与盟友的目标。”报告指出,中国大陆正将军事行动推进到太平洋。 报告说,解放军也许是要展示“有能力攻击西太平洋的美军和盟国部队与军事基地,包括关岛在内”。 这份报告也指出,中国大陆的官方立场主张和平统一台湾,但从未否认可能动用军事力量。 报告说:“解放军可能正为以武力统一台湾的可能状况作准备,同时要吓阻、延后或阻却任何第三势力为了台湾而介入。” 报告又说:“如果美国干预,中国大陆会设法拖延有效的干预行动,寻求在短时间的高强度有限战争中取胜。” 据台湾联合新闻网8月17日报道,美国国防部重申,美国坚持基于《中美联合公报》、《与台湾关系法》的“一中政策”,反对任何一方片面改变台海现状,且不支持台湾“独立”;美国持续支持以两岸人民可接受的方式、范围和步骤,和平解决两岸问题。 报道指出,这并非美方首次表态不支持台湾“独立”,美国防部2016年、2017年发布的报告都指出美国不支持台湾地区“独立”。 报告提及,台湾的防务预算仍占GDP的2%左右,蔡英文最近承诺增加防务预算,但同时间,中国大陆的国防预算已成长到台湾的15倍左右,其中大部分集中在发展统一台湾的能力上。
2018-08-17 16:06:37 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - done: [200] Key: http://mil.news.sina.com.cn/china/2018-08-17/doc-ihhvciiw4482719.shtml (URL: http://mil.news.sina.com.cn/china/2018-08-17/doc-ihhvciiw4482719.shtml)
2018-08-17 16:06:37 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - -activeThreads=0, spinWaiting=0, fetchQueue.size=0
2018-08-17 16:06:37 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - clear all activeThread
2018-08-17 16:06:37 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - close generator:cn.edu.hfut.dmic.webcollector.plugin.ram.RamGenerator
2018-08-17 16:06:37 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - close segmentWriter:cn.edu.hfut.dmic.webcollector.plugin.ram.RamDBManager
2018-08-17 16:06:37 INFO cn.edu.hfut.dmic.webcollector.crawler.Crawler - depth 2 finish:
total urls: 14
total time: 5 secondsProcess finished with exit code 0
人民网-要闻
需求分析
- 爬取 人民网 中的要闻部分
列表页
内容页
代码爬取
package com.lct.webCollector;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.plugin.rocks.BreadthCrawler;
import com.lct.util.SystemUtils;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* cn.edu.hfut.dmic.webcollector.plugin.rocks.BreadthCrawler是基于RocksDB的插件,于2.72版重新设计
* BreadthCrawler可以设置正则规律,让遍历器自动根据URL的正则遍历网站,可以关闭这个功能,自定义遍历
* 如果autoParse设置为true,遍历器会自动解析页面中符合正则的链接,加入后续爬取任务,否则不自动解析链接。
* 注意,爬虫会保证爬取任务的唯一性,也就是会自动根据CrawlDatum的key进行去重,默认情况下key就是URL,
* 所以用户在编写爬虫时完全不必考虑生成重复URL的问题。
* 断点爬取中,爬虫仍然会保证爬取任务的唯一性。
*/
public class MyManualNewsCrawler extends BreadthCrawler {
/**
* 构造一个基于RocksDB的爬虫
* RocksDB文件夹为crawlPath,crawlPath中维护了历史URL等信息
* 不同任务不要使用相同的crawlPath,两个使用相同crawlPath的爬虫并行爬取会产生错误
*
* @param crawlPath RocksDB使用的文件夹
* @param autoParse 是否根据设置的正则自动探测新URL
*/
public MyManualNewsCrawler(String crawlPath, boolean autoParse) {
/**
* @param crawlPath RocksDB使用的文件夹
* @param autoParse 是否根据设置的正则自动探测新URL
*/
super(crawlPath, autoParse);
/**
* 添加爬取的列表页面,同时为地址设置 附加信息
*/
this.addSeedAndReturn("http://www.people.com.cn/").type("list");
/**
* 设置爬取线程最大为30
*/
setThreads(30);
/**
* 设置爬取任务爬取结果的总数,setTopN(100),表示最多爬取100条
* getConf().setTopN(100);
* 设置 是否 开启断点 爬取
* setResumable(true);
*/
}
@Override
public void visit(Page page, CrawlDatums next) {
String url = page.url();
System.out.println("当前爬取地址:" + url + " >>> 链接类型:" + page.contentType());
if (page.matchType("list")) {
/** 当前地址为列表页时,获取其中内容页的地址
* 同时将获取到的内容页地址添加到后续的爬取任务中,并设置附加信息,标识为 content
*/
next.add(page.links("#rmw_b1 a")).type("content");
} else if (page.matchType("content")) {
/**
* 如果当前页是内容页,则获取它的内容
* 如果选择器错误,则抛异常,但不影响后续爬取
*/
String title = page.select("div.clearfix.w1000_320.text_title>h1").first().text();
String content = page.selectText("div[id=rwb_zw]");
String dateStr = page.selectText(".box01");
/**
* 获取 crawler.getConf().set("title_prefix", "自定义标题前缀"); 在配置文件设置好的值
* 为标题拼加一个前后缀,实质就是获取当前爬取链全局配置文件中事先设置好的参数值
*/
title = getConf().getString("title_prefix") + " " + title;
content = content.substring(0, getConf().getInteger("content_length_limit")) + "......";
System.out.println("文章标题:::" + title);
Date date = SystemUtils.parseDateStr(dateStr);
if (date != null) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("发布时间:" + dateFormat.format(date));
} else {
System.out.println("发布时间:null");
}
System.out.println("文章正文:::" + content);
}
}
public static void main(String[] args) throws Exception {
/**
* @param crawlPath RocksDB使用的文件夹
* @param autoParse 是否根据设置的正则自动探测新URL
* 本文使用 手动探测 URL
*/
MyManualNewsCrawler crawler = new MyManualNewsCrawler("crawl/", false);
/** 设置每个线程 visit 的执行间隔,单位是毫秒*/
crawler.getConf().setExecuteInterval(5000);
/**设置整个爬取过程中的配置参数 getConf() 返回的是
* cn.edu.hfut.dmic.webcollector.conf.Configuration,里面用的是一个 HashMap 存放的值
* 可以在 visit 方法中直接使用继承自父类的 getConf 方法获取这些值
* */
crawler.getConf().set("title_prefix", "自定义标题前缀:");
crawler.getConf().set("content_length_limit", 20);
/**
* 指定爬取深度为 2,同时启动爬虫
*/
crawler.start(2);
}
}
- 上面格式化页面的文本日期时,使用了一个自定义的工具类
package com.lct.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by Administrator on 2018/8/15 0015.
* 系统工具类
*/
public class SystemUtils {
/**
* 解析日期字符串,如:"发布日期:2018-05-31"、"2018-08-13 07:44 来源: 经济日报"、 "2018年08月15日 07:13:30 参考消息" 等等
*
* @param dateStr 返回解析好的 日期对象,解析失败时,返回 null
* @return
*/
public static Date parseDateStr(String dateStr) {
if (dateStr == null || "".equals(dateStr)) {
return null;
}
/**
* dateRegexYMDHMS:针对 年月日 时分秒
* dateRegexYMDHM:针对 年月日 时分
* dateRegexYMDH:针对 年月日 时
* dateRegexYMDH:针对 年月日
*/
String dateRegexYMDHMS = "([1-2][0-9]{3})[^0-9]{1,5}?([0-1]?[0-9])[^0-9]{1,5}?([0-9]{1,2})[^0-9]{1,5}?([0-2]?[1-9])[^0-9]{1,5}?([0-9]{1,2})[^0-9]{1,5}?([0-9]{1,2})";
String dateRegexYMDHM = "([1-2][0-9]{3})[^0-9]{1,5}?([0-1]?[0-9])[^0-9]{1,5}?([0-9]{1,2})[^0-9]{1,5}?([0-2]?[1-9])[^0-9]{1,5}?([0-9]{1,2})";
String dateRegexYMDH = "([1-2][0-9]{3})[^0-9]{1,5}?([0-1]?[0-9])[^0-9]{1,5}?([0-9]{1,2})[^0-9]{1,5}?([0-2]?[1-9])";
String dateRegexYMD = "([1-2][0-9]{3})[^0-9]{1,5}?([0-1]?[0-9])[^0-9]{1,5}?([0-9]{1,2})";
Pattern pattern = Pattern.compile(dateRegexYMDHMS);
Matcher matcher = pattern.matcher(dateStr);
StringBuffer dateSourceBf = new StringBuffer();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
if (matcher.find()) {
/**年月日 时分秒*/
dateSourceBf.append(matcher.group(1)).append("-");
dateSourceBf.append(matcher.group(2).length() == 1 ? "0" + matcher.group(2) : matcher.group(2)).append("-");
dateSourceBf.append(matcher.group(3).length() == 1 ? "0" + matcher.group(3) : matcher.group(3)).append(" ");
dateSourceBf.append(matcher.group(4).length() == 1 ? "0" + matcher.group(4) : matcher.group(4)).append(":");
dateSourceBf.append(matcher.group(5).length() == 1 ? "0" + matcher.group(5) : matcher.group(5)).append(":");
dateSourceBf.append(matcher.group(6).length() == 1 ? "0" + matcher.group(6) : matcher.group(6));
Date date = simpleDateFormat.parse(dateSourceBf.toString());
return date;
}
if (dateSourceBf.length() <= 1) {
/**年月日 时分*/
pattern = Pattern.compile(dateRegexYMDHM);
matcher = pattern.matcher(dateStr);
if (matcher.find()) {
dateSourceBf.append(matcher.group(1)).append("-");
dateSourceBf.append(matcher.group(2).length() == 1 ? "0" + matcher.group(2) : matcher.group(2)).append("-");
dateSourceBf.append(matcher.group(3).length() == 1 ? "0" + matcher.group(3) : matcher.group(3)).append(" ");
dateSourceBf.append(matcher.group(4).length() == 1 ? "0" + matcher.group(4) : matcher.group(4)).append(":");
dateSourceBf.append(matcher.group(5).length() == 1 ? "0" + matcher.group(5) : matcher.group(5)).append(":00");
Date date = simpleDateFormat.parse(dateSourceBf.toString());
return date;
}
}
if (dateSourceBf.length() <= 1) {
/**年月日 时*/
pattern = Pattern.compile(dateRegexYMDH);
matcher = pattern.matcher(dateStr);
if (matcher.find()) {
dateSourceBf.append(matcher.group(1)).append("-");
dateSourceBf.append(matcher.group(2).length() == 1 ? "0" + matcher.group(2) : matcher.group(2)).append("-");
dateSourceBf.append(matcher.group(3).length() == 1 ? "0" + matcher.group(3) : matcher.group(3)).append(" ");
dateSourceBf.append(matcher.group(4).length() == 1 ? "0" + matcher.group(4) : matcher.group(4)).append(":00:00");
Date date = simpleDateFormat.parse(dateSourceBf.toString());
return date;
}
}
if (dateSourceBf.length() <= 1) {
/**年月日*/
pattern = Pattern.compile(dateRegexYMD);
matcher = pattern.matcher(dateStr);
if (matcher.find()) {
dateSourceBf.append(matcher.group(1)).append("-");
dateSourceBf.append(matcher.group(2).length() == 1 ? "0" + matcher.group(2) : matcher.group(2)).append("-");
dateSourceBf.append(matcher.group(3).length() == 1 ? "0" + matcher.group(3) : matcher.group(3)).append(" 00:00:00");
Date date = simpleDateFormat.parse(dateSourceBf.toString());
return date;
}
}
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
爬取结果
2018-08-18 12:17:54 INFO cn.edu.hfut.dmic.webcollector.crawler.Crawler - start depth 1
2018-08-18 12:17:54 INFO cn.edu.hfut.dmic.webcollector.plugin.rocks.RocksDBManager - start merge
2018-08-18 12:17:54 INFO cn.edu.hfut.dmic.webcollector.plugin.rocks.RocksDBManager - merge fetch database
2018-08-18 12:17:54 INFO cn.edu.hfut.dmic.webcollector.plugin.rocks.RocksDBManager - merge link database
2018-08-18 12:17:55 INFO cn.edu.hfut.dmic.webcollector.plugin.rocks.RocksDBManager - end merge
2018-08-18 12:17:56 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - init segmentWriter:cn.edu.hfut.dmic.webcollector.plugin.rocks.RocksDBManager
2018-08-18 12:17:56 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - create generator:cn.edu.hfut.dmic.webcollector.plugin.rocks.RocksGenerator
2018-08-18 12:17:56 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - use generatorFilter:cn.edu.hfut.dmic.webcollector.crawldb.StatusGeneratorFilter
当前爬取地址:http://www.people.com.cn/ >>> 链接类型:text/html
2018-08-18 12:17:57 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - done: [200] Key: http://www.people.com.cn/ (URL: http://www.people.com.cn/)
2018-08-18 12:17:57 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - -activeThreads=1, spinWaiting=0, fetchQueue.size=0
2018-08-18 12:17:58 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - -activeThreads=1, spinWaiting=0, fetchQueue.size=0
2018-08-18 12:17:59 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - -activeThreads=1, spinWaiting=0, fetchQueue.size=0
2018-08-18 12:18:00 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - -activeThreads=1, spinWaiting=0, fetchQueue.size=0
2018-08-18 12:18:01 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - -activeThreads=1, spinWaiting=0, fetchQueue.size=0
2018-08-18 12:18:02 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - -activeThreads=0, spinWaiting=0, fetchQueue.size=0
2018-08-18 12:18:02 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - clear all activeThread
2018-08-18 12:18:02 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - close generator:cn.edu.hfut.dmic.webcollector.plugin.rocks.RocksGenerator
2018-08-18 12:18:02 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - close segmentWriter:cn.edu.hfut.dmic.webcollector.plugin.rocks.RocksDBManager
2018-08-18 12:18:02 INFO cn.edu.hfut.dmic.webcollector.crawler.Crawler - depth 1 finish:
total urls: 1
total time: 8 seconds
2018-08-18 12:18:02 INFO cn.edu.hfut.dmic.webcollector.crawler.Crawler - start depth 2
2018-08-18 12:18:02 INFO cn.edu.hfut.dmic.webcollector.plugin.rocks.RocksDBManager - start merge
2018-08-18 12:18:03 INFO cn.edu.hfut.dmic.webcollector.plugin.rocks.RocksDBManager - merge fetch database
2018-08-18 12:18:03 INFO cn.edu.hfut.dmic.webcollector.plugin.rocks.RocksDBManager - merge link database
2018-08-18 12:18:04 INFO cn.edu.hfut.dmic.webcollector.plugin.rocks.RocksDBManager - end merge
2018-08-18 12:18:05 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - init segmentWriter:cn.edu.hfut.dmic.webcollector.plugin.rocks.RocksDBManager
2018-08-18 12:18:05 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - create generator:cn.edu.hfut.dmic.webcollector.plugin.rocks.RocksGenerator
2018-08-18 12:18:05 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - use generatorFilter:cn.edu.hfut.dmic.webcollector.crawldb.StatusGeneratorFilter
当前爬取地址:http://world.people.com.cn/n1/2018/0818/c1002-30236107.html >>> 链接类型:text/html
当前爬取地址:http://society.people.com.cn/n1/2018/0818/c1008-30236070.html >>> 链接类型:text/html
文章标题:::自定义标题前缀: 相信土耳其有能力克服暂时的经济困难
发布时间:2018-08-18 05:04:00
文章正文::: 本报北京8月17日电 外交部发言人陆......
2018-08-18 12:18:05 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - done: [200] Key: http://world.people.com.cn/n1/2018/0818/c1002-30236107.html (URL: http://world.people.com.cn/n1/2018/0818/c1002-30236107.html)
当前爬取地址:http://society.people.com.cn/n1/2018/0818/c1008-30236085.html >>> 链接类型:text/html
文章标题:::自定义标题前缀: 全国60周岁及以上老年人口逾2.4亿
发布时间:2018-08-18 05:01:00
文章正文::: 本报北京8月17日电 (记者潘跃)记......
2018-08-18 12:18:05 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - done: [200] Key: http://society.people.com.cn/n1/2018/0818/c1008-30236085.html (URL: http://society.people.com.cn/n1/2018/0818/c1008-30236085.html)
当前爬取地址:http://politics.people.com.cn/n1/2018/0817/c1001-30235959.html >>> 链接类型:text/html
文章标题:::自定义标题前缀: 河南省人大常委会党组副书记、副主任王铁涉嫌严重违纪违法接受中央纪委国家监委纪律审查和监察调查
发布时间:2018-08-17 19:21:00
文章正文::: 人民网北京8月17日电 据中央纪委国......
2018-08-18 12:18:05 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - done: [200] Key: http://politics.people.com.cn/n1/2018/0817/c1001-30235959.html (URL: http://politics.people.com.cn/n1/2018/0817/c1001-30235959.html)
文章标题:::自定义标题前缀: 纳入2018年医保准入谈判范围
发布时间:2018-08-18 05:00:00
文章正文::: 本报北京8月17日电 (记者李红梅)......
2018-08-18 12:18:05 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - done: [200] Key: http://society.people.com.cn/n1/2018/0818/c1008-30236070.html (URL: http://society.people.com.cn/n1/2018/0818/c1008-30236070.html)
当前爬取地址:http://world.people.com.cn/n1/2018/0818/c1002-30236076.html >>> 链接类型:text/html
文章标题:::自定义标题前缀: 王毅应约同伊朗外长扎里夫通电话
发布时间:2018-08-18 05:00:00
文章正文::: 本报北京8月17日电 8月17日,国......
2018-08-18 12:18:05 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - done: [200] Key: http://world.people.com.cn/n1/2018/0818/c1002-30236076.html (URL: http://world.people.com.cn/n1/2018/0818/c1002-30236076.html)
当前爬取地址:http://leaders.people.com.cn/n1/2018/0817/c58278-30235392.html >>> 链接类型:text/html
当前爬取地址:http://health.people.com.cn/n1/2018/0818/c14739-30236272.html >>> 链接类型:text/html
文章标题:::自定义标题前缀: 周人事:辽宁三地调整主要领导 吉林副省长因疫苗案被免职
发布时间:2018-08-17 12:33:00
文章正文:::人民网北京8月17日电 (唐嘉艺)本周,......
2018-08-18 12:18:05 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - done: [200] Key: http://leaders.people.com.cn/n1/2018/0817/c58278-30235392.html (URL: http://leaders.people.com.cn/n1/2018/0817/c58278-30235392.html)
2018-08-18 12:18:05 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - failed: [200] Key: http://health.people.com.cn/n1/2018/0818/c14739-30236272.html (URL: http://health.people.com.cn/n1/2018/0818/c14739-30236272.html)
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at cn.edu.hfut.dmic.webcollector.fetcher.VisitorMethodDispatcher.dispatch(VisitorMethodDispatcher.java:220)
at cn.edu.hfut.dmic.webcollector.crawler.AutoParseCrawler.execute(AutoParseCrawler.java:89)
at cn.edu.hfut.dmic.webcollector.fetcher.Fetcher$FetcherThread.run(Fetcher.java:245)
Caused by: java.lang.NullPointerException
at com.lct.webCollector.MyManualNewsCrawler.visit(MyManualNewsCrawler.java:69)
... 7 more
当前爬取地址:http://edu.people.com.cn/n1/2018/0817/c1006-30236008.html >>> 链接类型:text/html
文章标题:::自定义标题前缀: 教育部:国家助学公益短信不是诈骗短信
发布时间:2018-08-17 02:00:00
文章正文:::人民网北京8月17日电 据教育部网站消息......
2018-08-18 12:18:05 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - done: [200] Key: http://edu.people.com.cn/n1/2018/0817/c1006-30236008.html (URL: http://edu.people.com.cn/n1/2018/0817/c1006-30236008.html)
2018-08-18 12:18:06 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - -activeThreads=8, spinWaiting=0, fetchQueue.size=0
2018-08-18 12:18:07 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - -activeThreads=8, spinWaiting=0, fetchQueue.size=0
2018-08-18 12:18:08 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - -activeThreads=8, spinWaiting=0, fetchQueue.size=0
2018-08-18 12:18:09 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - -activeThreads=8, spinWaiting=0, fetchQueue.size=0
2018-08-18 12:18:10 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - -activeThreads=8, spinWaiting=0, fetchQueue.size=0
2018-08-18 12:18:11 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - -activeThreads=0, spinWaiting=0, fetchQueue.size=0
2018-08-18 12:18:11 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - clear all activeThread
2018-08-18 12:18:11 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - close generator:cn.edu.hfut.dmic.webcollector.plugin.rocks.RocksGenerator
2018-08-18 12:18:12 INFO cn.edu.hfut.dmic.webcollector.fetcher.Fetcher - close segmentWriter:cn.edu.hfut.dmic.webcollector.plugin.rocks.RocksDBManager
2018-08-18 12:18:12 INFO cn.edu.hfut.dmic.webcollector.crawler.Crawler - depth 2 finish:
total urls: 8
total time: 9 seconds
Process finished with exit code 0