快手数据难采集?我用Python开发了个爬虫工具,一键搞定评论、主页、链接转换

0 阅读4分钟

开发背景

快手聚合采集软件,我是怎么从零搞出来的?
快手采集软件

这个工具前后断断续续写了两周,核心逻辑其实不复杂,但要把体验做得顺手,细节上花了不少功夫。

整体架构

全部Python,没用什么高大上的框架。

模块分工大概是这样的:

  • tkinter —— 做GUI界面。为什么选它?因为用户拿到的是一份可执行文件,tkinter打包方便,不用额外装库。界面我也没整多花哨,够用就行。
  • requests —— 发HTTP请求。快手接口的加签和cookie校验是最大的坑,后面细
  • pandas —— 保存结果到csv。每采集一页就往后追加写入,而不是全部跑完再一次性写,这样就算中间崩了,前面采的数据还在。
  • logging +TimedRotatingFileHandler —— 日志自动按天轮转,保留7天。程序跑的时候到底在干什么、有没有报错,用户看日志就能定位。

最核心的数据采集流程

先上核心代码骨架:

# 发送请求
r = requests.get(url, headers=h1, params=params)
# 解析数据
json_data = r.json()

代码就两行,但参 数组 装和请求头处理才是真正花时间的部分。

快手接口有几个硬性要求:

Cookie校验非常严格。所以我额外做了一个cookie小工具,让用户在浏览器登录快手后,小工具自动抓取当前登录态的cookie写入文件,程序启动时从这个文件读取。比自己手动翻开发者工具省心一百倍。ck小工具

不同功能对应不同接口。搜作品一个接口、采评论一个接口、主页作品又是另一个。我把它们封装成不同的类,每个类负责自己的参数组装和解析逻辑。
数据解析和持久化

评论数据结构比较有意思。评论本身有层级,一级评论下面挂二级回复。
数据结构长这样:

for data in json_data['rootCommentsV2']:
    content = data['content']  # 评论内容
    like_count = data['likeCount']  # 点赞数
    # 还有子评论...

每个评论我采集了10个字段:作品id、用户昵称、用户id、用户主页、评论时间、评论点赞数、评论级别、评论内容等。够用,也不贪多。

存储这块我做了个细节:每一页采集完成立即写入csv,而不是等全部跑完再写。为什么?你采个几万条评论,万一网络断了或者程序崩溃了,之前的劳动全白费了,换谁都不爽。

# 逐页追加写入
if os.path.exists(self.result_file2):
    header = False  # 文件已有,不加表头
else:
    header = True   # 新文件,加表头
df.to_csv(self.result_file2, mode='a+', index=False, header=header, encoding='utf_8_sig')

链接转换模块的细节

链接 转换 这部分,看似简单实则坑也不少。

快手有几种链接格式:用户主页链接、快手号(ks开头的)、app端分享的作品链接、PC端作品链接。不同场景下用户手里的链接格式不一样:
有的用户给的是「快手号:ks123456789」
有的是「kuaishou.com/profile/xxx」
还有的是app分享出来的一串带参数的长链接
每种格式都得做正则匹配和解析,转成内部统一的标识符,再去调对应的转换接口。这部分代码没那么炫酷,但确实属于不用不知道,一用发现细节比想象中多的那种。

视频下载模块

支持下载视频到本地,这个用requests的流式下载就行,代码不复杂。真正的考量点是用户下载大量视频时,要做好异常重试和磁盘空间判断,不能下到一半因为空间不足报错。我在下载前会先check一下磁盘剩余空间,不够就提示用户清理。

一些踩坑记录:

超时处理:快手接口偶尔会超时,尤其是晚上高峰期。我统一加了个retry机制,第一次失败后等待3秒重试,最多重试3次。

字段缺失:有些作品的某些字段可能是空的(比如没加话题标签、没开评论),代码里都要做空值处理,不能一遇到None就崩。

编码问题:csv保存用utf_8_sig而不是utf_8,这样Excel打开中文不会乱码。这个坑踩过一次就记住了。


整个工具做下来,最大的感受是:业务逻辑本身不复杂,真正耗时的全是各种边缘情况的处理。写代码可能只占了四分之一的时间,剩下的全在调试接口、处理异常、优化体验。

代码因为一些原因暂时不完全开源(但下方提供了Gitee地址),但上面这些思路和踩坑经验,希望能给同样在研究快手数据采集的朋友们一点参考。

Gitee仓库地址↓

gitee.com/mashukui/ku…

欢迎从技术角度沟通交流~