httpclient+jsoup实现小说线上采集阅读

前言

  用过老版本UC看小说的同学都知道,当年版权问题比较松懈,我们可以再UC搜索不同来源的小说,并且阅读,那么它是怎么做的呢?下面让我们自己实现一个小说线上采集阅读。(说明:仅用于技术学习、研究)

  看小说时,最烦的就是有各种广告,这些广告有些是站长放上去的盈利手段,有些是被人恶意注入。我的上一篇博客中实现了小说采集并保存到本地TXT文件 HttpClients+Jsoup抓取笔趣阁小说,并保存到本地TXT文件,这样我们就可以导入手机用手机阅读软件看小说;那么我们这里实现一个可以在线看小说。

 

话不多说先看效果

 

  首页:

  页面很纯净,目前有三种来源

httpclient+jsoup实现小说线上采集阅读_第1张图片

 

   搜索结果页:

  三个不同的来源,分页用的是layui的laypage,逻辑分页。(笔趣阁的搜索结果界面没有书本的图片)

httpclient+jsoup实现小说线上采集阅读_第2张图片

 

 httpclient+jsoup实现小说线上采集阅读_第3张图片

   

  翻页效果:

 httpclient+jsoup实现小说线上采集阅读_第4张图片

 

httpclient+jsoup实现小说线上采集阅读_第5张图片

 

  纵横网连简介等都帮我们分词,搞得数据量太大,速度太慢:books.size() < 888 

 httpclient+jsoup实现小说线上采集阅读_第6张图片

 

  书本详情页:

httpclient+jsoup实现小说线上采集阅读_第7张图片httpclient+jsoup实现小说线上采集阅读_第8张图片

 

  小说阅读页:

httpclient+jsoup实现小说线上采集阅读_第9张图片

httpclient+jsoup实现小说线上采集阅读_第10张图片

 

  上、下一章:

httpclient+jsoup实现小说线上采集阅读_第11张图片

 

代码与分析

  项目是springboot项目,原理非常简单,就是用httpclient构造一个请求头去请求对应的来源链接,用jsoup去解析响应回来的response,

  通过jsoup的选择器去找到我们想要的数据,存入实体,放到ModelAndView里面,前端页面用thymeleaf去取值、遍历数据。

  但是有一些书是要会员才能看,这种情况下我们需要做模拟登陆才能继续采集,这里只是一个简单的采集,就不做模拟登陆了。

 

  采集过程中碰到的问题:

  1、起点中文网采集书本集合时,想要的数据不在页面源码里面

   起点中文网很机智,他在html代码了没有直接展示page分页信息的链接

 

  可以看到,httpClient请求回来的response里分页信息标签里面是空的,但用浏览器去请求里面有信息
httpclient+jsoup实现小说线上采集阅读_第12张图片

 


  这是因为httpClient去模拟我们的浏览器访问某个链接,直接响应回这个链接对应的内容,并不会去帮我们触发其他的ajax,而浏览器回去解析响应回来的html,当碰到img、script、link等标签它会帮我们去ajax请求对应的资源。
  由此推测,page相关的信息,起点中文网是在js代码里面去获取并追加,最后通过network找到它的一些蛛丝马迹
httpclient+jsoup实现小说线上采集阅读_第13张图片

 

  既然他没有写在html里,那我们就自己去创建连接,可以看到html上有当前页跟最大页数
 
完美
httpclient+jsoup实现小说线上采集阅读_第14张图片

 

 

 

   2、笔趣阁查看书本详情,图片防盗链

   笔趣阁有一个图片防盗,我们在自己的html引入图片路径时,但当我们把链接用浏览器访问时是可以的
httpclient+jsoup实现小说线上采集阅读_第15张图片

 

httpclient+jsoup实现小说线上采集阅读_第16张图片

  
  对比一下两边的请求头
httpclient+jsoup实现小说线上采集阅读_第17张图片 httpclient+jsoup实现小说线上采集阅读_第18张图片

 

  首先我们要知道什么事图片防盗链,猛戳这里  -->: 图片防盗链原理及应对方法 ;我们直接用大佬的反防盗链方法,并且针对我们的项目改造一下:
<div id="bookImg">div>
    /**
     * 反防盗链
     */
    function showImg(parentObj, url) {
        //来一个随机数
        var frameid = 'frameimg' + Math.random();
        //放在(父页面)window里面   iframe的script标签里面绑定了window.onload,作用:设置iframe的高度、宽度 
                    
                    

你可能感兴趣的:(httpclient+jsoup实现小说线上采集阅读)