【小红书采集软件】根据关键词批量爬取小红书笔记正文、笔记链接、发布时间、转评赞藏等

一、背景介绍

1.1 爬取目标

熟悉我的小伙伴可能了解,我之前开发过2款软件:

【GUI软件】小红书搜索结果批量采集,支持多个关键词同时抓取!
【GUI软件】小红书详情数据批量采集,含笔记内容、转评赞藏等,支持多笔记同时采集!

现在介绍的这个软件,相当于以上2个软件的结合版,即根据关键词爬取笔记的详情数据。

开发界面软件的目的:方便不懂编程代码的小白用户使用,无需安装python,无需改代码,双击打开即用!

软件界面截图:软件运行界面

爬取结果截图:

结果截图1:结果截图1

结果截图2:结果截图2

结果截图3:结果截图3

以上。

1.2 演示视频

软件使用演示视频:(不懂编程的小白直接看视频,了解软件作用即可,无需看代码

【软件演示】爬小红书搜索详情软件

1.3 软件说明

几点重要说明:
软件说明

以上。

二、代码讲解

2.1 爬虫采集-搜索接口

首先,定义接口地址作为请求地址:

# 请求地址
url = 'https://edith.xiaohongshu.com/api/sns/web/v1/search/notes'

定义一个请求头,用于伪造浏览器:

# 请求头
h1 = {
	'Accept': 'application/json, text/plain, */*',
	'Accept-Encoding': 'gzip, deflate, br',
	'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
	'Content-Type': 'application/json;charset=UTF-8',
	'Cookie': '换成自己的cookie值',
	'Origin': 'https://www.xiaohongshu.com',
	'Referer': 'https://www.xiaohongshu.com/',
	'Sec-Ch-Ua': '"Microsoft Edge";v="119", "Chromium";v="119", "Not?A_Brand";v="24"',
	'Sec-Ch-Ua-Mobile': '?0',
	'Sec-Ch-Ua-Platform': '"macOS"',
	'Sec-Fetch-Dest': 'empty',
	'Sec-Fetch-Mode': 'cors',
	'Sec-Fetch-Site': 'same-site',
	'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0',
}

加上请求参数,告诉程序你的爬取条件是什么:

# 请求参数
post_data = {
	"keyword": search_keyword,
	"page": page,
	"page_size": 20,
	"search_id": v_search_id,
	"sort": v_sort,
	"note_type": v_note_type,
	"image_scenes": "FD_PRV_WEBP,FD_WM_WEBP",
}

2.2 爬虫采集-详情接口

首先,定义接口地址作为请求地址:

# 请求地址
url = 'https://edith.xiaohongshu.com/api/sns/web/v1/feed'

定义一个请求头,用于伪造浏览器:

# 请求头
h1 = {
	'Accept': 'application/json, text/plain, */*',
	'Accept-Encoding': 'gzip, deflate, br',
	'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
	'Content-Type': 'application/json;charset=UTF-8',
	'Cookie': '换成自己的cookie值',
	'Origin': 'https://www.xiaohongshu.com',
	'Referer': 'https://www.xiaohongshu.com/',
	'Sec-Ch-Ua': '"Microsoft Edge";v="119", "Chromium";v="119", "Not?A_Brand";v="24"',
	'Sec-Ch-Ua-Mobile': '?0',
	'Sec-Ch-Ua-Platform': '"macOS"',
	'Sec-Fetch-Dest': 'empty',
	'Sec-Fetch-Mode': 'cors',
	'Sec-Fetch-Site': 'same-site',
	'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0',
}

加上请求参数,告诉程序你的爬取条件是什么:

# 请求参数
post_data = {
	"source_note_id": note_id,
	"image_formats": ["jpg", "webp", "avif"],
	"extra": {"need_body_topic": "1"}
}

下面就是发送请求和接收数据:

# 发送请求
r = requests.post(url, headers=h1, data=data_json)
# 接收数据
json_data = r.json()

逐个解析字段数据,以"笔记标题"为例:

# 笔记标题
try:
	title = json_data['data']['items'][0]['note_card']['title']
except:
	title = ''

熟悉xhs的朋友都知道,有些笔记是没有标题的,所以这里加上try保护,防止程序报错导致中断运行。

其他字段同理,不再赘述。

下面就是发送请求和接收数据:

# 发送请求
r = requests.post(url, headers=h1, data=data_json.encode('utf8'))
print(r.status_code)
# 以json格式接收返回数据
json_data = r.json()

定义一些空列表,用于存放解析后字段数据:

# 定义空列表
note_id_list = []  # 笔记id
note_title_list = []  # 笔记标题
note_type_list = []  # 笔记类型
like_count_list = []  # 点赞数
user_id_list = []  # 用户id
user_name_list = []  # 用户昵称

循环解析字段数据,以"笔记标题"为例:

# 循环解析
for data in json_data['data']['items']:
	# 笔记标题
	try:
		note_title = data['note_card']['display_title']
	except:
		note_title = ''
	print('note_title:', note_title)
	note_title_list.append(note_title)

其他字段同理,不再赘述。

最后,是把数据保存到csv文件:

# 把数据保存到Dataframe
df = pd.DataFrame(
	{
		'关键词': search_keyword,
		'页码': page,
		'笔记id': note_id_list,
		'笔记链接': ['https://www.xiaohongshu.com/explore/' + i for i in note_id_list],
		'笔记标题': note_title_list,
		'笔记类型': note_type_list,
		'点赞数': like_count_list,
		'用户id': user_id_list,
		'用户主页链接': ['https://www.xiaohongshu.com/user/profile/' + i for i in user_id_list],
		'用户昵称': user_name_list,
	}
)
if os.path.exists(result_file):
	header = False
else:
	header = True
# 把数据保存到csv文件
df.to_csv(result_file, mode='a+', index=False, header=header, encoding='utf_8_sig')

完整代码中,还含有:判断循环结束条件、js逆向解密、笔记类型(综合/视频图文)筛选、排序方式筛选(综合/最新/最热)等关键实现逻辑。

2.3 cookie说明

其中,cookie是个关键参数。
cookie里的a1和web_session获取方法,如下:查看a1和web_session

这两个值非常重要,软件界面需要填写!!

开发者模式的打开方法:页面空白处->右键->检查。

2.4 软件界面模块

主窗口部分:

# 创建主窗口
root = tk.Tk()
root.title('小红书搜索详情采集软件v1.0 | 马哥python说 |')
# 设置窗口大小
root.minsize(width=850, height=650)
输入控件部分:
# 搜索关键词
tk.Label(root, justify='left', text='搜索关键词:').place(x=30, y=160)
entry_kw = tk.Text(root, bg='#ffffff', width=60, height=2, )
entry_kw.place(x=125, y=160, anchor='nw')  # 摆放位置

底部版权部分:

# 版权信息
copyright = tk.Label(root, text='@马哥python说 All rights reserved.', font=('仿宋', 10), fg='grey')
copyright.place(x=290, y=625)

以上。

2.5 日志模块

好的日志功能,方便软件运行出问题后快速定位原因,修复bug。

核心代码:

def get_logger(self):
	self.logger = logging.getLogger(__name__)
	# 日志格式
	formatter = '[%(asctime)s-%(filename)s][%(funcName)s-%(lineno)d]--%(message)s'
	# 日志级别
	self.logger.setLevel(logging.DEBUG)
	# 控制台日志
	sh = logging.StreamHandler()
	log_formatter = logging.Formatter(formatter, datefmt='%Y-%m-%d %H:%M:%S')
	# info日志文件名
	info_file_name = time.strftime("%Y-%m-%d") + '.log'
	# 将其保存到特定目录,ap方法就是寻找项目根目录,该方法博主前期已经写好。
	case_dir = r'./logs/'
	info_handler = TimedRotatingFileHandler(filename=case_dir + info_file_name,
						when='MIDNIGHT',
						interval=1,
						backupCount=7,
						encoding='utf-8')

日志文件截图:日志文件

以上。

三、获取源码及软件

完整python源码及exe软件,微信公众号"老男孩的平凡之路“后台回复”爬小红书搜索详情软件"即可获取。点击直达

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/614692.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开启异步线程的方法

1,开启异步线程,在启动类上加注解: 2,自定义线程池: Configuration public class PromotionConfig {Beanpublic Executor generateExchangeCodeExecutor() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExec…

ROS2 安装与测试

文章目录 ROS2 安装与测试ROS2 安装1. 设置编码2. 添加源3. 安装 ROS24. 设置环境变量 ROS2 示例测试实例一:命令行实例实例二:小海龟仿真实例 参考链接 ROS2 安装与测试 ROS2 安装 基于 Ubuntu 22.04 LTS 操作系统。 1. 设置编码 sudo apt update &…

获取Android开发板已连接WiFi密码

硬件/软件环境: 1)全志芯片开发板A40i 2)Android Studio Giraffe | 2022.3.1 Patch 3 连接条件: 1)两端都是USB-A接口线,一端插入电脑端USB接口,另一端插入开发板USB接口; 2)Andr…

