分享

MyEclipse7.0+Heritrix1.14.3的配置_Notes @ UniUni...

 旭龙 2010-12-04
 

本文内容:在MyEclipse7.0下配置Heritrix1.14.3,并修改源代码实现抓取URL中含有指定字符串的所有网页。并实现多线程下载。

1、首先下载heritrix-1.14.3.zip和heritrix-1.14.3-src.zip。将其全部解压到当前文件夹

\eritrix-1.14.3-src\和\heritrix-1.14.3\。

2、解压heritrix-1.14.3中的heritrix-1.14.3.jar,得到目录:heritrix-1.14.3。

3、将以上目录的所有文件拷贝到heritrix-1.14.3-src\heritrix-1.14.3\src\java下。

4、将\heritrix-1.14.3-src\heritrix-1.14.3下的lib目录拷贝到heritrix-1.14.3-src\heritrix-1.14.3\src\java下。

5、将heritrix-1.14.3-src\heritrix-1.14.3\src下的webapps目录拷贝到heritrix-1.14.3-src\heritrix-1.14.3\src\java下,此时工程目录基本完整。

6、在MyEclipse中新建一个Java Project,选择从现有源代码建立,源代码路径指向:heritrix-1.14.3-src\heritrix-1.14.3\src\java,命名为Heritrix,点击OK。

7、接下来将jar包导入项目。右键单击Heritrix项目,选择Build Path->Configure Build Path,选中 Libraries选项,选择Add External JARS,将lib下的所有jar包加入到Build Path。

8、在Window->Preference->Java->Compiler中,将Complier compliance level设为5.0,目的是为了使Heritrix编译通过。否则Eclipse可能不认assert这个关键字。

9、设置项目根目录下的heritrix.properties文件,设置:"heritrix.cmdline.admin=admin:admin",也就是设置heritrix控制台登录的用户名和密码。找到/heritrix/org.archive.crawler/Heritrix.java右键点击,选择Run As Java Application,(不建议此时运行,建议修改源码完毕后再运行)正常运行时输出如下信息:

06:15:52.312 EVENT Starting Jetty/4.2.23
06:15:53.781 EVENT Started WebApplicationContext[/,Heritrix Console]
06:15:53.937 EVENT The scratchDir you specified: E:\????\SearchEngingForDlut\heritrix-1.14.3-src\heritrix-1.14.3\src\java\target\jsp-compiled-development is unusable.
06:15:54.218 EVENT Started SocketListener on 127.0.0.1:8080
06:15:54.218 EVENT Started
org.mortbay.jetty.Server@a01335
Heritrix version: 1.14.3

10、在浏览器中输入http://localhost:8080/,用户名、密码都是"admin",登陆之后就可以正常使用了,至此配置完毕。

下面修改Heritrix部分源码,达到抓取URL中含有指定字符串的目的:如抓取URL字符串中含有"dlut"的所有网页。

1、首先打开Heritrix/org.archive.crawler.postprocessor/FrontierScheduler.java,里面有一个方法:protected void schedule(CandidateURI caUri);这个方法是直接将当前的候选连接加入到抓取队列当中了。因此我们可以构造一个FrontierScheduler的派生类,对候选连接的内容做一些判断,保证抓取到的连接都是含有"dlut"的网址。

2、新建一个类,叫做FrontierSchedulerForDlut,派生于org.archive.crawler.postprocessor.FrontierScheduler类,

所属的包为:org.archive.crawler.postprocessor。单击Finish。代码如下:

package org.archive.crawler.postprocessor;
import org.archive.crawler.datamodel.CandidateURI;
public class FrontierSchedulerForDlut extends FrontierScheduler {
public FrontierSchedulerForDlut(String name){
super(name);
}

protected void schedule(CandidateURI caUri){
String uri=caUri.toString();
if(uri.indexOf("dns:")!=-1){
getController().getFrontier().schedule(caUri);
}
else if(uri.indexOf("dlut")!=-1
&&(uri.indexOf(".html")!=-1
||uri.indexOf(".htm")!=-1
||uri.indexOf(".jsp")!=-1
||uri.indexOf(".asp")!=-1
||uri.indexOf(".aspx")!=-1)){
System.out.println(uri);
getController().getFrontier().schedule(caUri);

}
}
}

这里我们只抓取网页,并且抓取的网页中须含有dlut。
3、在modules文件夹中的Processor.options中添加一行"org.archive.crawler.postprocessor.FrontierSchedulerForDlut|FrontierSchedulerForDlut"的内容。

4、取消robots.txt的限制:找到org.archive.crawler.prefetch保重的PreconditionEnforcer这个类,将方法considerRobotsPreconditions的全部代码注释掉,添加return false。

5、至此,可以实现抓取URL中含有"dlut"的所有网页了,但为了使程序多线程运行,还需修改HostNamesQueueAssignmentPolicy类的getClassKey方法。打开org.archive.crawler.frontier.HostnameQueueAssignmentPolicy这个类,修改其getClassKey方法,代码如下:

public String getClassKey(CrawlController controller, CandidateURI cauri) {

String uri = cauri.getUURI().toString();

long hash = ELFHash(uri);

String a = Long.toString(hash % 100);

return a;

}

public long ELFHash(String str)

{

long hash = 0;

long x = 0;

for(int i = 0; i < str.length(); i++)

{

hash = (hash << 4) + str.charAt(i);

if((x = hash & 0xF0000000L) != 0)

{

hash ^= (x >> 24);

hash &= ~x;

}

}

return (hash & 0x7FFFFFFF);

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多