在网上参考了不少文章说可以继承FrontierScheduler,定制自己的爬取规则。我自己试了一下好像是不行的。
如下是我自己写了一个正则式,爬取门户网站中教育新闻。
import org.archive.crawler.datamodel.CandidateURI;
import org.archive.crawler.postprocessor.FrontierScheduler;
public class FrontierSchedulerForEduNews extends FrontierScheduler {
/**
*
*/
private static final long serialVersionUID = -5178775477602250542L;
/*
* 这里是匹配规则
* 但是好像不能执行
* String regex="^(https?://)?(edu|learning)\\.(sina)\\.(com)(\\.cn)?([\\/\\w \\. -]*)\\.(s?html)\\/?$";
* Pattern pattern = Pattern.compile(regex);
*/
public FrontierSchedulerForEduNews(String name) {
super(name);
}
protected void schedule(CandidateURI caUri) {
String uri=caUri.toString();
uri=uri.toLowerCase();
/*
* startsWith()不可用
*/
if(!(uri.endsWith("jpg")||uri.endsWith("gif")||uri.endsWith("png")||uri.endsWith("bmp")||uri.endsWith("jpeg")||uri.endsWith("ico")||uri.endsWith("swf")||uri.endsWith("pdf")||uri.endsWith("doc")||uri.endsWith("ppt")||uri.endsWith("xls")||uri.endsWith("css")||uri.endsWith("js")))
{
getController().getFrontier().schedule(caUri);
}
}
}
后来我发现继承Extractor ,是可以实现定制爬取的。
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.httpclient.URIException;
import org.archive.crawler.datamodel.CrawlURI;
import org.archive.crawler.extractor.Extractor;
import org.archive.crawler.extractor.Link;
import org.archive.io.ReplayCharSequence;
import org.archive.util.HttpRecorder;
public class SohuNewsExtractor extends Extractor {
/**
*
*/
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(SohuNewsExtractor.class.getName());
// 构造函数
public SohuNewsExtractor(String name) {
this(name, "Sohu News Extractor");
}
// 构造函数
public SohuNewsExtractor(String name, String description) {
super(name, description);
}
// 第一个正则式,用于匹配SOHU新闻的格式
public static final String PATTERN_SOHU_NEWS =
"http://news.sohu.com/[\\d]+/n[\\d]+.shtml";
// 第二个正则式,用于匹配所有的<a href="xxx">
public static final String PATTERN_A_HREF =
"<a\\s+href\\s*=\\s*(\"([^\"]*)\"|[^\\s>])\\s*>";
// 继承的方法
protected void extract(CrawlURI curi) {
// 将链接对象转为字符串
String url = curi.toString();
/*
* 下面一段代码主要用于取得当前链接的返回 字符串,以便对内容进行分析时使用
*/
ReplayCharSequence cs = null;
try {
HttpRecorder hr = curi.getHttpRecorder();
if (hr == null) {
throw new IOException("Why is recorder null here?");
}
cs = hr.getReplayCharSequence();
} catch (IOException e) {
curi.addLocalizedError(this.getName(), e,
"Failed get of replay char sequence " + curi.toString()
+ " " + e.getMessage());
logger.log(Level.SEVERE, "Failed get of replay char sequence in "
+ Thread.currentThread().getName(), e);
}
// 如果什么也没抓取到,就返回
if (cs == null) {
return;
}
// 将链接返回的内容转成字符串
String content = cs.toString();
try {
// 将字符串内容进行正则匹配
// 取出其中的链接信息
Pattern pattern = Pattern.compile(PATTERN_A_HREF, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(content);
// 若找到了一个链接
while (matcher.find()) {
String newUrl = matcher.group(2);
// 查看其是否为SOHU新闻的格式
if (newUrl.matches(PATTERN_SOHU_NEWS)) {
// 若是,则将链接加入到队列中
// 以备后续处理
addLinkFromString(curi, newUrl, "", Link.NAVLINK_HOP);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 将链接保存记录下来,以备后续处理
private void addLinkFromString(CrawlURI curi, String uri,
CharSequence context, char hopType) {
try {
curi.createAndAddLinkRelativeToBase(uri, context.toString(), hopType);
} catch (URIException e) {
if (getController() != null) {
getController().logUriError(e, curi.getUURI(), uri);
} else {
logger.info("Failed createAndAddLinkRelativeToBase "
+ curi + ", " + uri + ", " + context + ", "
+ hopType + ": " + e);
}
}
}
}
使用之前要写入Extractor 规则里,爬取时选用这个Extractor 。
分享到:
相关推荐
Heritrix支持定制化的爬取策略,可以设置爬取深度、URL过滤规则等。 2. **Heritrix架构**:Heritrix采用模块化设计,包括种子管理器、URI调度器、爬取策略、处理器链、存储模块等。每个模块都有其特定功能,如种子...
在网上找了许多关于Heritrix的资源,但是关于新版本heritrix3的资源很少,最近由于项目需要,认真读了heritrix的源码,扩展了Heritrix3指定链接提取,内容详细,可以在实际中使用。
3. **爬取策略**:Heritrix支持多种爬取策略,如深度优先、广度优先等。你可以根据需要选择合适的策略,或者自定义策略以满足特定需求。 4. **排除规则**:为了避免抓取不必要的内容或尊重网站的robots.txt协议,...
Heritrix支持深度爬取,可以设置爬取策略,如URL过滤规则、爬取深度、爬取速度等。在抓取过程中,Heritrix会遵循HTTP协议,模拟浏览器行为,同时处理各种网页格式,如HTML、PDF、图片等。抓取的数据可以被存档、分析...
同时,Heritrix支持通过XML配置文件(如`bean.xml`)来定义和连接各个模块,实现定制化的爬取流程。 在类之间,Heritrix使用依赖注入(Dependency Injection)模式进行通信。例如,`Crawler`实例化时会注入`Seeder`...
在本案例中,Heritrix被用来爬取百度音乐的相关页面,获取音乐信息,如歌曲名、歌手、歌词等。 抓取到的数据需要进一步处理,以便于后续的索引建立。页面内容通常以HTML格式存在,需要解析提取出关键信息。这一步...
Heritrix的灵活性允许用户通过配置不同的模块和策略来实现定制化爬取。这可能包括设置起始URL、定义抓取规则(如遵循或忽略某些链接)、设置下载速率限制以及选择如何处理不同类型的网络内容(如HTML、图片、PDF等)...
1. **配置与启动**:Heritrix的配置基于XML文件,用户可以根据需求调整爬虫的行为,如设置起始URL、爬取深度、爬取速度等。启动时,它会读取这些配置并初始化爬虫引擎。 2. **爬行策略**:Heritrix支持多种爬行策略...
这个“Heritrix源码”压缩包可能包含了Heritrix项目的完整源代码,以及相关的学习资料,对于深入理解Heritrix的工作原理、定制爬虫功能以及进行二次开发非常有帮助。以下将详细介绍Heritrix的关键知识点。 1. **...
Heritrix是一款由互联网档案馆(Internet Archive)开发的开源网络爬虫框架,它使用Java语言编写,支持高度定制化的需求。Heritrix的设计初衷是为了满足大规模网页归档的需求,但因其灵活的架构和丰富的API,也被广泛...
Heritrix是开源的网络爬虫工具,专为大规模网页抓取设计。...通过深入学习和定制Heritrix 1.14.4的源代码,开发者可以获得对网络爬虫技术更深入的理解,并能构建出适合自己应用场景的高效爬虫系统。
在IT行业中,爬虫是获取大量网络数据的重要手段,Heritrix因其灵活性、可扩展性和定制性而备受青睐。标题中的"heritrix1.14.0jar包"指的是Heritrix的1.14.0版本的Java档案文件(JAR),这是运行或构建Heritrix爬虫...
Heritrix是一款开源的网络爬虫工具,专为大规模、可扩展的网页抓取而设计。这个名为"Heritrix-User-Manual.rar_heritrix...通过深入学习提供的用户手册,你将能够充分利用Heritrix的功能,实现定制化的网络爬取任务。
这款强大的框架以其高度的可扩展性和灵活性著称,允许开发者根据实际需求定制爬取策略,从而实现对特定网站或网络内容的深度挖掘。 Heritrix的核心特性包括: 1. **模块化设计**:Heritrix采用组件化的结构,每个...
这款工具被设计为可扩展和高度配置的,允许用户根据特定需求定制爬取策略。在本工程中,Heritrix已经被预配置好,可以直接在Eclipse集成开发环境中运行,无需额外设置环境。 首先,让我们详细了解Heritrix的基本...
此外,它还支持自定义的模块和策略,使得爬取过程可以按照特定的需求进行定制。 `heritrix-1.14.4-src.zip` 则包含了Heritrix的源代码。对于开发者来说,这是一个非常宝贵的资源,因为它允许用户深入了解Heritrix的...
Heritrix是一个开源的、基于Java的Web爬虫框架,能够高效地爬取和抽取Web页面的信息。通过使用Heritrix,可以实现自动化的Web信息抽取,提高信息抽取的准确性和效率。 本文的主要贡献在于提出了一种基于Heritrix的...
前者是Heritrix的编译后的二进制版本,可以直接运行,而后者包含了源代码,对于希望定制或深入理解Heritrix工作原理的开发者来说非常有用。源代码可以使用Java编译器进行编译和修改。 "Myeclipse下安装说明及常见...
首先,Heritrix爬取互联网上的网页,并将其存储为本地文件。然后,这些文件可以被Lucene读取并建立索引。用户通过搜索接口提交查询,Lucene会快速查找匹配的索引条目,返回相关的搜索结果。这种组合提供了从海量网页...