采集小红书笔记详情页的方法,大部分人都想得复杂了

发布时间:2024年01月12日

一般来说,社交媒体都有列表页和详情页、个人主页三大页面,列表页一般包含搜索结果页、话题聚合页等等,详情页就是点开某一条笔记或者动态的具体页面;

小红书当然也不例外,比如下面这个话题聚合页:

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 请求就能获取到具体数字。

这个故事告诉我们:

他强由他强,清风拂山冈。他横任他横,明月照大江。他自狠来他自恶,我自一口真气足。

在这里插入图片描述

这个故事还告诉我们:

实践,是检验真理的唯一标准。

不妨多多点赞,读者们的支持是本号更新的最大动力。

山冈。他横任他横,明月照大江。他自狠来他自恶,我自一口真气足。

这个故事还告诉我们:

实践,是检验真理的唯一标准。

不妨多多点赞,读者们的支持是本号更新的最大动力。

文章来源:https://blog.csdn.net/ygdxt/article/details/135544523
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。