背景
起因是要做一个LDA主题分析的实践案例,需要数据来源,人民网的留言数据特别的适合,想着能不能用人民网留言数据来做一个LDA,种种原因还是放弃了,但是第一次弯弯绕绕地通过爬虫拿到了数据,还是想记录一下。
值得说明的是,这篇博客写于2025年11月9日,其中的加密逻辑可能会随着时间而变动。
那么就开始吧
最初的最初,我们都是孩子
以抓取西安市的数据为例,选取一个进行抓取,这里图省事,直接用八爪鱼在最开始的下面的页面进行抓取,这里需要特别注意这个留言ID,因为具体页面的链接就是一串地址和这个留言ID拼接而成的

看到那个了嘛,这里的
tid就是留言ID
tid

嘿嘿,也许你会想,这不就简单了,这看起来又是个静态页面,我们直接请求对应的不就完了,但是在我尝试之后,每次都是空列表,事情就变得有趣起来了
xpath
让我看看是怎么个事
打开浏览器抓包工具,让我看看是什么歌情况,为啥每次都是空列表

看来这个content就是我们想要的数据包,emmm~再看一眼他的请求方法是方法,请求载荷是下面这个样子的
post

也就是说,我们在发起请求的时候,要携带、
appCode、
param和
signature,我观察了一下,打开其他留言
token也是一样的,那么
appCode就是已知的了;在看
appCode这个也是已知的,这就是留言ID;
param就是个空字符串,这里不知道是啥意思,就先放着吧;接下来这就是
token的事情了,fine~这玩意一看就是MD5加密来的,但是是怎么加密的呢?
signature
再深入一点
在源代码里找这玩意是如何进行加密的,搜索这个字段,于是发现了这个
signature

那看来就是这个函数了,网上翻翻,很容易就找到
i函数,长这个样子
i

打上断点,看看这些东西都是个啥

emmm~也就是说,拼接完成之后检查
var i = e + JSON.stringify(t) + c是否有值,如果有值的话就拼接到
a后面(但是这里浏览器抓包工具一直提示没有值,就不用管了),然后传给的函数
i里面,加下来让我们进去看看
n()函数里面是个啥
n

OK~这么大个MD5,引证了我的想法,就是对传入的这个数据进行MD5加密
也就是说对进行MD5加密,那么咱们来看看这三个
var i = e + JSON.stringify(t) + c、
e、
t(看来写这个JavaScript的程序员想起了ETC)都是些啥
c
:固定值
e
/v1/threads/content:已知值,用户留言ID
t
{"tid":"20378563"}:一串神秘的固定值
c
"a2eb17f65d6f4b3f"
拼接之后就是
t = "/v1/threads/content"tid":"240060990"}a2eb1f65d6f4b3f"
我们把放到菜鸟工具的MD5加密中看一下
/v1/threads/content"tid":"240060990"}a2eb1f65d6f4b3f

看看我们之前的是个啥
signature

OK~成功对应上了,接下来就是实现了
原来是这么做的嘛
具体实现的时候据需要遵守一定的原则了,我看了一眼,好像没有找到文件,那就需要遵守君子协议了,这里我采用了
robots.txt
听从服务器的指令安排,如果服务端返回 429 或者包含 Retry-After,遵循其指示等待后再重试/返回每爬取一次休眠3~7秒,爬取16条数据进行一次模拟终止休眠,终止休眠为88~96秒
具体的源代码在下面的代码仓库中
https://gitee.com/jinzhe-zhang/liuyan_people_data_get


