nutch代码分析第二篇——crawl.crawl
2021SC@SDUSC
顾名思义,org.apache.nutch.crawl.Crawl实现的是一个完整的抓取过程,包括各种方法的初始化,url集的建立
/* Perform complete crawling and indexing (to Solr) given a set of root urls and the -solrparameter respectively. More information and Usage parameters can be found below. */public static void main(String args[]) throws Exception {Configuration conf = NutchConfiguration.create();int res = ToolRunner.run(conf, new Crawl(), args);System.exit(res);
org.apache.nutch.util.NutchConfigurationite.xml.
private static Configuration addNutchResources(Configuration conf) {conf.addResource("nutch-default.xml");conf.addResource("nutch-site.xml");return conf;}
初始化时,加载nutch-default.xml,nutch-s
@Overridepublic int run(String[] args) throws Exception {if (args.length < 1) {System.out.println("Usage: Crawl <urlDir> -solr <solrURL> [-dir d] [-threads n] [-depth i] [-topN N]");return -1;}Path rootUrlDir = null;Path dir = new Path("crawl-" + getDate());int threads = getConf().getInt("fetcher.threads.fetch", 10);int depth = 5;long topN = Long.MAX_VALUE;String solrUrl = null;//获得输入参数for (int i = 0; i < args.length; i++) {if ("-dir".equals(args[i])) {dir = new Path(args[i+1]);i++;} else if ("-threads".equals(args[i])) {threads = Integer.parseInt(args[i+1]);i++;} else if ("-depth".equals(args[i])) {depth = Integer.parseInt(args[i+1]);i++;} else if ("-topN".equals(args[i])) {topN = Integer.parseInt(args[i+1]);i++;} else if ("-solr".equals(args[i])) {solrUrl = args[i + 1];i++;} else if (args[i] != null) {rootUrlDir = new Path(args[i]);}}JobConf job = new NutchJob(getConf());if (solrUrl == null) {LOG.warn("solrUrl is not set, indexing will be skipped...");}FileSystem fs = FileSystem.get(job);if (LOG.isInfoEnabled()) {LOG.info("crawl started in: " + dir);LOG.info("rootUrlDir = " + rootUrlDir);LOG.info("threads = " + threads);LOG.info("depth = " + depth); LOG.info("solrUrl=" + solrUrl);if (topN != Long.MAX_VALUE)LOG.info("topN = " + topN);}//建立爬取过程中存放信息的文件夹,对应着各个阶段Path crawlDb = new Path(dir + "/crawldb"); //Path linkDb = new Path(dir + "/linkdb");Path segments = new Path(dir + "/segments");Path indexes = new Path(dir + "/indexes");Path index = new Path(dir + "/index");//初始化配置信息Path tmpDir = job.getLocalPath("crawl"+Path.SEPARATOR+getDate());Injector injector = new Injector(getConf());Generator generator = new Generator(getConf());Fetcher fetcher = new Fetcher(getConf());ParseSegment parseSegment = new ParseSegment(getConf());CrawlDb crawlDbTool = new CrawlDb(getConf());LinkDb linkDbTool = new LinkDb(getConf());// initialize crawlDb 初始化crawlDbinjector.inject(crawlDb, rootUrlDir);int i;for (i = 0; i < depth; i++) { // generate new segment 生成新的抓取队列Path[] segs = generator.generate(crawlDb, segments, -1, topN, System.currentTimeMillis()); if (segs == null) {LOG.info("Stopping at depth=" + i + " - no more URLs to fetch.");break;}fetcher.fetch(segs[0], threads); // fetch it 抓取if (!Fetcher.isParsing(job)) {parseSegment.parse(segs[0]); // parse it, if needed 解析}crawlDbTool.update(crawlDb, segs, true, true); // update crawldb 更新crawlDb数据库}if (i > 0) {linkDbTool.invert(linkDb, segments, true, true, false); // invert links 计算反向链接if (solrUrl != null) {// index, dedup & merge 使用solr建立索引FileStatus[] fstats = fs.listStatus(segments, HadoopFSUtil.getPassDirectoriesFilter(fs));SolrIndexer indexer = new SolrIndexer(getConf());indexer.indexSolr(solrUrl, crawlDb, linkDb, Arrays.asList(HadoopFSUtil.getPaths(fstats)));SolrDeleteDuplicates dedup = new SolrDeleteDuplicates();dedup.setConf(getConf());dedup.dedup(solrUrl);}} else {LOG.warn("No URLs to fetch - check your seed list and URL filters.");}if (LOG.isInfoEnabled()) { LOG.info("crawl finished: " + dir); }return 0;}
这段主要是初始化参数,建立存URl的集,建索引
nutch代码分析第二篇——crawl.crawl相关推荐
- SAP PP COR2下达工单系统报错说-系统状态APNG是激活的- 分析第二篇
SAP PP COR2下达工单系统报错说-系统状态APNG是激活的- 分析第二篇 笔者所在的项目上启用了ECM(Engineer Change Management)功能,重要数据的修改都要事先创建一 ...
- 今天开始做战斗,回合制战斗代码实现第二篇,九宫格战斗
说到九宫格战斗,就不能不提一款游戏<神仙道>,在神仙道之前,九宫格战斗的模式就在几款游戏里面有应用,但神仙道是真真正正把这种战斗模式发扬光大的里程碑,当时无论口碑,还是市场占有率都可以说是 ...
- matlab实现鬼波信号压制算法 代码实践--第二篇 频率-波数域鬼波压制
第二篇 matlab实现频率-波数域鬼波压制方法 本篇用来介绍频率-波数域鬼波压制的实现思路和压制效果 算法实现思路见2.3节,除了文中代码外,需配置鬼波压制算法工具包(https://downlo ...
- 150行java代码分析100篇英语六级阅读理解单词频率
.txt保存阅读理解,java流读取各个单词,并将其数量存入数据库,然后查询数据库将结果写入.txt文件 package New;import java.io.BufferedReader; impo ...
- Realtek 8125驱动分析第二篇——触发硬件中断
书接上文,本文讲述瑞昱2.5G网卡rtl8125的触发硬件中断相关内容. 目录 1 中断处理函数(ISR)注册 2 触发硬件中断 可以通过下面的命令来看interrupts. howard@B150: ...
- Pixhawk代码分析-准备
Pixhawk代码分析准备篇 实验平台 Software Version:ArduCopter(Ver_3.3) Hardware Version:pixhawk IDE:eclipse Juno ( ...
- PopStar(消灭星星)游戏源代码下载、分析及跨平台移植---第二篇(算法)
背景: 上一节,我们已经把消灭星星的界面搭建好了,流程也跑通了. 这一篇涉及到程序的算法,也许是最难的部分了,理解起来需要多花点时间,而且我提供的算法未必就是最好的,如果读者有更优更好的算法,希望分享 ...
- ARM裸机篇---启动代码分析
ARM裸机篇---启动代码分析 先搞清楚启动代码和Bootloader的区别,启动代码是指CPU复位后到进入C语言的main函数之前需要执行的那段汇编代码. 下面的代码先暂且这样吧,没啥注释的,时间关 ...
- 对现有的所能找到的DDOS代码(攻击模块)做出一次分析----UDP篇
//========================================= 对现有的所能找到的DDOS代码(攻击模块)做出一次分析----UDP篇 文章作者:alalmn-飞龙 信息来源: ...
最新文章
- relay.build调用关系
- 颜宁强烈推荐:给研究生的四条金玉良言
- 腾讯最新开源项目登上GitHub热榜:QQ音乐等18项业务都在用,日均PV过亿
- 哈工大c语言编程题中国大学mooc第四周,中国大学MOOC哈工大C语言程序设计精髓第六周编程题答案.doc...
- antd 文本域超长问题_一款能快速批量处理SQL文本的软件:NimbleText
- likelihood(似然) and likelihood function(似然函数)
- 第二百五十天 how can I 坚持
- matlab plot title 包含变量的图片标题
- 2015 计算机考研大纲,2015年考研计算机大纲详解:操作系统
- 关于ListView 自定义 Adapter的问题
- 【转载】早点长大的飞秋
- Lync2010服务器的高可用性部署测试
- spark graphx入门
- wpf demo (gif , multithredading,httpwatch)
- 控制台js常用解决方案,字符串替换和抓取列表页链接
- mysql有if选择更新_使用IF条件的MySQL更新
- TensorFlow1.x入门(2)——变量的定义及其操作
- Python批量提取Excel文件中所有单元格批注
- 怎么用计算机的计算器转换进位制,计算机进制换算(进制转换计算器)
- Room cannot verify the data integrity. Looks like you‘ve changed schema but forgot to update the ve