使用Heritrix進行主題抓取

一、配置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) {
		//過濾URI
		if(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";
	@Override
	protected 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文件夾運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章