一、配置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修改爲warning6.複製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文件夾運行。