`

Web-Harvest学习笔记

 
阅读更多
文章来源http://mxsfengg.blog.163.com/blog/static/2637021820085522154653/
这一章,我们来学习scraper的源码。

          首先,我们来看下scrape的构造函数,

public Scraper(ScraperConfiguration configuration, String workingDir) {
        this.configuration = configuration;
        this.runtimeConfig = new RuntimeConfig();
        this.workingDir = CommonUtil.adaptFilename(workingDir);

        this.httpClientManager = new HttpClientManager();

        this.context = new ScraperContext(this);
        this.scriptEngine = configuration.createScriptEngine(this.context);
        this.usedScriptEngines.put(configuration.getDefaultScriptEngine(), this.scriptEngine);
    }

传入的参数有两个,一个scraper的配置类,一个工作目录。其中下面是实例化ScraperConfiguration 的代码

        ScraperConfiguration config = new ScraperConfiguration("G:/web_harvest/crawlerSinger.xml");

其实就是向系统加载这个xml配置文件,这个配置文件中包括了抓取的流程,以及一些细节。

        当然,这个构造函数,还做了一些其他的事情:

         1     初始化了runtimeConfig

         2     初始化了workingDir

         3     初始化了httpClientManager

         4     初始化了context

         5     初始化了scriptEngine

         6     将scriptEngine 放进usedScriptEngines

上面出现了许多没有新类,为了下一步更好的对这个源码的理解,我觉得有必要对这些类进行一些探讨。

       一、ScraperConfiguration ,以下是ScraperConfiguration 的部分源码,

    public class ScraperConfiguration {

    //以下是四个常量的声明,从这里我们也可以看出web-harvest支持的动态语言有三种包括beanshell, javascript
    //和groovy。默认的编码是utf-8

    public static final String BEANSHELL_SCRIPT_ENGINE = "beanshell";
    public static final String JAVASCRIPT_SCRIPT_ENGINE = "javascript";
    public static final String GROOVY_SCRIPT_ENGINE = "groovy";

    public static final String DEFAULT_CHARSET = "UTF-8";

    // map of function definitions
    private Map functionDefs = new Catalog();//其实就是一个hashmap

    // sequence of operationDefs
    private List operations = new ArrayList();
   
    private String charset = DEFAULT_CHARSET;

    //可以看到默认情况下是支持beanshell的
    private String defaultScriptEngine = BEANSHELL_SCRIPT_ENGINE;

    private File sourceFile;
    private String url;

    /**
     *构造函数,从流中构造配置

     */
    public ScraperConfiguration(InputSource in) {
        createFromInputStream(in);

    }

/* 一个比较重要的方法,供构造函数调用,构造函数的主要的工作就是它做的*/  

private void createFromInputStream(InputSource in) {
        // loads configuration from input stream to the internal structure
        XmlNode node = XmlNode.getInstance(in);//xmlNode 是一个对xml的封装类,在此我们并不打算对它进行深 
                                                                          //究,只需记得它封装了对xml的操作。

        //设置charset,默认情况下是utf-8

        String charsetString = node.getString("charset");
        this.charset = charsetString != null ? charsetString : DEFAULT_CHARSET;

       //设置动态语言引擎类型,默认情况下支持beanshell

       String scriptEngineDesc = node.getString("scriptlang");
        if ( "javascript".equalsIgnoreCase(scriptEngineDesc) ) {
            this.defaultScriptEngine = JAVASCRIPT_SCRIPT_ENGINE;
        } else if ( "groovy".equalsIgnoreCase(scriptEngineDesc) ) {
            this.defaultScriptEngine = GROOVY_SCRIPT_ENGINE;
        } else {
            this.defaultScriptEngine = BEANSHELL_SCRIPT_ENGINE;
        }

        //遍历根元素的所有的子节点,将这些子结点放进operations中。这样初始化工作就基本ok了,下面就是对operations中的这些xml节点进行解析、执行。具体的细节后面我们分析

        List elementList = node.getElementList();
        Iterator it = elementList.iterator();
        while (it.hasNext()) {
            Object element = it.next();
            if (element instanceof XmlNode) {
                XmlNode currElementNode = (XmlNode) element;
                operations.add( DefinitionResolver.createElementDefinition(currElementNode) );
            } else {
                operations.add( new ConstantDef(element.toString()) );
            }
        }
    }

    //构造函数,具体的实现同上

     public ScraperConfiguration(File sourceFile) throws FileNotFoundException {
        this.sourceFile = sourceFile;
        createFromInputStream( new InputSource(new FileReader(sourceFile)) );
    }

    //构造函数,具体的实现同上
    public ScraperConfiguration(String sourceFilePath) throws FileNotFoundException {
        this( new File(sourceFilePath) );
    }

    //构造函数,具体的实现同上

    public ScraperConfiguration(URL sourceUrl) throws IOException {
        this.url = sourceUrl.toString();
        createFromInputStream( new InputSource(new InputStreamReader(sourceUrl.openStream())) );
    }

    //创建动态语言引擎   

    public ScriptEngine createScriptEngine(Map context, String engineType) {
        if ( JAVASCRIPT_SCRIPT_ENGINE.equalsIgnoreCase(engineType) ) {
            return new JavascriptScriptEngine(context);
        } else if ( GROOVY_SCRIPT_ENGINE.equalsIgnoreCase(engineType) ) {
            return new GroovyScriptEngine(context);
        } else {
            return new BeanShellScriptEngine(context);
        }
    }

    public ScriptEngine createScriptEngine(Map context) {
        return createScriptEngine(context, this.defaultScriptEngine);
    }

}

  由于篇幅原因,我们在下面几张分别讨论httpClientManager ,runtimeConfig ,context
分享到:
评论

相关推荐

    Web-Harvest学习笔记.doc

    Web-Harvest是一个用于Web数据挖掘的开源工具,它的核心功能是通过自定义的XML配置文件来抓取和处理目标网页中的数据。...在深入学习Web-Harvest的过程中,理解这些核心概念和技术将有助于提高数据挖掘的效率和准确性。

    [Web-Harvest数据采集之二]Web-Harvest基础-抓取java代码分析

    Web-Harvest是一款开源的数据采集工具,主要用于自动化地从网页上提取信息。在这个主题中,我们将深入探讨Web-Harvest的基础知识,特别是如何利用它来抓取Java代码进行分析。在进行数据采集时,理解配置文件、抓取类...

    [Web-Harvest数据采集之一]Web-Harvest基础-配置文件分析源码

    [Web-Harvest数据采集之一]Web-Harvest基础-配置文件分析源码

    web-harvest解析及源文件

    这个压缩包文件包含了一些与Web-Harvest相关的学习资料和源文件,帮助用户理解和应用这个强大的工具。 首先,我们来看看Web-Harvest的基本概念。Web-Harvest的核心是它的配置文件,这些文件通常以.xml结尾,它们...

    web-Harvest帮助手册

    对于想要深入学习web-Harvest的用户,可以参考提供的中文帮助手册,了解详细的使用指南和示例。同时,社区论坛、官方文档和在线教程也是很好的学习资源。 总之,web-Harvest是一个强大的Web数据提取工具,结合XPath...

    Web-Harvest手册

    Web-Harvest是一款强大的网页数据提取工具,它通过配置文件来定义复杂的网页抓取和处理逻辑。本手册将深入介绍Web-Harvest配置文件的结构和元素,帮助用户理解和运用这款工具。 首先,Web-Harvest配置文件的核心是...

    试用Web-Harvest 使用手册

    **标题:“试用Web-Harvest 使用手册”** Web-Harvest是一款强大的、开源的Web数据提取工具,它允许用户通过简单的配置文件定义规则来抓取网页内容。本手册将深入探讨如何试用Web-Harvest,理解其基本概念和核心...

    Python库 | pytest-harvest-1.7.4.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:pytest-harvest-1.7.4.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Laravel开发-laravel-harvest

    $projects = $harvest->projects()->all(); // 进行其他操作... } ``` 此外,`laravel-harvest` 可能还提供了额外的便利方法,如模型映射、数据转换等,以适应 Laravel 的 Eloquent ORM,使得与数据库的交互更加...

    java开源软件项目网络爬虫-webharvest

    The main goal behind Web-Harvest is to empower the usage of already existing extraction technologies. Its purpose is not to propose a new method, but to provide a way to easily use and combine the ...

    web-harvest

    web harvest的jar包 提供一个xml编辑环境

    Laravel开发-harvest-api

    1. **安装依赖**:首先,我们需要通过Composer安装一个Laravel客户端库,如`harvest-php-api`,它提供了一个方便的封装层,使与Harvest API交互变得更简单。在终端中运行: ``` composer require kylekatarnls/...

    Laravel开发-laravel-harvest .zip

    例如,`$harvest = App\Harvest::find(1)`可以获取ID为1的harvest数据,而`$harvest->save()`则可以保存模型的更改。 11. **Blade 模板**: Blade模板允许在视图中混合PHP代码,提供条件语句(@if, @else, @endif...

    alfred-harvest, 在收获过程中,用于跟踪时间的Alfred工作流.zip

    alfred-harvest, 在收获过程中,用于跟踪时间的Alfred工作流 ,,workflow,workflow,workflow,workflow 。让 帮你追踪时间。 这里工作流使你可以完全访问你的收获时间跟踪:查看今天的计时器启动/停止计时器查看...

    LiuLingZ#review-and-harvest#mybatis的Mapper自动映射原理1

    1、导言 2、解析 3、总结

    WebList-Harvest:这是EECS433课程项目

    从压缩包文件名称“WebList-Harvest-master”可以看出,这是一个开源项目,包含了项目的主分支源代码。用户可以下载并研究其源码,理解并学习如何实现这样的网络数据收获工具。 总结来说,WebList-Harvest项目是...

    ckanext-distributed-harvester:此扩展扩展了 CKAN 插件 ckanext-harvest 以支持分布式收获功能

    ckanext-distributed-harvester - 执行分布式 Harvest 作业的 ckan 扩展 此扩展扩展了 CKAN 插件 ckanext-harvest 以支持分布式收获功能。 插件安装 该扩展目前仅与 Message Broker 软件 RabbitMQ 兼容: :要安装...

Global site tag (gtag.js) - Google Analytics