案例介绍:
链接:https://www.xiaohongshu.com/discovery/item/62b46c380000000021037a12
今天学习抓取某红书web版的社区精选的文章内容,我们选择其中的一篇,然后用谷歌开发者工具查看我们可以得知页面数据来自于:
请求地址:https://www.xiaohongshu.com/discovery/item/62b46c380000000021037a12
请求方法: GET
在请求这个链接的时候,需要带上cookies值才能拿到正确的数据,cookies所携带的4个参数:
- xhsTrackerId
- extra_exp_ids
- timestamp2
- timestamp2.sig
(其实只需要timestamp2和timestamp2.sig即可,本着学习的目的,尝试破解每个一个参数)
案例解析:
下面我们就一一来分析下这几个参数是如何生成的。
通过观察请求过程可以看到,对于这个请求至少请求了三次,才最终得到页面内容。
第一次请求的Response Headers中可以看到进行了cookie值的设置,而且正是我们要破解的1,2两个参数:
url_base = 'https://www.xiaohongshu.com/discovery/item/62b46c380000000021037a12'
referer = 'https://www.xiaohongshu.com/web-login/canvas?redirectPath=http://www.xiaohongshu.com/discovery/item/62b46c380000000021037a12'
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
headers = {
'referer': referer,
'user-agent': user_agent
}
resp = requests.get(url=url_base, headers=headers, allow_redirects=False)
for cookie in resp.cookies:
print(cookie.name + "\t" + cookie.value)
C:\ProgramData\Miniconda3\python.exe /102小红书/xhs_detail.py
extra_exp_ids wx_launch_open_app_decrement_clt,wx_launch_open_app_duration_origin,recommend_comment_hide_clt1,recommend_comment_hide_v2_exp1,recommend_comment_hide_v3_exp,supervision_exp,supervision_v2_exp,commentshow_exp1,gif_exp1,ques_exp1
xhsTrackerId 16b87e90-0bb9-44e8-c4e5-0e7f5be5042a
搞定!这里有个知识点需要注意,在访问页面的时候,有些网站为了反爬,设置了302重定向问题,如果我们通过request库的get只能访问到200的页面,而302的页面无法访问到,这样的结果就是无法拿到set的cookie值。那么这是,只需要在get方法内设置allow_redirects为False就可以了。
下面我们继续破解剩下的参数,通过跟踪请求发现另外两个参数是在registerCanvas方法调用的时候生成的。
请求地址:https://www.xiaohongshu.com/fe_api/burdock/v2/shield/registerCanvas?p=cc
请求方法:POST
cooke携带的参数就是刚刚我们解析出来的那两个,但payload中还有两个参数id,sign是未知参数,啥时候生成的呢?我们在XHR为registerCanvas方法加断点,通过反复调试,细心观察得出这两个值是在下面这个方法生成:
HCUnF: function(n, t) {
return n(t)
},
继续跟进去这个方法:
...
var u = I.qrTqB(l, I.PNXDL, JSON[r(1347)](i))
, c = I[r(570)](v, I[r(791)](u, I[r(222)]));
...
因为在调用栈的下一个栈中这两个参数对应的参数名就是u和c,所以很容易就找到了这两个参数。经过研究分析,u和c的值取决于i的值,而i代表的是浏览器指纹,我们可以假定i的值确定,那么u和c的值也是一定的,所以最终id和sign可以确定为是两个常量:
data = {
'id':'5995b84d64e89165d65a5fcda6a92243',
'sign': '713c02f1ffc1412d6a76c53e3a...'
}
#cookies由上一步生成
headers = {
'cookie':cookies,
'user-agent': user_agent
}
url = 'https://www.xiaohongshu.com/fe_api/burdock/v2/shield/registerCanvas?p=cc'
resp = session_.post(url=url, headers=headers, data=data, allow_redirects=False)
for cookie in resp.cookies:
print(cookie.name + "\t" + cookie.value)
C:\ProgramData\Miniconda3\python.exe /102小红书/xhs_detail.py
timestamp2 1656404025531fefca74f13f90727ed11265d91e0bcecbcb55b2bb7511ccd19
timestamp2.sig gsvlCIEkAZ7BXi87IIRaD1NCXp4zJcEgw5iOaFC3uBw
搞定!4个参数都解析出来了,那样我们就可以抓取到文字内容了~
如若转载,请注明出处:https://www.ixoh.com/13789.html