去年写了个网页爬虫, 放在 https://code.google.com/p/mysh-crawler/, google code 常被政府墙掉, 搞不懂代码有啥好墙的, 这里留个备份.
爬虫特点:
1. 插件驱动. 爬虫本身可视作http访问和持久化引擎, 爬虫的目标和数据处理由插件定义.
2. 高并发. 视自己的网络环境自由配置.
3. 持久化支持. 这里使用 MySQL, 要换的同学自行配置.
使用:
配置在 conf/mycrawler.properties
库表定义在 conf/sql.sql
程序入口在 mysh.crawler.core.MyshCrawler
自定义插件的行为由 Plugin 类定义.
package mysh.crawler.core;
import java.util.List;
/**
* 爬虫插件,需要线程安全的实现. 需要定义无参构造器(与它被实例化的方式有关).
*
* @author ZhangZhx
*
*/
public abstract class Plugin {
private int hashCode = 0;
@Override
public final boolean equals(Object obj) {
if (obj != null && obj.getClass().equals(this.getClass())) {
return true;
}
return false;
}
@Override
public final int hashCode() {
if (this.hashCode == 0) {
this.hashCode = this.getClass().getName().hashCode();
}
return this.hashCode;
}
/**
* 取插件定义的 URL 种子. 建议返回非空不可变对象.
*
* @return
*/
public abstract List<String> getURLSeeds();
/**
* 是否接受给定的页面.
*
* @param pageURL
* 页面地址
* @return
*/
public abstract boolean isURLAccepted(String pageURL);
/**
* 爬虫取得的页面供插件分析处理. 需要非阻塞、低计算消耗、线程安全的实现,以保证爬虫性能.
*
* @param page
* 待处理的页面
*/
public abstract void putPageAnalyseResult(PageURLAnalyser.AnalyseResult analyseResult);
/**
* 启动插件.<br/>
* 如果插件需要额外的启动指令, 或插件的某些动作需要保证在初始化完成后再执行, 可将动作放在这里.<br/>
* 此方法将在爬虫的启动器中被调用.
*/
public abstract void start();
/**
* 停止插件.
*/
public abstract void shutdown();
}