使用Heritrix进行主题抓取

来源:互联网 发布:edius6软件下载 编辑:程序博客网 时间:2024/06/11 06:50

一、配置Heritrix项目

1.下载heritrix编译后的字节码包与源码包

heritrix-1.14.4.zip

heritrix-1.14.4-src.zip

   注:以下文件未强调时均为源码包中的文件。

2.创建Java Project项目

3.复制src/java目录下的com、org、st包到项目的src下

4.将lib文件夹复制到项目根目录下,并将所有jar添加到Bulid Path

5.右键项目Properties

->Java Compiler

->Errors/Warnings

->Configure WorkPlace Settings

->Deprecated and restricted API 把error修改为warning

6.复制conf到根目录下 修改heritrix.properties中以下两项

heritrix.version = @VERSION@为heritrix.version = 1.14.4

heritrix.cmdline.admin = admin:admin (即登录账号与密码均为admin)

7.复制webapps到根目录下,复制字节码包下webapps的admin.war到webapps

8.复制src\resources\org\archive\util中的tlds-alpha-by-domain.txt到org.archive.util包

9.添加conf:

->run configurations

->classpath(此时注意项目名称是否为你选择的项目名,若不是则手动选择)

->Advanced

->Add Folders

->选择项目下的conf文件夹 

->Run

控制台输出如下:


10.访问127.0.0.1:8080并登录(默认情况下是8080端口)

11.创建任务Jobs

->With defaults 输入job名、描述、url地址(如http://www.chzu.edu.cn)


->选择Modules

->Select Writers Processors选择org.archive.crawler.writer.MirrorWriterProcessor并Add


->选择Setting


->user-agent:修改版本号、from处填写符合邮箱格式的邮箱地址


->提交作业Submit job

->Console

->Start

->Refresh

如下:


抓取结果存储在项目根目录下的jobs文件夹中:


可以看出结果中存在一些与chzu.edu.cn不相关的网站数据,下面我们对其进行简单过滤。

二、主题抓取

1 . 使用FrontierScheduler类过滤抓取的域名

在org.archive.crawler.postprocessor包中创建MyFrontierScheduler类,继承FrontierScheduler,并重写protected void schedule(CandidateURI caUri)方法,以下我们过滤域名中存在"chzu.edu.cn"的网站。

package org.archive.crawler.postprocessor;import org.archive.crawler.datamodel.CandidateURI;public class MyFrontierScheduler extends FrontierScheduler {private static final long serialVersionUID = -1074778906898000967L;public MyFrontierScheduler(String name) {super(name);}protected void schedule(CandidateURI caUri) {//过滤URIif(caUri.toString().contains("chzu.edu.cn")){getController().getFrontier().schedule(caUri);}         }}

在配置文件conf\modules\Processor.options中配置MyFrontierScheduler类


在job中选择自定义的FrontierScheduler如下


2 . 使用Extractor抽象类过滤url

编写继承org.archive.crawler.Extractor的子类实现其抽象方法,以下以抓取滁州学院信息学院官网为例。

package org.archive.crawler.extractor;import java.io.IOException;import java.util.regex.Matcher;import java.util.regex.Pattern;import org.archive.crawler.datamodel.CrawlURI;import org.archive.io.ReplayCharSequence;import org.archive.util.HttpRecorder;public class ExtractorChzu extends Extractor {private static final long serialVersionUID = 8082386142013745017L;public ExtractorChzu(String name, String description) {super(name, description);}public ExtractorChzu(String name) {super(name, "CSCI");}//匹配a标签中的有效链接//<a href='/s/15/t/199/e0/e4/info123108.htm' target=_blank title="xxxxxxx">private static final String A_HREF="<a(.*)href\\s*=\\s*(\'/\\w/\\d+/\\w/\\d+/\\w+/\\w+/info\\d+.htm\')(.*)>";private static final String DOMAIN="http://csci.chzu.edu.cn";@Overrideprotected void extract(CrawlURI curi) {String url ="";try {HttpRecorder hr = curi.getHttpRecorder();if(hr==null){throw new IOException("HttpRecorder IOException");}ReplayCharSequence rc= hr.getReplayCharSequence();if(rc==null){return;}String content = rc.toString();Pattern pattern = Pattern.compile(A_HREF, Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher(content);while(matcher.find()){url = matcher.group(2).replaceAll("'", "");curi.createAndAddLinkRelativeToBase(DOMAIN+url, content, Link.NAVLINK_HOP);}} catch (Exception e) {e.printStackTrace();}}}


在配置文件中配置


在job配置页面选择


三、错误解决

运行时报错:
ERROR:  '无法编译样式表'
FATAL ERROR:  'java.net.MalformedURLException'
           :null
2016-08-10 23:39:11.870 严重 thread-40 org.archive.crawler.framework.WriterPoolProcessor.getFirstrecordBody() Failed transform javax.xml.transform.TransformerConfigurationException: java.net.MalformedURLException
2016-08-10 23:39:11.878 严重 thread-40 org.archive.io.arc.ARCWriter.getMetadataLength() Unsupported metadata type: null

解决:
heritrix里面的arcMetaheaderBody.xsl文件就copy到Eclipse 工程src目录下运行下即可

运行时报错:
Heritrix version: 1.14.4
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/cli/UnrecognizedOptionException
at org.archive.crawler.Heritrix.doCmdLineArgs(Heritrix.java:607)
at org.archive.crawler.Heritrix.main(Heritrix.java:556)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.cli.UnrecognizedOptionException
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 2 more


解决:
在Run Configurations中的Classpath下单击Restore Default Entries,重新选择conf文件夹运行。

0 0
原创粉丝点击