`
jyjsjd
  • 浏览: 19813 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

关于定制Heritrix1.14爬取

 
阅读更多

在网上参考了不少文章说可以继承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 。
分享到:
评论

相关推荐

    网络爬虫Heritrix1.14.4可直接用

    Heritrix支持定制化的爬取策略,可以设置爬取深度、URL过滤规则等。 2. **Heritrix架构**:Heritrix采用模块化设计,包括种子管理器、URI调度器、爬取策略、处理器链、存储模块等。每个模块都有其特定功能,如种子...

    扩展Heritrix3指定链接爬取

    在网上找了许多关于Heritrix的资源,但是关于新版本heritrix3的资源很少,最近由于项目需要,认真读了heritrix的源码,扩展了Heritrix3指定链接提取,内容详细,可以在实际中使用。

    heritrix爬虫工具的使用

    3. **爬取策略**:Heritrix支持多种爬取策略,如深度优先、广度优先等。你可以根据需要选择合适的策略,或者自定义策略以满足特定需求。 4. **排除规则**:为了避免抓取不必要的内容或尊重网站的robots.txt协议,...

    搜索引擎Lucene+Heritrix(第二版)4

    Heritrix支持深度爬取,可以设置爬取策略,如URL过滤规则、爬取深度、爬取速度等。在抓取过程中,Heritrix会遵循HTTP协议,模拟浏览器行为,同时处理各种网页格式,如HTML、PDF、图片等。抓取的数据可以被存档、分析...

    heritrix 3.1

    同时,Heritrix支持通过XML配置文件(如`bean.xml`)来定义和连接各个模块,实现定制化的爬取流程。 在类之间,Heritrix使用依赖注入(Dependency Injection)模式进行通信。例如,`Crawler`实例化时会注入`Seeder`...

    基于Lucene的小型搜索引擎

    在本案例中,Heritrix被用来爬取百度音乐的相关页面,获取音乐信息,如歌曲名、歌手、歌词等。 抓取到的数据需要进一步处理,以便于后续的索引建立。页面内容通常以HTML格式存在,需要解析提取出关键信息。这一步...

    很好的heritrix学习资料

    Heritrix的灵活性允许用户通过配置不同的模块和策略来实现定制化爬取。这可能包括设置起始URL、定义抓取规则(如遵循或忽略某些链接)、设置下载速率限制以及选择如何处理不同类型的网络内容(如HTML、图片、PDF等)...

    heritrix1.14.4源码+项目

    1. **配置与启动**:Heritrix的配置基于XML文件,用户可以根据需求调整爬虫的行为,如设置起始URL、爬取深度、爬取速度等。启动时,它会读取这些配置并初始化爬虫引擎。 2. **爬行策略**:Heritrix支持多种爬行策略...

    heritrix源码

    这个“Heritrix源码”压缩包可能包含了Heritrix项目的完整源代码,以及相关的学习资料,对于深入理解Heritrix的工作原理、定制爬虫功能以及进行二次开发非常有帮助。以下将详细介绍Heritrix的关键知识点。 1. **...

    heritrix爬虫安装部署

    Heritrix是一款由互联网档案馆(Internet Archive)开发的开源网络爬虫框架,它使用Java语言编写,支持高度定制化的需求。Heritrix的设计初衷是为了满足大规模网页归档的需求,但因其灵活的架构和丰富的API,也被广泛...

    heritrix1.14.4(内含src)

    Heritrix是开源的网络爬虫工具,专为大规模网页抓取设计。...通过深入学习和定制Heritrix 1.14.4的源代码,开发者可以获得对网络爬虫技术更深入的理解,并能构建出适合自己应用场景的高效爬虫系统。

    heritrix1.14.0jar包

    在IT行业中,爬虫是获取大量网络数据的重要手段,Heritrix因其灵活性、可扩展性和定制性而备受青睐。标题中的"heritrix1.14.0jar包"指的是Heritrix的1.14.0版本的Java档案文件(JAR),这是运行或构建Heritrix爬虫...

    Heritrix-User-Manual.rar_heritrix

    Heritrix是一款开源的网络爬虫工具,专为大规模、可扩展的网页抓取而设计。这个名为"Heritrix-User-Manual.rar_heritrix...通过深入学习提供的用户手册,你将能够充分利用Heritrix的功能,实现定制化的网络爬取任务。

    Heritrix爬虫框架 完整版

    这款强大的框架以其高度的可扩展性和灵活性著称,允许开发者根据实际需求定制爬取策略,从而实现对特定网站或网络内容的深度挖掘。 Heritrix的核心特性包括: 1. **模块化设计**:Heritrix采用组件化的结构,每个...

    Heritrix搭建好的工程

    这款工具被设计为可扩展和高度配置的,允许用户根据特定需求定制爬取策略。在本工程中,Heritrix已经被预配置好,可以直接在Eclipse集成开发环境中运行,无需额外设置环境。 首先,让我们详细了解Heritrix的基本...

    heritrix-1.14.4.zip 和 heritrix-1.14.4-src.zip

    此外,它还支持自定义的模块和策略,使得爬取过程可以按照特定的需求进行定制。 `heritrix-1.14.4-src.zip` 则包含了Heritrix的源代码。对于开发者来说,这是一个非常宝贵的资源,因为它允许用户深入了解Heritrix的...

    【毕业设计】基于Heritrix的Web信息抽取.doc

    Heritrix是一个开源的、基于Java的Web爬虫框架,能够高效地爬取和抽取Web页面的信息。通过使用Heritrix,可以实现自动化的Web信息抽取,提高信息抽取的准确性和效率。 本文的主要贡献在于提出了一种基于Heritrix的...

    Heritrix-1.4.4.src.zip +Heritrix-1.4.4.zip

    前者是Heritrix的编译后的二进制版本,可以直接运行,而后者包含了源代码,对于希望定制或深入理解Heritrix工作原理的开发者来说非常有用。源代码可以使用Java编译器进行编译和修改。 "Myeclipse下安装说明及常见...

    lucene_heritrix 搜索引擎

    首先,Heritrix爬取互联网上的网页,并将其存储为本地文件。然后,这些文件可以被Lucene读取并建立索引。用户通过搜索接口提交查询,Lucene会快速查找匹配的索引条目,返回相关的搜索结果。这种组合提供了从海量网页...

Global site tag (gtag.js) - Google Analytics