我的第一个开源项目
地址
项目介绍
-
一个简单的多线程爬虫,具有断点爬取功能,以及自动推测网页编码功能
-
使用jdk11+,maven构建,我使用jdk11.0.2时会报错,见https://bugs.openjdk.java.net/browse/JDK-8213202,jdk8却没有,jdk本身的bug,所以我换了最新版的jdk11.0.4
-
解析网页主要使用了Jsoup和正则表达式,所以这两个需要会用
使用说明
-
使用见example包中的示例,我就只说一下思路:先有一个或多个具体的初始链接,假如说把这些初始链接的页面记为seed,然后定义一个规则,规则主要由Jsoup选择器(类似于css选择器)、正则、type组成。seed页面应用规则,自动获取所有符合规则的链接,记为page1(假设type设置成了page1),然后所有的page1页面再应用下一个规则,依此类推,想要多少层都可以,注意,每层的type都不应该与其他层的type相同
-
定义规则自动获取下层链接,有时候可能得不到想要的结果,这时候可以试试手动获取,然后通过调用Page中的addNext…方法将手动获取的链接添加到下一层
-
Page中还有3个参数是函数式接口的方法,作用是筛选链接,携带信息到下一层,链接映射,具体见方法说明和示例
-
如果以上没有说明白,就自行查看源代码,源代码比较简单
示例
ZongHeng zh = new ZongHeng();
zh.setCacheDirectory("f:/spider");
zh.config().setInterval(50).setBreakPoint(false);
//添加一个初始链接
zh.addSeed("http://www.zongheng.com/");
//添加一个规则,按照这个规则在初始链接页面取链接,并将取到的链接代表的页面记为category
zh.addRule("ul#data-groupdom li a", "http://www.zongheng.com/category/\\d+.html", "category");
//添加规则,在category页面取链接
zh.addRegex("http://book.zongheng.com/book/\\d+.html", "book");
zh.start();
局限
由于自动缓存的原因,编写好规则并爬取后,如果再次修改规则,如加入筛选条件等,由于从缓存中取数据,此时筛选条件对已经爬取的网页不起作用,要使它起作用,请删除缓存
感谢
- elves:参考了该项目思想
- WebCollector:参考了该项目思想
- Jsoup:用于下载和解析网页
- h2 database:提供缓存
- DbUtils:操作数据库