引言
基于 MVP 模式开发的带缓存网络爬虫,采用最流行框架搭建,干货多多
网络爬虫很多同学都不陌生,但是在 Android 上玩这个还是比较少的
集中最近流行的框架和思维以一种简单易理解的方式实现,方便大家学习
至于需求什么的我就不说了,对于准备毕业项目的同学学会这个你会觉得毕业项目非常 easy
APK 下载 免费下载小说 学习的同时 还能拿到不少的干货
需求
网络爬虫能干嘛?
-
获取对应网页某些有价值数据保存到自己服务器自己使用(很多公司的数据部这么玩 不过人家叫采集 哈哈 多么温馨的字眼)
-
还有就是上面说的毕业项目 不需要搭建后台也不需要数据支持用别人的就好了
-
对于有些坏坏的人来说还可以做些羞羞的软件LCRapidDevelop里面集成了视频播放 拿去用 我是雷锋
首先让大家看看效果 No picture you say a jb? gif 录制效果不好 将就点看
还有就是项目的结构 看看我是怎么玩转 MVP 的
用到的主流框架
-
RxJava+Retrofit2+Okhttp+RxCache 实现 API 数据请求以及缓存(缓存不区分 GET&POST 缓存策略可根据自己要求修改)
-
RxJava+jsoup+RxCache 实现 HTMl 页面爬虫数据的请求以及缓存 缓存实现与 API 一致 不需要另写逻辑
-
glide 加载图片
-
LCRapidDevelop 下拉刷新 状态页 RecyclerView 适配器 RecyclerView 加载动画 等等感兴趣的自行了解 传送门
-
bga-banner 首页的 Banner 实现无限循环 还不错 集成简单
功能点
-
首页 banner 以及推荐数据 根据后台接口更新(总要有点自己可控的元素嘛 比如加个广告什么的 哈哈 比如说)
-
书库类别 以及类别的 HTML 地址等数据 通过后台接口控制 (如果哪天我觉得这个网站的资源不是很丰富 我可以很任性的直接在后台换一个)
-
数据缓存 请求 HTML 网页再从网页上抓取想要的数据其实相对 API 来说耗时会比较大 缓存就显得非常重要了
-
文件下载统一管理 并且调用系统支持的程序打开文件
首先详细讲解一下 RxJava+Retrofit2+Okhttp+RxCache 的使用 五部曲
第一步:导包
compile 'io.reactivex:rxjava:1.1.8'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
compile 'com.github.VictorAlbertos.RxCache:core:1.4.6'
第二步:新建 API 接口
/**
* API 接口
* 因为使用 RxCache 作为缓存策略 所以这里不需要写缓存信息
*/
public interface MovieService {
//获取书库分类信息
@GET("freebook/typeconfigs.json")
ObservablegetBookTypes();
//获得首页 banner 以及书籍数据
@GET("freebook/home.json")
ObservablegetHomeInfo();
//获得搜索标签
@GET("freebook/search_lable.json")
ObservablegetSearchLable();
}
第三步:新建缓存接口(Html 爬虫共用)
/**
* 缓存 API 接口
* @LifeCache 设置缓存过期时间. 如果没有设置@LifeCache , 数据将被永久缓存理除非你使用了 EvictProvider, EvictDynamicKey or EvictDynamicKeyGroup .
* EvictProvider 可以明确地清理清理所有缓存数据.
* EvictDynamicKey 可以明确地清理指定的数据 DynamicKey.
* EvictDynamicKeyGroup 允许明确地清理一组特定的数据. DynamicKeyGroup.
* DynamicKey 驱逐与一个特定的键使用 EvictDynamicKey 相关的数据。比如分页,排序或筛选要求
* DynamicKeyGroup。驱逐一组与 key 关联的数据,使用 EvictDynamicKeyGroup。比如分页,排序或筛选要求
*/
public interface CacheProviders {
//获取书库对应类别列表 缓存时间 1 天
@LifeCache(duration = 7, timeUnit = TimeUnit.DAYS)
Observable subscriber) {
try {
//开始疯狂的数据抓取啦 这个我就不解释了 大家去看看文档 http://www.open-open.com/jsoup/
Document doc = Jsoup.connect(url).get();
Elements bookIntroduction = doc.select(".con");
Elements bookname = doc.select(".bookcover h1:eq(1)");
Elements bookImageUrl = doc.select(".bookcover img");
Elements bookAuthor = doc.select(".bookcover p:eq(2)");
Elements bookType = doc.select(".bookcover p:eq(3)");
Elements bookLength = doc.select(".bookcover p:eq(4)");
Elements bookProgress = doc.select(".bookcover p:eq(5)");
Elements bookUpdateTime = doc.select(".bookcover p:eq(6)");
String[] strs=url.split("/");
String bookDownload="http://www.txt99.cc/home/down/txt/id/"+((strs[strs.length-1]));
T bookInfoDto= (T) new BookInfoDto(bookImageUrl.attr("src"),bookname.text(),bookAuthor.text(),bookType.text(),bookLength.text(),bookProgress.text(),bookUpdateTime.text(),bookDownload,bookIntroduction.html());
subscriber.onNext(bookInfoDto);
subscriber.onCompleted();
} catch (IOException e) {
throw new ApiException("ERROR:数据解析错误");
}
}
}
关注
打赏
微信扫码登录
