无依赖极简网络爬虫组件,能在移动设备上运行的微型爬虫。
WebFetch要达到的目标:
WebFetch的使用非常简单,让小白用户快速上手,WebFetch为用户配置默认页面处理方法,默认将抓取到的页面信息使用System.out.print
输出到控制台(通过配置PageHandler修改默认操作)。
启动代码:
WebFetch webFetch = new WebFetch();
webFetch.addBeginTask("https://github.com").start();
停止代码:
webFetch.close();
WebFetch执行start()
方法后不会阻塞程序执行,可以加入多个网页地址,目前支持http与https,至少需要一个起始地址。
ps 当前版本(webfetch_v0.0.1)稳定运行环境为Java桌面环境
WebFetch提供了许多实用的设置接口,支持使用链式调用方法进行设置。以下给出最常使用方法的说明与示例。
addBeginTask(String url)
//最简单的调用方式是直接传入url
webFetch.addBeginTask("https://github.com");
addRule(String pattern)
//只抓取github.com下,带有p关键字的URL,其他解析出来的URL直接丢弃
webFetch.addRule(".*?github\.com.*?p.*?");
setMaxPageLayer(int max)
//使用层的设置可以很方便的抓取目录内容,
//例如,设置抓取两层内容,以新闻目录页面为入口,
//则其只抓取第一层的新闻目录以及第二层页面的新闻内容,避免写复杂的规则
webFetch.setMaxPageLayer(1);
例如:网站结构如下(A,B,C...均代表网页)
layer 0 1 2 3
A---B
|-C---E---F
|-D---G
A是使用addBeginTask传入的起始地址网页,A为第0层,B,C,D为第1层,E,G为第2层,F为第3层。
//设置A为起始页面,搜索层次为两层(第一层为0)
webFetch.addBeginTask("http://A").setMaxPageLayer(1).start();
抓取得到的页面集合为{A, B , C , D}。WebFetch会在内存中记录已经访问过的url,避免出现重复循环访问的情况。
setPageHandler(PageHandler pageHandler)
通过传入实现PageHandler接口对象自定义抓取到页面后的处理方法。WebFetch实现了默认的DefaultPageHandler
,直接通过System.out.print
打印到控制台,为小白用户准备的懒人接口,通过传入自定义的PageHandler可以取消默认操作。public interface PageHandler {
//finish接口返回抓取到的页面(只返回StatusCode=200的请求页面)
public void finish(Page page);
//此借口是为需要使用到数据库进行存储进行设计的,在调用WebFetch.close()后会调用此接口
public void close();
}
PageHandler
用户可以使用此接口处理被抓取到的页面,例如数据库存储等操作。WebFetch默认开启多个线程进行页面处理(与http请求线程不同),所以用户可以放心的实现此方法,不必担心是否要实现非阻塞的方法(考虑到资源受限,才用线程池进行管理,如果所有线程都阻塞则任务进入等待队列,直到有线程空闲)。
setURLParser(URLParser parser)
public interface URLParser {
public Vector<Request> parse(Request parentPage);
}
WebFetch使用正则表达式抽取<a>
中href="..."
指定的URL方法,目的是为减少对第三方的依赖,用户可以自行实现此接口,比如加入jsoup进行分析。
Request
提供public static Request createSub(String mUrl , Request parentRequest)
方法,实现处理那些相对地址情况。
比如:http://abc.def/web/index.html 中存在一个连接<a href="./page.html">
,抓取到的URL为./page.html
而用此URL发起的http请求是错误的,使用Request.createSub
方法可以修正此URL为http://abc.def/web/page.html 。
public class WebFetch {
...
//设置网络爬虫的线程数量,与页面处理分离,实现专一的网络爬取工作,默认线程数为5
public WebFetch setThreadSize(int max);
//设置一个页面的重试次数,默认为不重试
public WebFetch setRetryTimes(int times);
//代理设置
public WebFetch setProxy(String host , int port , Proxy.Type type);
//设置发起http请求的次数(无论正确与错误),默认为不限制
public WebFetch setMaxTaskSize(int max);
//设置连接超时时间,默认为8秒
public WebFetch setConnectionTimeout(int timeout);
//设置页面读取超时时间,默认为10秒
public WebFetch setReadTimeout(int timeout);
}
第一个版本还需要不断改进与完善,希望大家提出宝贵的改进意见,感谢大家的支持。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型