您当前的位置: 首页 >  网络

FreeBook 基于 MVP 模式开发的带缓存网络爬虫,采用最流行框架搭建,干货多多

发布时间:2016-10-09 12:18:15 ,浏览量:0

项目地址: FreeBook
简介:基于 MVP 模式开发的带缓存网络爬虫,采用最流行框架搭建,干货多多

引言

基于 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:数据解析错误");
        }
    }
}            
关注
打赏
查看更多评论

暂无认证

  • 0浏览

    0关注

    115983博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录