原文地址
http://118.25.172.253/2018/11/24/记一次爬取xxx网站的经历
背景
某天正在用手机上网的时候,不小心点到了一个广告,进到了一个漫画网站(咳咳咳...) 然后我不小心的浏览了几篇漫画,发现还是可以看一下的(手动滑稽^-^)。。
但是,重点来了,这个网站的漫画是收费的,如果想继续看漫画得充值。。
吝啬的我肯定不愿意啦,身为一个程序员,怎么能充钱呢?肯定得用一些技术手段破解啊,拿到我们想要的资源,于是乎,我成功了,为了庆祝一下,谨以此文记录。
网站分析
提示:由于这篇文章的特殊性,我不会将网站的截图放上来的。。
知己知彼,方而百战百胜
想要拿到网站的收费资源,我们得先仔细的了解这个网站。观察它的数据来源,认证方式,从而寻找它的漏洞。
网站地址:aHR0cCUzQS8vZnFhY2MuY29tLw==
上面的地址我加密了一下,这个格式。。怎么解密我就不说了哈。
我们进入上面的网站,进入分类,选漫画,这个页面里面是查询这个网站的所有漫画。打开浏览器控制台,我们可以看到如下接口
/api/cate/1-0-2-2-2 #根据点击量排序查询所有的漫画,最后一个数字是页码
我们将页码当做变量提取出来,对这个链接用java代码封装一下:
/**
* 漫画列表爬取---根据点击量
*/
public static final String COMIC_SPILDER_URL_CLICK="/api/cate/1-0-2-2-%s";
复制代码
随便选一篇漫画进去,在控制台我们可以看到漫画章节的查询接口,接口如下:
/api/chapter_list/110008-1-1-6
同理,我们也对章节查询接口进行封装一下:
/**
* 章节爬取链接 第一个参数是漫画ID 第二个参数是页码 第三个参数是每页展示数量
*/
public static final String CHAPTER_SPILDER_URL="/api/chapter_list/%s-1-%s-%S";
复制代码
上面的两个接口是没有做任何权限的判断的,所以我们可以肆无忌惮的调用
当然,上面的两个接口能拿到漫画和章节,但是章节的详情才是最重要的,我们怎么样才能拿到章节的详情呢?
我们先分析下网站的章节详情数据是怎么样加载的。。
随机点开一个免费章节,打开控制台,看ajax请求。然后吓了一跳,竟然没有ajax请求,章节详情数据不是通过接口形式返回。那么,我们看静态资源请求。然后,会发现这个请求
/read/11000008
分析这个请求,我们不难得知后面的那串数字为章节ID。
这个请求是返回了一个网页,我们点击这个请求,查看返回值如下:
看到这个,我们可以放心一下了。这个请求能将章节的详情页面全部数据返回。我们拿到网页,解析一下就可以拿到关键数据了。。
但是不要高兴的太早,我们打开收费的章节,返回值如下:
划重点:没有钱的用户看章节详情 是看不到什么的,只有钱足够,那么章节详情才会向你吐出数据
先确定好立场,我们充钱是不可能的。那么,我们的账户怎么才能拿到钱呢?我们点击收费的章节,往底部滑动,有一个完成任务获取大量阅币
的按钮,我们点击进入
看到那个签到赚50阅币的按钮了吗?我们点击,在控制台看到如下接口:
/api/sign
仔细分析一波,这个接口是让用户每天签到然后送50阅币,每次签到之间必须相隔12小时以上。
看到了这,其实章节详情的解决方案已经出现了:
- 模拟新用户访问,然后签到获取积分
- 用这个用户调章节详情接口,获取页面数据
这样的话,我们的问题就变成了,怎么模拟新用户访问,然后签到获取积分了。
收费资源爬取
首先,我们仔细研究一下这个网站怎么存储用户信息的。
打开控制台,可以发现用户信息是存在cookie里面的。
知道用户信息是存储在cookie里,我们还得知道用户是不是自动创建的。
我们将这个网站的cookie全部删除,然后刷新当前页,我们可以发现 用户变了,浏览器里有多了一份cookie
我们在控制台里 查看页面请求,在返回值 头部里可以看到如下:
这个Set-Cookie是服务器向客户端声明存储cookie,以后再向服务器发起请求时,客户端就会自动将cookie放到请求头中。
知道了上面的流程,我们就可以模拟新用户访问,然后签到获取积分了。
步骤:
- 请求
user/task
接口,获取response的'Set-Cookie'的头部信息,解析获取JSESSIONID
这里我做了一些测试,发现这个网站前后端交互是通过session来的,所以这里我们只需获取JSESSIONID 即可。
2.上面获取的jessonId对应了一个新用户的访问,我们再通过请求/api/sign
接口进行签到,获取50阅币。
3.进行签到完之后,这个JESSSIONID就有了一次访问收费资源的权限了。我们再访问收费的漫画章节,调用如下接口:/read/10007517
发现返回值吐出了所有的数据
这就是一个完整的破解收费章节的流程。
那我们怎么爬取网站的所有收费章节呢??
- 先爬取所有的漫画
- 根据漫画爬取到所有的章节
这两步用上面说到的接口直接调用就ok了
- 爬取所有的章节。如果章节需要收费,则先模拟新用户访问,然后签到,再拿资源。重复这个流程,就可以获取所有的收费漫画了。
最后
整个网站的爬取源码在这里: