以下是heritrix中对JS的扩展,在自己写扩展的时候可以参考这个源代码或值对html或css扩展的源代码
/* Copyright (C) 2003 Internet Archive.
*
* This file is part of the Heritrix web crawler (crawler.archive.org).
*
* Heritrix is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* any later version.
*
* Heritrix is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser Public License for more details.
*
* You should have received a copy of the GNU Lesser Public License
* along with Heritrix; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Created on Nov 17, 2003
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package org.archive.crawler.extractor;
import java.io.IOException;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import org.apache.commons.httpclient.URIException;
import org.archive.crawler.datamodel.CoreAttributeConstants;
import org.archive.crawler.datamodel.CrawlURI;
import org.archive.crawler.framework.CrawlController;
import org.archive.io.ReplayCharSequence;
import org.archive.net.UURI;
import org.archive.util.DevUtils;
import org.archive.util.TextUtils;
import org.archive.util.UriUtils;
/**
* Processes Javascript files for strings that are likely to be
* crawlable URIs.
*
* @contributor gojomo
* @contributor szznax
*
*/
public class ExtractorJS extends Extractor implements CoreAttributeConstants {
private static final long serialVersionUID = -2231962381454717720L;
private static Logger LOGGER =
Logger.getLogger("org.archive.crawler.extractor.ExtractorJS");
// finds whitespace-free strings in Javascript
// (areas between paired ' or " characters, possibly backslash-quoted
// on the ends, but not in the middle)
static final String JAVASCRIPT_STRING_EXTRACTOR =
"(\\\\{0,8}+(?:\"|\'))(\\S{0,"+UURI.MAX_URL_LENGTH+"}?)(?:\\1)";
// GROUPS:
// (G1) ' or " with optional leading backslashes
// (G2) whitespace-free string delimited on boths ends by G1
protected long numberOfCURIsHandled = 0;
protected static long numberOfLinksExtracted = 0;
// URIs known to produce false-positives with the current JS extractor.
// e.g. currently (2.0.3) the JS extractor produces 13 false-positive
// URIs from http://www.google-analytics.com/urchin.js and only 2
// good URIs, which are merely one pixel images.
// TODO: remove this blacklist when JS extractor is improved
protected final static String[] EXTRACTOR_URI_EXCEPTIONS = {
"http://www.google-analytics.com/urchin.js"
};
/**
* @param name
*/
public ExtractorJS(String name) {
super(name, "JavaScript extractor. Link extraction on JavaScript" +
" files (.js).");
}
/* (non-Javadoc)
* @see org.archive.crawler.framework.Processor#process(org.archive.crawler.datamodel.CrawlURI)
*/
public void extract(CrawlURI curi) {
// special-cases, for when we know our current JS extractor does poorly.
// TODO: remove this test when JS extractor is improved
for (String s: EXTRACTOR_URI_EXCEPTIONS) {
if (curi.toString().equals(s))
return;
}
if (!isHttpTransactionContentToProcess(curi)) {
return;
}
String contentType = curi.getContentType();
if ((contentType == null)) {
return;
}
// If content type is not js and if the viaContext
// does not begin with 'script', return.
if((contentType.indexOf("javascript") < 0) &&
(contentType.indexOf("jscript") < 0) &&
(contentType.indexOf("ecmascript") < 0) &&
(!curi.toString().toLowerCase().endsWith(".js")) &&
(curi.getViaContext() == null || !curi.getViaContext().
toString().toLowerCase().startsWith("script"))) {
return;
}
this.numberOfCURIsHandled++;
ReplayCharSequence cs = null;
try {
cs = curi.getHttpRecorder().getReplayCharSequence();
} catch (IOException e) {
curi.addLocalizedError(this.getName(), e,
"Failed get of replay char sequence.");
}
if (cs == null) {
LOGGER.warning("Failed getting ReplayCharSequence: " +
curi.toString());
return;
}
try {
try {
numberOfLinksExtracted += considerStrings(curi, cs,
getController(), true);
} catch (StackOverflowError e) {
DevUtils.warnHandle(e, "ExtractorJS StackOverflowError");
}
// Set flag to indicate that link extraction is completed.
curi.linkExtractorFinished();
} finally {
// Done w/ the ReplayCharSequence. Close it.
if (cs != null) {
try {
cs.close();
} catch (IOException ioe) {
LOGGER.warning(TextUtils.exceptionToString(
"Failed close of ReplayCharSequence.", ioe));
}
}
}
}
public static long considerStrings(CrawlURI curi, CharSequence cs,
CrawlController controller, boolean handlingJSFile) {
long foundLinks = 0;
Matcher strings =
TextUtils.getMatcher(JAVASCRIPT_STRING_EXTRACTOR, cs);
while(strings.find()) {
CharSequence subsequence =
cs.subSequence(strings.start(2), strings.end(2));
if(UriUtils.isLikelyUriJavascriptContextLegacy(subsequence)) {
String string = subsequence.toString();
string = UriUtils.speculativeFixup(string, curi.getUURI());
foundLinks++;
try {
if (handlingJSFile) {
curi.createAndAddLinkRelativeToVia(string,
Link.JS_MISC, Link.SPECULATIVE_HOP);
} else {
curi.createAndAddLinkRelativeToBase(string,
Link.JS_MISC, Link.SPECULATIVE_HOP);
}
} catch (URIException e) {
// There may not be a controller (e.g. If we're being run
// by the extractor tool).
if (controller != null) {
controller.logUriError(e, curi.getUURI(), string);
} else {
LOGGER.info(curi + ", " + string + ": " +
e.getMessage());
}
}
} else {
foundLinks += considerStrings(curi, subsequence,
controller, handlingJSFile);
}
}
TextUtils.recycleMatcher(strings);
return foundLinks;
}
/*
* (non-Javadoc)
*
* @see org.archive.crawler.framework.Processor#report()
*/
public String report() {
StringBuffer ret = new StringBuffer();
ret.append("Processor: org.archive.crawler.extractor.ExtractorJS\n");
ret.append(" Function: Link extraction on JavaScript code\n");
ret.append(" CrawlURIs handled: " + numberOfCURIsHandled + "\n");
ret.append(" Links extracted: " + numberOfLinksExtracted + "\n\n");
return ret.toString();
}
}
分享到:
相关推荐
在Heritrix-1.14.4的源代码中,你可以看到以下几个关键部分: 1. **种子管理器(Seed Manager)**:这部分代码负责处理初始的URL列表,即种子,这些种子是爬虫开始工作的起点。你可以看到如何添加、删除和管理种子...
在这个"Lucene2.0+Heritrix(ch3源代码)"的压缩包中,我们主要关注的是这两个项目的第三章源代码,这将帮助我们深入理解它们的工作机制。 一、Lucene 2.0 1. **索引结构**:Lucene的核心是其倒排索引(Inverted ...
总之,通过研究"Lucene2.0+Heritrix"的源代码,开发者不仅可以学习到搜索引擎的基础原理,还能掌握实际操作中的技巧和经验。这是一条通向构建个性化、高效搜索引擎的道路,对于从事信息检索、大数据分析和网站运营的...
在本案例中,"heritrix-1.4.4 源代码(eclipse可执行)" 表示这个压缩包包含了Heritrix 1.4.4版本的所有源码,这些源码是为Eclipse IDE准备的,可以直接在Eclipse环境下编译和运行。Eclipse是一款强大的Java集成开发...
这个“Heritrix1.14.4源码+项目”压缩包包含的是Heritrix 1.14.4版本的源代码和相关项目文件,对于学习和理解Web爬虫的工作原理,以及进行自定义开发是非常有价值的。 Heritrix的核心功能是通过模拟浏览器行为来...
Heritrix的扩展性体现在能够通过自定义处理器和模块来适应不同的抓取需求。例如,`MirrorWriterProcessor`的使用就是一种扩展,它改变了默认的存档格式,使得抓取结果以网站镜像的形式存在。开发者可以进一步修改类...
本篇将结合Lucene 2.0与Heritrix的源代码,探讨这两者的协同工作原理及其在实际应用中的知识要点。 一、Lucene 2.0核心概念与技术 1.1 分词器(Tokenizer)与过滤器(Filter) Lucene首先通过分词器将输入文本切割...
在压缩包`internetarchive-heritrix3-d6d1092`中,可能包含了Heritrix3的源代码、编译好的JAR文件、示例配置文件以及相关文档。开发者可以通过这些资源了解Heritrix3的内部工作原理,对其进行二次开发或定制化配置,...
heritrix1.14.4的源码包,包含heritrix1.14.4.zip和heritrix...heritrix是一种开源的网络爬虫,用于爬去互联网中的网页。如何配置和使用heritrix爬虫,请移步:http://blog.csdn.net/kath_y/article/details/9385015
1. 现在你可以在Eclipse中浏览、编辑Heritrix的源代码了。如果需要运行Heritrix,找到主类,通常为`org.archive.crawler.framework.CrawlJob`。 2. 右键点击该类,选择"Run As" -> "Java Application"。根据配置的...
选择源代码版本的原因在于可能需要对Heritrix进行自定义扩展以满足特定需求。下载完成后,解压缩文件,你会看到两个主要的文件夹:`lib`和`src`。 `lib`文件夹包含了Heritrix运行所需的第三方类库,这些.jar文件...
标题中提到的“扩展Heritrix3指定内容提取”意味着本文档是关于如何在Heritrix3这个开源网络爬虫中增加自定义内容提取功能的详细指南。Heritrix是一个Java编写的网络爬取框架,主要用于归档网页数据,其设计核心是...
Heritrix的这些链结构使得开发者可以根据需要定制复杂的爬虫策略,通过调整和扩展各个链中的处理器,实现对网络内容的精确抓取和处理。无论是处理DNS解析、HTTP请求,还是从各种格式的文档中提取链接,Heritrix的...
2. `wherespider_1.0.4.0_source`:Heritrix的源代码,供开发者学习和扩展。 3. `wherespider_1.0.4.0_setup`:可能是Heritrix的安装程序,帮助用户快速部署。 4. `report`:可能是一个日志文件或抓取报告,记录了...
在Heritrix 1.14.4的源代码中,我们可以找到以下几个关键组件和概念: 1. **调度器(Scheduler)**:负责管理待爬取URL的队列,依据设定的策略决定下一个要抓取的网页。这可能包括优先级调度、广度优先或深度优先等...
源码中包含了完整的项目结构,如`src/main/java`存放Java源代码,`src/main/resources`存储资源配置,以及`pom.xml`,这是Maven的项目对象模型,用于构建和管理项目依赖。 Heritrix 的核心功能和知识点: - **模块...
通过源代码,你可以深入理解Heritrix的工作原理,并根据需要修改或扩展它的功能。如果你打算对Heritrix进行二次开发,或者需要解决特定问题,那么这个源代码包是必不可少的。 此外,还有一个名为“官方下载地址.txt...
1. **源代码**:包含了Heritrix的Java源代码,用户可以查看和修改这些代码以适应自己的需求。 2. **构建脚本**:如Ant或Maven脚本,用于编译和打包项目。 3. **文档**:可能包括用户指南、API文档和开发手册,帮助...
2. 在MyEclipse中创建一个新的Java项目,将解压后的Heritrix文件夹作为项目的源代码目录。 3. 配置项目的类路径,确保包含所有必要的JAR依赖。 4. 可能需要导入额外的库,如log4j等,以解决运行时的日志记录需求。 5...