文章来源
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是一个用于Web数据挖掘的开源工具,它的核心功能是通过自定义的XML配置文件来抓取和处理目标网页中的数据。...在深入学习Web-Harvest的过程中,理解这些核心概念和技术将有助于提高数据挖掘的效率和准确性。
Web-Harvest是一款开源的数据采集工具,主要用于自动化地从网页上提取信息。在这个主题中,我们将深入探讨Web-Harvest的基础知识,特别是如何利用它来抓取Java代码进行分析。在进行数据采集时,理解配置文件、抓取类...
[Web-Harvest数据采集之一]Web-Harvest基础-配置文件分析源码
这个压缩包文件包含了一些与Web-Harvest相关的学习资料和源文件,帮助用户理解和应用这个强大的工具。 首先,我们来看看Web-Harvest的基本概念。Web-Harvest的核心是它的配置文件,这些文件通常以.xml结尾,它们...
对于想要深入学习web-Harvest的用户,可以参考提供的中文帮助手册,了解详细的使用指南和示例。同时,社区论坛、官方文档和在线教程也是很好的学习资源。 总之,web-Harvest是一个强大的Web数据提取工具,结合XPath...
Web-Harvest是一款强大的网页数据提取工具,它通过配置文件来定义复杂的网页抓取和处理逻辑。本手册将深入介绍Web-Harvest配置文件的结构和元素,帮助用户理解和运用这款工具。 首先,Web-Harvest配置文件的核心是...
**标题:“试用Web-Harvest 使用手册”** Web-Harvest是一款强大的、开源的Web数据提取工具,它允许用户通过简单的配置文件定义规则来抓取网页内容。本手册将深入探讨如何试用Web-Harvest,理解其基本概念和核心...
资源分类:Python库 所属语言:Python 资源全名:pytest-harvest-1.7.4.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
$projects = $harvest->projects()->all(); // 进行其他操作... } ``` 此外,`laravel-harvest` 可能还提供了额外的便利方法,如模型映射、数据转换等,以适应 Laravel 的 Eloquent ORM,使得与数据库的交互更加...
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的jar包 提供一个xml编辑环境
1. **安装依赖**:首先,我们需要通过Composer安装一个Laravel客户端库,如`harvest-php-api`,它提供了一个方便的封装层,使与Harvest API交互变得更简单。在终端中运行: ``` composer require kylekatarnls/...
例如,`$harvest = App\Harvest::find(1)`可以获取ID为1的harvest数据,而`$harvest->save()`则可以保存模型的更改。 11. **Blade 模板**: Blade模板允许在视图中混合PHP代码,提供条件语句(@if, @else, @endif...
alfred-harvest, 在收获过程中,用于跟踪时间的Alfred工作流 ,,workflow,workflow,workflow,workflow 。让 帮你追踪时间。 这里工作流使你可以完全访问你的收获时间跟踪:查看今天的计时器启动/停止计时器查看...
1、导言 2、解析 3、总结
从压缩包文件名称“WebList-Harvest-master”可以看出,这是一个开源项目,包含了项目的主分支源代码。用户可以下载并研究其源码,理解并学习如何实现这样的网络数据收获工具。 总结来说,WebList-Harvest项目是...
ckanext-distributed-harvester - 执行分布式 Harvest 作业的 ckan 扩展 此扩展扩展了 CKAN 插件 ckanext-harvest 以支持分布式收获功能。 插件安装 该扩展目前仅与 Message Broker 软件 RabbitMQ 兼容: :要安装...