一般来说,社交媒体都有列表页和详情页、个人主页三大页面,列表页一般包含搜索结果页、话题聚合页等等,详情页就是点开某一条笔记或者动态的具体页面;
小红书当然也不例外,比如下面这个话题聚合页:
https://www.xiaohongshu.com/page/topics/5bfd5dcb0af6350001652788?fullscreen=true&naviHidden=yes&xhsshare=CopyLink
就是列表页,列表页通常只有笔记的部分数据,这是因为列表页要显示很多笔记,每个笔记就只能显示梗概信息,比如封面图、标题、点赞数,而更具体的内图、内容、转发评论收藏数,则只能去详情页获取,详情页链接一般带有笔记的 id:
https://www.xiaohongshu.com/explore/6596bb80000000001802b5d7
所以,使用 {} 爬虫获取到列表信息后,如果需要更详细的笔记数据则去详情页获取。
As we all known,小红书的反爬做的还算比较到位,很多接口需要验证签名比较麻烦;So,对于有经验的小红书爬虫选手来说,他会直奔签名去。
说巧不巧,我有两个朋友,就是这样干的,然后他问我有没有简单的办法。
其实呢,这个接口,直接使用 requests.get
就能获取数据,快刀斩乱麻。
import requests
headers = {
'authority': 'www.xiaohongshu.com',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'zh-CN,zh;q=0.9,en-CN;q=0.8,en;q=0.7,es-MX;q=0.6,es;q=0.5',
'cache-control': 'max-age=0',
'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'same-origin',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
}
response = requests.get('https://www.xiaohongshu.com/explore/6596bb80000000001802b5d7', headers=headers)
print(response.text)
打印响应如下:
打印可以直接出来页面数据,再加上上图第一行,我大致确定详情页应该是采用是服务端渲染(Server Side Rendering,简称 SSR),
即在服务端就把网页内容渲染好了,浏览器直接获取渲染好的 HTML,这有利于缩短首屏加载时间和搜索引擎优化 SEO,
而浏览器渲染 (Client Side Rendering,简称 CSR),浏览器需要先加载后端返回的 HTML 和 JavaScript,然后渲染网页,耗时肯定比 SSR 长,
而且由于搜索引擎爬虫可以直接读取服务器端生成的 HTML,因此 SSR 对 SEO 较为友好,有利于搜索引擎收录,
又因为小红书网页版是采用 Vue 这种数据驱动视图的前端框架开发,就更有必要采用 SSR 来做 SEO 了,
这就是为什么经常能在浏览器中搜索到小红书社区的笔记的原因,学以致用了有木有。
SSR 对搜索引擎爬虫友好,当然也就对一般的爬虫友好,这就是为什么 requests.get
能直接请求到数据的原因。
解析数据直接使用 xpath
就好:
from lxml import etree
html = etree.HTML(response.text)
title = html.xpath('//meta[@name="og:title"]/@content')[0].strip()
content = html.xpath('//meta[@name="description"]/@content')[0].strip()
image_url_list = html.xpath('//meta[@name="og:image"]/@content')
print(title, content, image_url_list)
comment_cnt = html.xpath('//meta[@name="og:xhs:note_comment"]/@content')[0].strip()
like_cnt = html.xpath('//meta[@name="og:xhs:note_comment"]/@content')[0].strip()
collect_cnt = html.xpath('//meta[@name="og:xhs:note_collect"]/@content')[0].strip()
print(comment_cnt, like_cnt, collect_cnt)
其打印如下:
华为nova 12系列 | 新品开售 华为nova 12 Pro、华为nova 12,今日10:08 正式开售! 12号色、樱语白、曜金黑,瞩目配色,浪漫💗在握; 前置首发三种人像美颜主题,让你自拍真实又好看; 更有鸿蒙智慧通信和HarmonyOS 4加持,流畅体验更出色。 #华为nova12 #出色蓝不住 #华为 ['http://sns-webpic-qc.xhscdn.com/202401102035/a2125d5cc798c7d63295c12f32feedfe/spectrum/1040g0k030tgsc5ci4s0049uqgf8gnvr3gn4dbro!nd_dft_wlteh_jpg_3', 'http://sns-webpic-qc.xhscdn.com/202401102035/5de18f6f298ab03bd6c7c927dcc6d11a/spectrum/1040g0k030tgsc5e6kq0049uqgf8gnvr377tqujo!nd_dft_wlteh_jpg_3']
10+ 10+ 10+
为什么数据是 10+ 呢,因为请求的 headers 没带登录凭证信息 cookie,带上 cookie 请求就能获取到具体数字。
这个故事告诉我们:
他强由他强,清风拂山冈。他横任他横,明月照大江。他自狠来他自恶,我自一口真气足。
这个故事还告诉我们:
实践,是检验真理的唯一标准。
不妨多多点赞,读者们的支持是本号更新的最大动力。
山冈。他横任他横,明月照大江。他自狠来他自恶,我自一口真气足。
这个故事还告诉我们:
实践,是检验真理的唯一标准。
不妨多多点赞,读者们的支持是本号更新的最大动力。