Spiderman - Java开源Web数据抽取工具
========================================
**置顶:[Spiderman2](https://gitee.com/l-weiwei/Spiderman2)最新的预览版本已经出炉啦!简洁,更高性能,采集状态持久化,分布式,支持JS脚本,赶紧来体验一把吧!PS:后面稳定版本会更新到这里**
Spiderman 是一个Java开源Web数据抽取工具。它能够收集指定的Web页面并从这些页面中提取有用的数据。
Spiderman主要是运用了像XPath,正则表达式等这些技术来实数据抽取。
它包含了两部分(二者缺一不可):
-----------------------------
* spiderman-core 内核
* spiderman-plugin 插件
主要特点
----------------------
* 微内核+插件式架构、灵活、可扩展性强
* 无需编写程序代码即可完成数据抽取
* 多线程保证性能
怎么使用?
----------
* 首先,确定好你的目标网站以及目标网页(即某一类你想要获取数据的网页,例如网易新闻的新闻页面)
* 然后,打开目标页面,分析页面的HTML结构,得到你想要数据的XPath,具体XPath怎么获取请看下文。
* 最后,在一个xml配置文件里填写好参数,运行Spiderman吧!
近期更新
----
1. <parser 的表达式支持发起HTTP请求获取内容了:
<parser exp="$Fetcher.get('http://www.baidu.com')"
2. <target节点添加 <before节点配置,该配置与<model一样可以用来解析网页内容,主要的区别是该节点会在<model节点解析之前进行工作,其解析后的结果将会作为model的上下文$before.xxx来使用
3. 重构下载器,支持多种下载器实现,允许在xml里面配置自己实现的下载器实现类,官方默认提供了三种,分别是默认的基于HttpClient的下载器、基于WebUnit的下载器、基于Selenium WebDriver的实现
<site downloader="org.eweb4j.spiderman.plugin.util.WebDriverDownloader"
或者
<site downloader="xxx.YourDownloader">
4. 与第三点一样,重构了模型解析器,使得现在支持多种不同的实现类,且允许开发者在xml上指定自己实现的解析器,目前官方提供了两种解析器,分别是DefaultModelParser,WebDriverModelParser
<before parser="xxx.xxx.xxx.YourModelParser"
或者
<model parser="xxx.YourModelParser"
5. 其他一些零碎的更新、BUG修复等。
XPath获取技巧?
--------------
* 首先,下载xpathonclick插件,[猛击这里](https://chrome.google.com/webstore/search/xpathonclick)
* 安装完毕之后,打开Chrome浏览器,可以看到右上角有个“X Path” 图标。
* 在浏览器打开你的目标网页,然后点击右上角的那个图片,然后点击网标上你想要获取XPath的地方,例如某个标题
* 这时候按住F12打开JS控制台,拖到底部,可以看到一串XPath内容
* 记住,这个内容不是绝对OK的,你可能还需要做些修改,因此,你最好还是去学习下XPath语法
* 学习XPath语法的地方:[猛击这里](http://www.w3school.com.cn/xpath/index.asp)
Spiderman Sample | 案例
=======================
* 首先保证你的机器至少可以运行Java程序、也可以执行Maven命令
* 案例程序[spiderman-sample] mvn test
* Spiderman程序将会运行N秒钟,然后到保存抓取数据的文件夹查看对应网站的数据
* 这里有篇文章介绍示例:[http://my.oschina.net/laiweiwei/blog/100866]
这是使用Spiderman的代码:
public class TestSpider {
private final Object mutex = new Object();
@Test
public void test() throws Exception {
String err = EWeb4JConfig.start();
if (err != null)
throw new Exception(err);
SpiderListener listener = new SpiderListenerAdaptor(){
public void afterScheduleCancel(){
//调度结束回调
}
/**
* 每次调度执行前回调此方法
* @date 2013-4-1 下午03:33:11
* @param theLastTimeScheduledAt 上一次调度时间
*/
public void beforeEveryScheduleExecute(Date theLastTimeScheduledAt){
System.err.print("[SPIDERMAN] "+CommonUtil.getNowTime("HH:mm:ss")+" [LAST_SCHEDULE_AT] ~ ");
System.err.println("at -> " + CommonUtil.formatTime(theLastTimeScheduledAt));
}
public void onFetch(Thread thread, Task task, FetchResult result) {
System.out.print("[SPIDERMAN] "+CommonUtil.getNowTime("HH:mm:ss")+" [FETCH] ~ ");
System.out.println("fetch result ->" + result + " from -> " + task.sourceUrl);
}
public void onNewUrls(Thread thread, Task task, Collection<String> newUrls) {
System.out.print("[SPIDERMAN] "+CommonUtil.getNowTime("HH:mm:ss")+" [DIG] ~ ");
System.out.println(newUrls);
}
public void onDupRemoval(Thread currentThread, Task task, Collection<Task> validTasks) {
// for (Task t : validTasks){
// System.out.print("[SPIDERMAN] "+CommonUtil.getNowTime("HH:mm:ss")+" [DUPREMOVE] ~ ");
// System.out.println(t.url+" from->"+t.sourceUrl);
// }
}
public void onTaskSort(Thread currentThread, Task task, Collection<Task> afterSortTasks) {
// for (Task t : afterSortTasks){
// System.out.print("[SPIDERMAN] "+CommonUtil.getNowTime("HH:mm:ss")+" [SORT] ~ ");
// System.out.println(t.url+" from->"+t.sourceUrl);
// }
}
public void onNewTasks(Thread thread, Task task, Collection<Task> newTasks) {
// for (Task t : newTasks){
// System.out.print("[SPIDERMAN] "+CommonUtil.getNowTime("HH:mm:ss")+" [NEWTASK] ~ ");
// System.out.println(t.sort + ",,,," + t.url+" from->"+t.sourceUrl);
// }
}
public void onTargetPage(Thread thread, Task task, Page page) {
// System.out.print("[SPIDERMAN] "+CommonUtil.getNowTime("HH:mm:ss")+" [TARGET] ~ ");
// System.out.println(page.getUrl());
}
public void onInfo(Thread thread, Task task, String info) {
System.out.print("[SPIDERMAN] "+CommonUtil.getNowTime("HH:mm:ss")+" [INFO] ~ ");
System.out.println(info);
}
public void onError(Thread thread, Task task, String err, Throwable e) {
System.err.print("[SPIDERMAN] "+CommonUtil.getNowTime("HH:mm:ss")+" [ERROR] ~ ");
e.printStackTrace();
}
public void onParse(Thread thread, Task task, List<Map<String, Object>> models) {
final String projectRoot = FileUtil.getTopClassPath(TestSpider.class);
final File dir = new File(projectRoot+"/Data/"+task.site.getName()+"/"+task.target.getName());
try {
if (!dir.exists())
dir.mkdirs();
for (int i = 0; i < models.size(); i++) {
Map<String, Object> map = models.get(i);
String fileName = dir + "/count_" + task.site.counter.getCount() + i;
StringBuilder sb = new StringBuilder();
for (Iterator<Entry<String,Object>> it = map.entrySet().iterator(); it.hasNext();){
Entry<String,Object> e = it.next();
boolean isBlank = false;
if (e.getValue() == null)
isBlank = true;
else if (e.getValue() instanceof String && ((String)e.getValue()).trim().length() == 0)
isBlank = true;
else if (e.getValue() instanceof List && ((ArrayList<?>)e.getValue()).isEmpty())
isBlank = true;
else if (e.getValue() instanceof List && !((ArrayList<?>)e.getValue()).isEmpty()) {
if (((ArrayList<?>)e.getValue()).size() == 1 && String.valueOf(((ArrayList<?>)e.getValue()).get(0)).trim().length() == 0)
isBlank = true;
}
if (isBlank){
if (sb.length() > 0)
sb.append("_");
sb.append(e.getKey());
}
}
String content = CommonUtil.toJson(map);
if (sb.length() > 0)
fileName = fileName + "_no_"+sb.toString()+"_";
Fi
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
网络爬虫基本技术处理 网络爬虫是数据采集的一种方法,实际项目开发中,通过爬虫做数据采集一般有以下几种情况: 1)搜索引擎 2)竞品调研 3)舆情监控 4)市场分析 网络爬虫的整体执行流程 1)确定一个(多个)种子网页 2)进行数据的内容提取 3)将网页中的关联网页连接提取出来 4)将尚未爬取的关联网页内容放到一个队列中 5)从队列中取出一个待爬取的页面,判断之前是否爬过 6)把没有爬过的进行爬取,并进行之前的重复操作 7)直到队列中没有新的内容,爬虫执行结束 这样完成爬虫时,会有一些概念必须知道的: 深度:一般来说,表示从种子页面到当前页的打开连接数,一般建议不超过五层。 广度(宽度)优先和深度优先:表示爬取时的优先级。建议使用广度优先,按深度的层级来顺序爬取。
资源推荐
资源详情
资源评论
收起资源包目录
强力 Java 爬虫,列表分页、详细页分页、ajax、微内核高扩展、配置灵活.rar (230个子文件)
score_forecast.xml.bak2 9KB
.djunitplugin 0B
chromedriver.exe 6.61MB
.gitignore 256B
.gitignore 256B
.gitignore 256B
.gitignore 256B
.gitignore 256B
.gitignore 246B
DefaultModelParser.java 35KB
HttpClientDownloader.java 23KB
Spiderman.java 23KB
WebDriverModelParser.java 21KB
UrlUtils.java 16KB
UrlResolver.java 15KB
Site.java 13KB
TestSpiderForZWeb.java 13KB
SpiderConfig.java 11KB
Spider.java 10KB
TestSpider.java 9KB
HtmlUnitDownloader.java 8KB
TextExtractor.java 8KB
DigPointImpl.java 7KB
Match.java 7KB
WebDriverDownloader.java 7KB
ParsePointImpl.java 6KB
SpidermanControl.java 5KB
FetchPointImpl.java 5KB
PluginManager.java 5KB
URLCanonicalizer.java 5KB
DocIDServer.java 4KB
ParserUtil.java 4KB
UrlRuleChecker.java 3KB
TaskPushPointImpl.java 3KB
Model.java 3KB
Util.java 3KB
SpiderListenerAdaptor.java 3KB
DupRemovalPointImpl.java 2KB
XmlParseHandler.java 2KB
SpiderListener.java 2KB
ExtensionPoints.java 2KB
Field.java 2KB
FetchRequest.java 2KB
Page.java 2KB
TaskSortPointImpl.java 2KB
Status.java 2KB
Task.java 1KB
TaskQueue.java 1KB
FetchResult.java 1KB
Log.java 1KB
BeginPointImpl.java 1KB
Plugin.java 1KB
Orgnization.java 1KB
Target.java 1KB
Author.java 1KB
Parser.java 1KB
PageFetcher.java 1KB
Settings.java 1KB
Rule.java 1KB
SourceUrlChecker.java 826B
HttpUtil.java 817B
Cookie.java 760B
Rules.java 740B
IframeLinkFinder.java 737B
DefaultLinkFinder.java 734B
FrameLinkFinder.java 733B
Team.java 680B
TargetPointImpl.java 668B
Impl.java 653B
Seed.java 644B
Category.java 633B
ModelParser.java 591B
Cookie.java 548B
EndPointImpl.java 533B
DefaultLinkNormalizer.java 529B
ValidHosts.java 526B
Targets.java 518B
TaskPollPointImpl.java 498B
Provider.java 488B
NSMap.java 477B
XPath.java 476B
Urls.java 475B
Header.java 470B
Option.java 468B
Extension.java 462B
ParsePoint.java 449B
Providers.java 447B
ValidHost.java 428B
Namespaces.java 410B
Options.java 407B
Cookies.java 382B
Headers.java 382B
Parsers.java 382B
Regexs.java 379B
XPaths.java 377B
DigPoint.java 375B
Seeds.java 366B
PojoPoint.java 364B
Exps.java 355B
EndPoint.java 350B
共 230 条
- 1
- 2
- 3
资源评论
野生的狒狒
- 粉丝: 1511
- 资源: 1582
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功