??xml version="1.0" encoding="utf-8" standalone="yes"?> 来个图: 动作分解Q? 1.创徏I数据库WebdbQ?/p> 2.向Webdb中注入入口攫取地址Q?/p> 3.ҎWebdb中数据生成fetchlistQƈ生成相应的segment?/p> 4.Ҏfetchlist攫取内容Qfetched contentQ?/p> 5.Ҏ获取内容更新Webdb 6.重复执行3-5.q个q程52seUCؓ“?抓取/更新”@环?/p> 7.完成上面的@环后Q根据Webdb中信息,如网评分和链接信息{,再次更新segment. 8.索引被攫取的面Q生成链接?/p> 9.去除indexes中重复的内容和链接?/p> 10.依靠indexes合成单一的index文g。大功告成?/p> 上面q些步骤都可以对应到Nutchl我们提供的CrawlTool中的命o上?/p> 爬虫忙完了,有了数据Q我们就可以利用Nutch的search部分功能来查扑ֆ容了?/p> 1.爬虫工作的过E? 2.爬虫获取数据后,数据的存储结构? 3.数据如何索引成Lucene讑֮的烦引格式? 上午q工作耽误了,下午得闲Q看点资料。试单ȝ一下上面几个问题的?/p> 先回{?号问题,数据的存储结构好了?/p> Nutch把爬虫找回来的资料做成了攑֜一个文件夹里面Q美其名曰Web database。其实里面分别就四个文g夹了事。依ơ道来: 好了q个存储l构的问题完成了?/p> 抽空先写q么多,呆会有时间在l箋?/p> |络上面介绍q个配置的比较多Q我׃重复力_了?/p>
推荐文如下QNutch Version 0.8x tutorial Q还有就是这里的?a target="_blank">日志?/p>
我在q里记录一下遇到的几个错误和解军_法,大家可能有用?/p>
如执行如下命令: 可能错误1Q?/p>
Generator: jobtracker is 'local', generating exactly one partition. 说明Q指定要抓取的网址(url.txt)l过(crawl-urlfilters.xml)qo后,已经没有可抓取对象了Q检查两者的匚w卛_?/p>
可能错误2Q?/p>
Dedup: starting 说明Q一般ؓ./conf/nutch-site.xml文g配置有错误。请参考如下配|修攏V?br />
[xml] 可能错误3Q?/p>
Injector: Converting injected urls to crawl db entries. 说明Q一般ؓcrawl-urlfilters.txt中配|问题,比如qo条g应ؓ 好了写完了?/p>
<传言看源代码理解的更l致Q不q偶没看Q偶是根据文和下午的操作ȝ的,错了h正?gt;Introduction to Nutch, Part 1: Crawling
]]>
./nutch crawl ../urls.txt -dir ../ihooyo -depth 5 -topN 100
参数说明Q?br />
-url 是刚才我们创徏的url文g,存放我们要抓取的|址
-dir 指定抓取内容所存放的目录,如上存在mydir?br />
-threads 指定q发的线E数
-depth 表示以要抓取|站|址v点的爬行深度
-topN 表示获取前多条记录Q可?/p>
Generator: 0 records selected for fetching, exiting ...
Stopping at depth=0 - no more URLs to fetch.
No URLs to fetch - check your seed list and URL filters.
crawl finished: sina5
Dedup: adding indexes in: ../ihooyo/indexes
Exception in thread "main" java.io.IOException: Job failed!
at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:604)
at org.apache.nutch.indexer.DeleteDuplicates.dedup(DeleteDuplicates.java:439)
at org.apache.nutch.crawl.Crawl.main(Crawl.java:135)
<property>
<name>http.agent.name</name>
<value>ihooyo</value>
<description></description>
</property>
<property>
<name>http.agent.description</name>
<value>apersonblog</value>
<description></description>
</property>
<property>
<name>http.agent.url</name>
<value>www.ihooyo.com</value>
<description></description>
</property>
<property>
<name>http.agent.email</name>
<value>pjuneye@qq.com</value>
<description></description>
</property>
[/xml]
q种配置错误Q在log日志中可扑ֈ提示?/p>
Exception in thread "main" java.io.IOException: Job failed!
at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:604)
at org.apache.nutch.crawl.Injector.inject(Injector.java:162)
at org.apache.nutch.crawl.Crawl.main(Crawl.java:115)
+^http://www.ihooyo.com ,而配|成?http://www.ihooyo.com q样的情况就引v如上错误?/p>
搞明白的几个问题:
1.Nutch到底是什?
Nutch是一个开源的Java语言实现的搜索引擎。它通过完整功能的搜索系l?/p>
2.Nutch和Lucene到底是什么关p?两者如何取?
NutchZLuceneQLucene为Nutch提供文本索引和搜索API。两者的取舍问题在于Lucene不能够ؓ你抓取数据,所以如果在有数据源的情况下最好的方式是用Lucene API来徏立烦引,完成搜烦。如果需要抓取数据的话,那自然是选择Nutch为好?/p>
3.Nutch的基本安装步?
q个问题有官Ҏ。在q里?/p>
PS:g|络Nutch上最多的帖子是关于q个?其中比较有意思的是摆脱Cgywin的一些方?比如利用window批处理或者利用ant.个hq是觉得ant更通用.
4.Nutch的基本组?
Nutch基本上两部分l成Q抓取部分和搜烦部分。抓取程序抓取页面ƈ抓取回来的数据做成反向索引Q搜索程序则反向烦引搜索回{用Lh。两者的兌部分在于索引?br>具体内容q需要仔l看文档和介l?
5.Nutch文档集中?
http://wiki.apache.org/nutch/
补充完成Q今日l。愚快乐!
ѝ大腕》经典对白:
一定要N最行的框Ӟ
用功能最强大~辑器,
做就要做最复杂的系l,
轻量U的l对不行Q?br>框架最单也得是QIQԌQGQ?br>什么IQ啊,QテQIQԌQTQ啊QSQAQ啊Q能用的全都得用上,
表现层要可配|、持久层要可替换Q?br>E序最好能用一万年Q?br>客户一见面Q甭有事没事,
都得问hӞ您准备换框架不?
pȝq得能够集群
讉K量再也得同时开Q0几台服务?br>一天2Q小时在U?br>火星撞地球了都能提供服务
服务器上跑得都是weblogic、websphere
你要用一jbossQ都不好意思跟人家打招?br>你说q系l,得做多长旉Q?br>Q怎么C得5q吧Q)
Q年Q那是一期工E,
Q0qvQ?br>你得揣摩老板的心理,
愿意花5q开发一套系l的老板Q?br>Ҏ׃在乎再多{5q_
什么是软g工程你知道么Q?br>软g工程是Q搞什么都不用最好的Q用最复杂?br>所以我们口号就是:
不求最好,但求最复杂?/p>
基本思想Q?/strong> 堆的定义: N个元素的序列K1,K2,K3,...,Kn.UCؓ堆,当且仅当该序列满特性: 排序q程Q?br> 根堆排序实玎ͼ HeapSort.java >>>数组排序?lt;<<
堆排序是一树Ş选择排序Q在排序q程中,R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲l点和孩子结点之间的内在关系来选择最的元素?/p>
Ki≤K2i Ki ≤K2i+1(1?I?[N/2])
堆实质上是满_下性质的完全二叉树Q树中Q一非叶子结点的关键字均大于{于其孩子结点的关键字。例如序?0,15,56,25,30,70是一个堆Q它对应的完全二叉树如上图所C。这U堆中根l点Q称为堆Ӟ的关键字最,我们把它UCؓ根堆。反之,若完全二叉树中Q一非叶子结点的关键字均大于{于其孩子的关键字,则称之ؓ大根堆?/p>
堆排序正是利用小根堆Q或大根堆)来选取当前无序Z关键字小Q或最大)的记录实现排序的。我们不妨利用大根堆来排序。每一排序的基本操作是:当前无序区调整Z个大根堆Q选取关键字最大的堆顶记录Q将它和无序Z的最后一个记录交换。这P正好和直接选择排序相反Q有序区是在原记录区的尾部Ş成ƈ逐步向前扩大到整个记录区?package javasort;
// 参考:http://blog.csdn.net/EmaYoung/archive/2007/09/29/1806228.aspx
public class HeapSort {
//调整无序序列为大根堆 s 为数l的起始下标Qm为终止下?/span>
public void HeapAdjust(int[] arr, int s, int m) {
int temp = arr[s];
for (int j = 2 * s + 1; j < m; j = j * 2 + 1) {
if (j + 1 < m && arr[j] > arr[j + 1]) {
++j;
}
if (temp < arr[j]) {
break;
}
arr[s] = arr[j];
s = j;
arr[s] = temp;
}
}
//Ҏ大根堆,对堆排序
public void HeapSorting(int[] arr) {
//把顺序表构徏成ؓ一个大根堆
for (int i = arr.length / 2 - 1; i >= 0; --i) {
HeapAdjust(arr, i, arr.length);
}
for (int j = arr.length - 1; j > 0; --j) {
int temp = arr[0];
arr[0] = arr[j];
arr[j] = temp;
HeapAdjust(arr, 0, j);
}
}
}
Main.java
package javasort;
public class Main {
public static void main(String[] args) {
int[] arry_int = {49, 38, 65, 97, 76, 13, 27, 55};
show("数组排序?, arry_int);
System.out.println();
HeapSort hsort = new HeapSort();
hsort.HeapSorting(arry_int);
show("数组排序?, arry_int);
}
private static void show(String message, int[] array) {
System.out.println(">>>" + message + "<<<");
for (int i = 0; i < array.length; i++) {
System.out.print(" " + array[i]);
}
}
}
执行l果Q?/pre>
49 38 65 97 76 13 27 55
>>>数组排序?lt;<<
97 76 65 55 49 38 27 13
]]>