【实现一套爬虫数据抓取平台】[2-2-01] 案例1:快资讯
文章目录零、系列目录一、案例资源二、案例分析三、处理过程定位处理文件定位处理方法代码翻译四、结语零、系列目录写这套文章的时候,不会完全按照目录的顺序一篇一篇写, 大家可以到目录中直接找到对应的章节进行查看。点我跳转一、案例资源目标站点https://www.360kuai.com/示例页面https://www.360kuai.com/9b091e35e504e3239示例代码https://gi
零、系列目录
写这套文章的时候,不会完全按照目录的顺序一篇一篇写, 大家可以到目录中直接找到对应的章节进行查看。
一、案例资源
目标站点
https://www.360kuai.com/
示例页面
https://www.360kuai.com/9b091e35e504e3239
二、案例分析
首先,打开示例页面,可以看到,我们需要的内容主要是图中圈起来的部分:
但是查看请求的返回的网页源码,里面并没有找到文章内容。
所以基本可以确认,页面的内容是需要经过二次渲染才能得到的。
一般的渲染方式有两种:
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
就可以,大家可以拿这个项目先练练手。
祝大家变的更强。
更多推荐
所有评论(0)