Spring-Bean 作用域

作用域 作用域案例 public class BeanScopeDemo {AutowiredQualifier("singletonPerson")Person person;AutowiredQualifier("prototypePerson")Person person1;AutowiredQualifier("prototypePerson")Person person2;AutowiredSet<Person&g…

perf 中的 cpu-cycles event 介绍

perf 中的 cpu-cycles event 介绍 cycles简介 cycles事件记录处理器核心执行的时钟周期数。每个时钟周期代表处理器内部时钟振荡器的一个周期。这个事件通常用于衡量处理器的执行速度&#xff0c;因为它直接反映了指令执行所需的时间。一个较高的cycles计数可能意味着代码执行…

【数据结构】顺序表与链表的差异

顺序表和链表都是线性表&#xff0c;它们有着相似的部分&#xff0c;但是同时也有着很大的差异。 存储空间上的差异&#xff1a; 对于插入上的不同点&#xff0c;顺序表在空间不够时需要扩容&#xff0c;而如果在使用realloc函数去扩容&#xff0c;会有原地扩容和异地扩容两种情…

Blender细节补充

1.饼状菜单&#xff0c;用于快速切换/选择 例如&#xff1a; ~&#xff1a;切换视图 Z&#xff1a;切换着色方式 &#xff0c;&#xff1a;切换坐标系 .&#xff1a;切换基准点 Shift S&#xff1a;吸附 有两种使用方式&#xff1a; -点选 -滑选&#xff0c;按快捷键…

在Tiled中制作动画瓦片图

什么是瓦片图&#xff1f;瓦片图是指用图块把游戏场景评出来 工具安装链接&#xff1a;Tiled | Flexible level editor 资源下载教程 资源下载&#xff1a;Mystic Woods - 16x16 Pixel Art Asset Pack by Game Endeavor 解压后得到一些资源 新建图块集合 Tiled的安装就不介绍…

Nginx或Tengine服务器配置SSL证书

目录 前提条件 步骤一&#xff1a;下载SSL证书 步骤二&#xff1a;在Nginx服务器安装证书 步骤三&#xff1a;验证SSL证书是否配置成功 前提条件 已通过数字证书管理服务控制台签发证书SSL证书绑定的域名已完成DNS解析&#xff0c;即您的域名与主机IP地址相互映射已在Web服…

全志ARM-SG90舵机

控制转角 向黄色信号线“灌入”PWM信号。 PWM波的频率不能太高&#xff0c;50hz&#xff0c;即周期1/频率1/500.02s&#xff0c;20ms左右数据&#xff1a; 不同的PWM波形对应不同的旋转角度&#xff0c;以20ms为周期&#xff0c;50hz为频率的PWM波 定时器需要定时20ms,关心的单…

Ubuntu24安装搜狗输入法,修复闪屏问题

下载deb安装包&#xff1a;搜狗输入法linux-首页 安装&#xff1a;sudo dpkg -i 1.deb 搜狗输入法linux-安装指导 重启&#xff0c;但是完成后闪烁。按以下步骤更改桌面配置。 sudo gedit /etc/gdm3/custom.conf 取消WaylandEnable的注释即可

Python 函数式编程

匿名函数 Python 允许用 lambda 关键字创造匿名函数。匿名顾名思义就是没有名字&#xff0c;即不需要以标准的方式来声明&#xff0c;比如说&#xff0c;使用 def 加函数名来声明。一个完整的 lambda “语句”代表了一个表达式&#xff0c;这个表达式的定义体必须和声明放在同…

CountDownLatch应用场景代码练习

目录 概念原理核心参数和方法两种应用场景实现代码应用一&#xff1a;让 主任务 等待 所有子任务执行完毕后&#xff0c;再继续执行执行结果应用二&#xff1a;让所有子任务同时执行&#xff0c;打印出发时间执行结果应用二&#xff08;扩展&#xff09;&#xff1a;让所有子任…

[沫忘录]MySQL 锁

[沫忘录]MySQL 锁 锁能够协调多线程或多进程并发访问某资源产生的数据冲突与错乱。而在数据库中&#xff0c;锁也是协调数据库访问的有效工具。 全局锁 能够锁住当前服务器所有数据库及其表。后续所有事务都只能进行读操作&#xff0c;而不能进行写操作或表属性更改。 典型…

C++入门系列-析构函数

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 析构函数 概念 析构函数&#xff0c;与构造函数功能相反&#xff0c;析构函数不是完成对对象本身的销毁&#xff0c;局部对象销毁工作是由编译器完成的&#xff0c;而对象在销…

即插即用篇 | YOLOv8 引入 Strip Pooling | 重新思考场景解析的空间池化

本改进已集成到 YOLOv8-Magic 框架。 空间池化已被证明在捕获像素级预测任务的长距离上下文信息方面非常有效,如场景解析。在本文中,我们超越了通常具有N N规则形状的常规空间池化,重新思考空间池化的构成,引入了一种新的池化策略,称为条带池化,它考虑了一个长而窄的核,…

【Linux】从零开始认识动静态库 -动态库

送给大家一句话&#xff1a; 我不要你风生虎啸&#xff0c; 我愿你老来无事饱加餐。 – 梁实秋 《我把活着欢喜过了》 ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭…

ES6-自学01

调用方法读取文件&#xff1a;如果失败就throw抛出err,成功则抛出data 2.使用promise封装&#xff0c;如果失败就改变状态为 reject(err) 如果成功就 resolve(返回成功的值) &#xff0c;然后then,就可以获取返回的值&#xff0c;值toString&#xff08;&#xff09;方法来把…

示例十一、声音传感器

通过以下几个示例来具体展开学习,了解声音传感器原理及特性&#xff0c;学习声音传感器的应用&#xff08;干货版&#xff09;&#xff1a; 示例十一、声音传感器 ino文件源码&#xff1a; //Arduino C demo void setup() {Serial.begin(9600);pinMode(5, OUTPUT); }void loo…

解决wangEditor使用keep-alive缓存后,调用editor.cmd.do()失败

前提&#xff1a;wangeditor版本&#xff1a;4.7.11 vue版本&#xff1a;vue2 问题&#xff1a;在使用wangeditor富文本编辑器时&#xff0c;需求需要通过点击一个按钮&#xff0c;手动插入定义好的内容&#xff0c;所以使用了 editor.cmd.do(insertHTML, ....) 方法新增…