SeimiCrawler
An agile,powerful,standalone,distributed crawler framework.Support spring boot and redisson.
SeimiCrawler 的目标是成为 Java 里最实用的爬虫框架,大家一起加油。
If you like this project, please give it a Star. Read detail in English | 日本語 | 한국어 | Русский | Français | Deutsch | Italiano | Español.
简介
SeimiCrawler 是一个敏捷的,独立部署的,支持分布式的 Java 爬虫框架,希望能在最大程度上降低新手开发一个可用性高且性能不差的爬虫系统的门槛,以及提升开发爬虫系统的开发效率。在 SeimiCrawler 的世界里,绝大多数人只需关心去写抓取的业务逻辑就够了,其余的 Seimi 帮你搞定。设计思想上 SeimiCrawler 受 Python 的爬虫框架 Scrapy 启发,同时融合了 Java 语言本身特点与 Spring 的特性,并希望在国内更方便且普遍的使用更有效率的 XPath 解析 HTML,所以 SeimiCrawler 默认的 HTML 解析器是JsoupXpath(独立扩展项目,非 jsoup 自带),默认解析提取 HTML 数据工作均使用 XPath 来完成(当然,数据处理亦可以自行选择其他解析器)。并结合SeimiAgent彻底完美解决复杂动态页面渲染抓取问题。
最新进展、资讯订阅
- 微信订阅号
里面会发布一些使用案例等文章,以及 seimi 体系相关项目的最新更新动态,后端技术,研发感悟等等。
V2.0 版本新特性
完美支持 SpringBoot,demo 参考
回调函数支持方法引用,设置起来更自然
push(Request.build(s.toString(),Basic::getTitle));
- 非 SpringBoot 模式全局配置项通过
SeimiConfig
进行配置,包括 Redis 集群信息,SeimiAgent 信息等,SpringBoot 模式则通过 SpringBoot 标准模式配置
SeimiConfig config = new SeimiConfig();
config.setSeimiAgentHost("127.0.0.1");
//config.redisSingleServer().setAddress("redis://127.0.0.1:6379");
Seimi s = new Seimi(config);
s.goRun("basic");
SpringBoot 模式,在 application.properties 中配置
seimi.crawler.enabled=true
# 指定要发起 start 请求的 crawler 的 name
seimi.crawler.names=basic,test
seimi.crawler.seimi-agent-host=xx
seimi.crawler.seimi-agent-port=xx
#开启分布式队列
seimi.crawler.enable-redisson-queue=true
#自定义 bloomFilter 预期插入次数,不设置用默认值 ()
#seimi.crawler.bloom-filter-expected-insertions=
#自定义 bloomFilter 预期的错误率,0.001 为 1000 个允许有一个判断错误的。不设置用默认值(0.001)
#seimi.crawler.bloom-filter-false-probability=
分布式队列改用 Redisson 实现,底层依旧为 redis,去重引入 BloomFilter 以提高空间利用率,一个线上的BloomFilter 调参模拟器地址
JDK 要求 1.8+
原理示例
基本原理
集群原理
社区沟通讨论
- QQ 群:
557410934
这个就是给大家自由沟通啦
快速开始
添加 maven 依赖(以中央 maven 库最新版本为准,下仅供参考):
<dependency>
<groupId>cn.wanghaomiao</groupId>
<artifactId>SeimiCrawler</artifactId>
<version>2.1.4</version>
</dependency>
在包crawlers
下添加爬虫规则,例如:
@Crawler(name = "basic")
public class Basic extends BaseSeimiCrawler {
@Override
public String[] startUrls() {
return new String[]{"http://www.cnblogs.com/"};
}
@Override
public void start(Response response) {
JXDocument doc = response.document();
try {
List<Object> urls = doc.sel("//a[@class='titlelnk']/@href");
logger.info("{}", urls.size());
for (Object s:urls){
push(Request.build(s.toString(),Basic::getTitle));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void getTitle(Response response){
JXDocument doc = response.document();
try {
logger.info("url:{} {}", response.getUrl(), doc.sel("//h1[@class='postTitle']/a/text()|//a[@id='cb_post_title_url']/text()"));
//do something
} catch (Exception e) {
e.printStackTrace();
}
}
}
然后随便某个包下添加启动 Main 函数,启动 SeimiCrawler:
public class Boot {
public static void main(String[] args){
Seimi s = new Seimi();
s.start("basic");
}
}
以上便是一个最简单的爬虫系统开发流程。
工程化打包部署
Spring boot(推荐)
推荐使用 spring boot 方式来构建项目,这样能借助现有的 spring boot 生态扩展出很多意想不到的玩法。Spring boot 项目打包参考 spring boot 官网的标准打包方式即可
mvn package
独立运行
上面可以方便的用来开发或是调试,当然也可以成为生产环境下一种启动方式。但是,为了便于工程化部署与分发,SeimiCrawler 提供了专门的打包插件用来对 SeimiCrawler 工程进行打包,打好的包可以直接分发部署运行了。
pom 中添加添加 plugin
<plugin>
<groupId>cn.wanghaomiao</groupId>
<artifactId>maven-seimicrawler-plugin</artifactId>
<version>1.2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<!--<configuration>-->
<!-- 默认 target 目录 -->
<!--<outputDirectory>/some/path</outputDirectory>-->
<!--</configuration>-->
</plugin>
执行mvn clean package
即可,打好包目录结构如下:
.
├── bin # 相应的脚本中也有具体启动参数说明介绍,在此不再敖述
│ ├── run.bat #windows 下启动脚本
│ └── run.sh #Linux 下启动脚本
└── seimi
├── classes #Crawler 工程业务类及相关配置文件目录
└── lib #工程依赖包目录
接下来就可以直接用来分发与部署了。
详细请继续参阅maven-seimicrawler-plugin
更多文档
目前可以参考 demo 工程中的样例,基本包含了主要的特性用法。更为细致的文档移步SeimiCrawler 主页中进一步查看
Change log
请参阅 ChangeLog.md
项目源码
BTW: 如果您觉着这个项目不错,到 github 上
star
一下,我是不介意的 ^_^