最近应需求使用heritrix3.1来爬取网络资源,感觉网上关于heritrix3.1还是很少,也可能是我没有找到。在这里呢想分享一下,关于url提取内容,我遇到的问题呢,种子url是一个ajax的请求地址,返回的json数据,heritrix将返回当做html来处理了,所以重写了ExtractorHTML来解析json来获取想要的uri。
原ExtractorHTML位置
package org.archive.modules.extractor;
将ExtractorHTML复制出一份修改extract方法如下:
void extract(CrawlURI curi, CharSequence cs) {
Matcher tags = TextUtils.getMatcher("<a target=\"_blank\" uigs=\"account_name_0\" href=\"(.+?)\"",cs);
String uri = curi.getURI();
/***********************************************************/
while(tags.find()){
String group = tags.group(1);
if(group!=null) {
try {
Link.addRelativeToBase(curi, 6000, group, new SimpleLinkContext("=JS_MISC"), Hop.SPECULATIVE);
break;
} catch (URIException e) {
e.printStackTrace();
}
}
}
/***********************************************************/
TextUtils.recycleMatcher(tags);
}
接下来就要修改配置文件了,crawler-beans.cxml
将原extractorHttp的位置前设置自定义的
customExtractorHTML
<bean id="customExtractorHTML" class="org.test.extractor.SougouExtractorHTML">
</bean>
<bean id="extractorHttp" class="org.archive.modules.extractor.ExtractorHTTP">
</bean>
并将<bean id="fetchProcessors" class="org.archive.modules.FetchChain">中原extractorHttp更换成自定义的customExtractorHTML
<!-- ...extract outlinks from HTML content... -->
<ref bean="sougouExtractorHTML"/>
<!-- ...extract outlinks from CSS content... -->
<ref bean="extractorCss"/>
<!-- ...extract outlinks from Javascript content... -->
<ref bean="extractorJs"/>
<!-- ...extract outlinks from Flash content... -->
<ref bean="extractorSwf"/>
那么接下来这个Job就会走我们自定义的ExtractorHttp了。
以上是我自己的一些改动,若有更好的办法望指教。