【实现一套爬虫数据抓取平台】[2-2-01] 案例1:快资讯
【实现一套爬虫数据抓取平台】[2-2-01] 案例1:快资讯_Bottle's Blog-CSDN博客
文章目录
零、系列目录
一、案例资源
二、案例分析
三、处理过程
定位处理文件
定位处理方法
代码翻译
四、结语
零、系列目录
写这套文章的时候,不会完全按照目录的顺序一篇一篇写, 大家可以到目录中直接找到对应的章节进行查看。
点我跳转
一、案例资源
目标站点
https://www.360kuai.com/
1
示例页面
https://www.360kuai.com/9b091e35e504e3239
1
示例代码
https://github.com/BottleMan/BottleSpider/tree/main/00_%E7%AB%99%E7%82%B9%E5%A4%84%E7%90%86/01_www_360kuai_com
二、案例分析
首先,打开示例页面,可以看到,我们需要的内容主要是图中圈起来的部分:
但是查看请求的返回的网页源码,里面并没有找到文章内容。
所以基本可以确认,页面的内容是需要经过二次渲染才能得到的。
一般的渲染方式有两种:
1、发送请求,返回结果后 js 渲染
2、JS 直接渲染
上面两种方式的区别就是,第一种的真实数据是要页面加载完成后发起请求,收到请求的返回值之后才能渲染;而第二种,页面的数据会直接返回来,但数据可能不是直接在 html 元素里面,而是在 js 的某个变量里,页面加载完成后再写到 html 元素上。
我们这次要说的 快资讯 就是第二种。
稍微有一点点特殊的就是,这个站点的数据不是直接拿来就能用的(不是明文,是密文),前端在使用前需要解密,我们需要做的,就是找到他的解密方式,然后仿制(复制)一份,这样我们就拿到了需要的数据了。
三、处理过程
定位处理文件
首先分析页面内的数据,可以看到 window.__INITIAL_DATA__ 这个变量最特殊,是一个手动赋值的数据,而且特别长,需要的数据很有可能在这个里面。
观察浏览器的请求内容,其中有一个叫 detail.js 的文件,名字很像。
把这个请求屏蔽掉,刷新页面,页面无法正常加载,进一步证明数据渲染在这个文件的可能性很大。
定位处理方法
在 Source 中找到 detail.js 文件,去里面找 __INITIAL_DATA__ 相关记录,一通分析下来,找到了下面这样一个处理方法。
顺藤摸瓜,找到下面一段代码。单步跟踪后发现,在执行过这段代码之后 __INITIAL_DATA__ 的值会改变。所以就确定是这一段代码了。
代码翻译
好了,剩下的工作就简单了,把这段代码翻译成我们需要的代码。从上面的 js 可以看出,这个方法传递进来的就是一个参数(应该是待处理的字符串),返回的是一个经 Base64 解码的字符串,如果大家的环境支持直接运行 js 代码,那直接拿走用就可以了。
这里我的环境是 Python,所以我做了一下简单的处理。
以下是核心方法的代码:
def get_decode_text(txt):
"""
文本解密
"""
# 先处理掉多于的字符
txt = re.sub('[\\\\|\n]', '', txt)
# 执行解密步骤(翻译自 JS)
split = txt[0: int(1e3)]
split = list(split)
for idx, s in enumerate(split):
split[idx] = chr(ord(s) - idx % 2)
split = ''.join(split)
txt = '%s%s' % (split, txt[int(1e3):])
# 将得到的 base64 字符串进行解码
return auto_b64decode(txt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
完整代码可以在 Github 上查看,点击跳转。
这里有一点稍微注意一下,base64 格式的字符串有严格的格式要求,我们计算得到的字符串有可能无法直接用 b64decode 进行解码,需要做一些特殊处理。具体可以参见完整代码。
四、结语
好了,关于 快资讯 这个站点的内容解析方式就先跟大家分享到这里。
这是个比较简单的站点,没有太多需要处理的地方,简单逆向一下 js 就可以,大家可以拿这个项目先练练手。
祝大家变的更强。
————————————————
版权声明:本文为CSDN博主「Bottle」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhyl8157121/article/details/113937149