MENU

记录一次爬虫笔记(一)

January 28, 2021 • Read: 237 • Python

记录一次爬虫笔记(一)

本文章仅限技术交流

最近写了一个爬虫,爬取道客巴巴文档用的。道客的反爬虫做的还算不错,这里鼓励一下,在思考了两天以后,我终于完成了这个爬虫,于是写下这篇文章记录一下

1.踩点(PC端)

写爬虫的第一步就是去踩点,确认网站应该被爬取的内容在哪个位置,道客也不例外

我们随便打开一篇文章:https://www.doc88.com/p-6866483907292.html

检查一下网页的结构,我们发现文档的内容不是简单地被以图片或者什么形式被贴在网页上(后端渲染)的,他好像是用文档浏览器(js)渲染上去的,因此直接通过html获取是不太现实的了,因此我们考虑是否有网络数据传输

image-20210128161928317

果不其然,通过重新加载这个页面,我从网络传输的数据里获取到了这样的一段内容

image-20210128162605625

在浏览器打开这个链接,就会获取一份ebt文件,但是ebt文件是什么呢?我在网上搜了搜没找到,只找到了这样一些文章:EBT 道客巴巴的加密与破解

看来也就只有道客巴巴能用这种接地府的文件格式了吧,ebt文件不适合在手机或者电脑上打开(需要安装额外的软件),那我们有没有更方便的方法呢?当然有

2.踩点(移动客户端)

要说为什么大家都喜欢用chrome调试前端,我觉得chrome方便的调试工具肯定是其中一个很重要的原因

我们将这个页面切换到移动端,然后刷新数据

image-20210128163632214

重新载入的页面就变成了移动端,并且页面更加简洁

image-20210128163735342

我们查看一下这个页面的html源码,会发现这里嵌入了一段网址:

image-20210128163837050

在新建的页面打开它:

image-20210128163907795

嗯,就是它了!但是,新的问题又出现了,当我们用python requests这个页面,获取的却并没有这段链接,答案已经很明确了,这段代码是前端用脚本渲染出来的。仔细浏览一下我们请求到的html页面,我们发现,内嵌的代码不是用来渲染文档内容的,

image-20210128164325691

于是,我们看看script标签引入的js,

image-20210128164414911

找到一个叫mreading.js的文件,我们打开它

image-20210128164508240

文件很长,有一千多行,不过幸好文件没有压缩或者加密,还是能阅读的(他还有注释是最人性化的,哈哈哈),去掉生成广告的代码以后,剩下的代码量就不多了,代码大致的结构如下:

Base64解码 -> 渲染文档 -> 生成广告

整个代码文件基本的思路是:

请求某个接口 -> 解密数据 -> 渲染文档

我们先来看看请求的接口

它在这里构造了一个链接地址:

'/doc.php?act=info&p_code='+pcode+'&key=3854933de90d1dbb321d8ca29eac130a&v=1'

然后用ajax去请求,得到了一段加密的数据。我们先分析一下这个链接:
pocode:这个是每个文档链接里较长的那段数字,比如 https://m.doc88.com/p-6866483907292.html的pcode就是6866483907292
key:这玩意儿写死了的,不用管

v这个我第一次写的时候不知道,将v的值改成1以外的数字就可以获得未加密的数据,太操了

请求到的数据大致类似于这样:GSy开头的

GSyeBuVl3jfioIsW0js!oIsQ2qnmoIsV1LJjoIsUHqv5oIs!Bm1koIsW1mHmoIsW0TBSoIsV2q3QoIsV0qB!3iXiHOtTBQyZEIpZDW!i2iyEFqBS1qnEFqE52OHEFqsU0O1EFqpl1LlEFqniBWpEFqBWHmHEFqBT1jyEFqs50jFEFqsR1jhizKybHolQDQyk3jfi3iXiEONgHu1YFu5U3jfi0qMizKykDW1mDQydBovi2iyMqU0izKyTFIyVBQvi2iyDGVXiENXi2jMcoKyQoK361qkVzNXiCNXi2jhU0oUcGVXiENXi2j3coKyQoK361qkVzNXiCNXi2jhU0oUcGVXiENXi2j0coKyQoK361qkVzNXiCNXi2jhU0oUcGVXiENXi2jvcoKyQoK361qkVzNXiCNXi2jhU0oUcGVXiENXi2jscoKyQoK361qkVzNXiCNXi2jhU0oUcGVXiENXi2jBcoKyQoK361qkVzNXiCNXi2jhU0oUcGVXiENXi2jEcoKyQoK361qkVzNXiCNXi2jhU0oUcGVXiENXi2jhcoKyQoK361qkVzNXiCNXi2jhU0oUcGVXiENXi2jkcoKyQoK361qkVzNXiCNXi2jhU0oUcGVXiENXi2jMXzNXiFVXi2js51rRE3mnE3jf!1LN9zIdE3gJE3jfR0rRE3gFE3jfV2qscoKyfoK362LvRAtUizKygCuBi2jMc3gFlBg1fBoyl3jfRzKyQCupUCK360qPS1KXiHWlmoQ1UEgtjFK363ld7oKyXoK360rRE3gtE3jZE3jJasN3SrVtB0t1tsTNqttESqMno0sRetLyRsNMXCmdqGgNvHLJR0N0RqIHrGgN1wtXiArR7oKyXoK360iRE3gtE3jZE3jJasN3SrVtB0t1tsTNqttESqMno0sRetLyRsNMXCmdqGgN1tLJaFlsXEltr0OZTtTJRDmvXFjU9oKy9zIdE3gJE3jfTzNXiFtXi2lXi0OZvsjyztthRsVtq0t1ttTy0rNERqO5s0gNvsqJaCV16Eq1u0kRvtjyStt3XqMnr0ufXHLJWwqVE3gUcGVXiENXi2jvcoKyVoK36oK3XClJr0kdtuLNqtt0RsVto0kR3tTN0DlvSEtJp0OZbsQZR0NERqL1q0OltsjJa0VsXqO5k0IB9wtXiArR7oKyXoK361rRE3gtE3jZE3jJasN3SrVtB0t1tsTNqttESqMno0sRetLyRsNMXCmdqGgNW3qNarNvXrVtr0OZ3sqNs0WvXFjU9oKy9zIdE3gJE3jfWzNXiFtXi2lXi0OZvsjyztthRsVtq0t1ttTy0rNERqO5s0gNvsqJaCV16Esnr0NpWuLJZtt3XtMnr0IMTHLJWwqVE3gUcGVXiENXi2jEcoKyVoK36oK3XClJr0kdtuLNqtt0RsVto0kR3tTN0DlvSEtJp0OZbsQZRptsSEo1r0sdtsjJssNBSqI1k0IB9wtXiArR7oKyXoK362KRE3gtE3jZE3jJasN3SrVtB0t1tsTNqttESqMno0sRetLyRsNMXCmdqGgNe3qJ0sLsSEltr0NpTsjNarOvXFjU9oKy9zIdE3gJE3jf5zNXiFtXi2lXi0OZvsjyztthRsVtq0t1ttTy0rNERqO5s0gNvsqJaCV16EsVB0INTsTNaEWvXEtPV0MRNsgZRqqVE3gUcGVXiENXi2jMXzNXiFtXi2lXi0OZvsjyztthRsVtq0t1ttTy0rNERqO5s0gNvsqJaCV16EsVr0OZWtLJsrOvXEq1s0uZe3oZRqqVE3gVF3iXiHWlmoQJnHWsi2i3R0K3c3mFZHl9fDQ1U3jfiCIpUEI06oK9EzWFZHi5kDW0!2K5jDWUizKyZDuFfDQ1U3jfiCIpUEI06oK9EzWVU1i5kDW0!2K5jDWUizKyXoW1YHOsi2i3W2LBW1LhT2qPQ0jkS3iXiDO9gCu5ADmNdHr363gnZDgpnCuZZ1LvizKyeCu1boW5nDusi2iy!Cu5UBulaCqvU3iXiEotnDOlUGr360rXiFoJcDWNkoQpZDusi2i3R1q0S1jEW1qPX3iXiEOlj3jfiCIpUEI06oK9EzQJeHS5kDW0!2K5jDWVEzT3X0qnEzTPQoK8S1VXY1jhW1jv!0TkX1T350l8R1jPeEO5g3gU=

我们再来看看如何解密这段文本

请求数据相关函数

你当然可以照着这段js代码,将他用python复现一遍,但是你也可以使用execjs来运行这段代码并将他返回给python,我比较懒,选择后者

将js代码里的解密相关函数全部复制下来,保存到本地,使用node运行一遍,确认代码没有问题(样例可以用这个脚本里自带的)

//  data = 'GSyeBuVl3jfioIsWBmvVoIsUHqNnoIs!BmyloIs!BmMR...

解析出来的数据

数据也请求到了,接下来我们来看看文档图片的链接时如何构造出来的吧

图片链接构造

还是在刚才那个mreading.js文件里,我们发现有这样一段代码:

image-20210128170720679

$('#page-index-'+page).attr('src',gif_url);

上面那段代码是jQuery用来添加属性的,其中src属性就是引用文件之类的,基本确定后面的gif_url就是我们想要获得的链接了。gif_url 是由gif_host和pageinfo.url一起构造出来的,我们发现这两个是返回的数据里有的,pageinfo.url就是

image-20210128171214968

拼接链接,来一发请求:

image-20210128171357416

嗯,文档被请求到了

Archives Tip
QR Code for this page
Tipping QR Code