零、系列目录

写这套文章的时候,不会完全按照目录的顺序一篇一篇写, 大家可以到目录中直接找到对应的章节进行查看。

点我跳转

一、案例资源

目标站点

https://www.360kuai.com/

示例页面

https://www.360kuai.com/9b091e35e504e3239

示例代码
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)

完整代码可以在 Github 上查看,点击跳转

这里有一点稍微注意一下,base64 格式的字符串有严格的格式要求,我们计算得到的字符串有可能无法直接用 b64decode 进行解码,需要做一些特殊处理。具体可以参见完整代码。

四、结语

好了,关于 快资讯 这个站点的内容解析方式就先跟大家分享到这里。

这是个比较简单的站点,没有太多需要处理的地方,简单逆向一下 js 就可以,大家可以拿这个项目先练练手。

祝大家变的更强。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