Python实战:爬取小红书

有读者在公众号后台询问爬取小红书,今天他来了。

本文可以根据关键词,在小红书搜索相关笔记,并保存为excel表格。

爬取的字段包括笔记标题、作者、笔记链接、作者主页地址、作者头像、点赞量。

一、先看效果

1、爬取搜索页

2、爬取结果保存到本地excel表格

运行我写的爬虫,实验了几十次,都可以顺利爬到数据,每次大概可以爬取到 200 条笔记保存到 excel 表格。

遇到的坑都在实验过程中解决了,可以说,这个爬虫很好用。

3、每个excel表格的详情

以“繁花”为关键词,去搜索小红书相关笔记,保存到本地 excel 文件。打开 excel 查看详情如下,笔记是根据点赞量降序排列的。

以“上海旅游”为关键词,去搜索小红书相关笔记,保存到本地 excel 文件。打开 excel 查看详情如下,笔记是根据点赞量降序排列的。

以“春节”为关键词,去搜索小红书相关笔记,保存到本地 excel 文件。打开 excel 查看详情如下,笔记是根据点赞量降序排列的。

二、分析思路

由于小红书反爬机制很严格,很难批量获取小红书的大量数据。用爬虫去爬小红书数据,还有被小红书封号的风险。

但是我这个方法是纯模拟人的操作,以人的操作习惯去搜索和刷新数据,不会触发小红书的反爬机制。

分析爬虫思路,概括如下:

1、打开小红书主页

2、登录

3、根据关键词搜索笔记

4、提取页面数据

5、循环刷新页面,循环获取数据

6、处理获取到的数据,去重,排序

7、保存到本地 excel 文件

三、开始写代码

1、登录

使用 DrissionPage 库,打开小红书主页https://www.xiaohongshu.com,设置 20 秒延时,这时可以使用手机扫码登录账号。

from DrissionPage import ChromiumPage
def sign_in():
    sign_in_page = ChromiumPage()
    sign_in_page.get('https://www.xiaohongshu.com')
    print("请扫码登录")
    # 第一次运行需要扫码登录
    time.sleep(20)

只有第 1 次运行代码需要登录,浏览器会保存登录状态信息。第 2 次之后再运行代码,就免登录了,可以把 sign_in()步骤注释掉。

2、设置搜索关键词

设置关键词 keyword,并通过 urllib 库,将关键词转为 url 编码

from urllib.parse import quote
# 搜索关键词
keyword = "繁花"

# 关键词转为 url 编码
keyword_temp_code = quote(keyword.encode('utf-8'))
keyword_encode = quote(keyword_temp_code.encode('gb2312'))

3、搜索结果

根据设置的关键词,打开搜索页面,搜索相关笔记

def search(keyword):
    global page
    page = ChromiumPage()
    page.get(f'https://www.xiaohongshu.com/search_result?keyword={keyword}&source=web_search_result_notes')

4、定位信息

使用 DrissionPage 库定位元素方法,定位到包含笔记信息的 sections、 定位标题、作者、点赞等信息。

# 定位包含笔记信息的sections
container = page.ele('.feeds-page')
sections = container.eles('.note-item')
# 定位文章链接
note_link = section.ele('tag:a', timeout=0).link
# 定位标题、作者、点赞
footer = section.ele('.footer', timeout=0)
# 定位标题
title = footer.ele('.title', timeout=0).text
# 定位作者
author_wrapper = footer.ele('.author-wrapper')
author = author_wrapper.ele('.author').text
# 定位作者主页地址
author_link = author_wrapper.ele('tag:a', timeout=0).link
# 定位作者头像
author_img = author_wrapper.ele('tag:img', timeout=0).link
# 定位点赞
like = footer.ele('.like-wrapper like-active').text

5、向下滑动页面刷新数据

为了防止被检测到,每次下滑页面设置一个 0.5,秒至 1.5 秒之前的随机睡眠时间。使用 DrissionPage 库 scroll.to_bottom()操作页面方法,将页面划到底部,小红书会刷新出新的数据。

import time
import random
def page_scroll_down():
    print("********下滑页面********")
    # 生成一个随机时间
    random_time = random.uniform(0.5, 1.5)
    # 暂停
    time.sleep(random_time)
    # time.sleep(1)
    # page.scroll.down(5000)
    page.scroll.to_bottom()

6、循环下滑页面获取数据

调用 get_info()函数自动提取页面数据,调用 page_scroll_down()函数自动下滑页面。设置向下滑动 20 次页面,就可以自动刷新数据、提取数据了。

# 设置向下翻页爬取次数
times = 20
def craw(times):
    for i in tqdm(range(1, times + 1)):
        get_info()
        page_scroll_down()

7、保存数据

创建一个 contents 列表,用来存放所有爬取到的信息。

# contents列表用来存放所有爬取到的信息
contents = []
contents.append([title, author, note_link, author_link, author_img, like])

8、保存到excel

使用 pandas 库,将 contents 列表转为 DataFrame 数据类型,保存为 excel 文件。

# 保存到excel文件
name = ['title', 'author', 'note_link', 'author_link', 'author_img', 'like']
df = pd.DataFrame(columns=name, data=data)

这里可以进行细节处理,比如删除重复数据。数据类型转换,将点赞量字符串类型转为 int 类型。根据点赞量降序排序,方便查看热门笔记。

df['like'] = df['like'].astype(int)
# 删除重复行
df = df.drop_duplicates()
# 按点赞 降序排序
df = df.sort_values(by='like', ascending=False)

9、自动调整excel表格列宽

由于笔记标题和作者名称包含的字数较多,可以自动调整这 2 列宽度满足数据在 excel 表格中不被遮挡,可以全部展示出来。

笔记链接、作者主页链接、作者头像链接全是链接,也很长,但是不需要全部展示,可以将这几列设置固定列宽。

import openpyxl
def auto_resize_column(excel_path):
    """自适应列宽度"""
    wb = openpyxl.load_workbook(excel_path)
    worksheet = wb.active
    # 循环遍历工作表中的1-2列
    for col in worksheet.iter_cols(min_col=1, max_col=2):
        max_length = 0
        # 列名称
        column = col[0].column_letter
        # 循环遍历列中的所有单元格
        for cell in col:
            try:
                # 如果当前单元格的值长度大于max_length,则更新 max_length 的值
                if len(str(cell.value)) > max_length:
                    max_length = len(str(cell.value))
            except:
                pass
        # 计算调整后的列宽度
        adjusted_width = (max_length + 2) * 2
        # 使用 worksheet.column_dimensions 属性设置列宽度
        worksheet.column_dimensions[column].width = adjusted_width

        # 循环遍历工作表中的3-5列
        for col in worksheet.iter_cols(min_col=3, max_col=5):
            max_length = 0
            column = col[0].column_letter  # Get the column name

            # 使用 worksheet.column_dimensions 属性设置列宽度
            worksheet.column_dimensions[column].width = 15

    wb.save(excel_path)

四、录屏

以一个爬取过程为例,录屏如下:

视频可以在我公众号同名文章查看。

五、全部代码

由于代码太长,在这里只给出主函数代码,有兴趣的读者可以根据上述信息自己补全代码。

if __name__ == '__main__':
    # contents列表用来存放所有爬取到的信息
    contents = []

    # 搜索关键词
    keyword = "繁花"
    # 设置向下翻页爬取次数
    times = 20

    # 第1次运行需要登录,后面不用登录,可以注释掉
    # sign_in()

    # 关键词转为 url 编码
    keyword_temp_code = quote(keyword.encode('utf-8'))
    keyword_encode = quote(keyword_temp_code.encode('gb2312'))

    # 根据关键词搜索小红书文章
    search(keyword_encode)

    # 根据设置的次数,开始爬取数据
    craw(times)

    # 爬到的数据保存到本地excel文件
    save_to_excel(contents)

六、总结

小红书是商业化很成功的平台,我知道有很多小伙伴在小红书平台做副业,收入甚至超过主业。

我的这个代码,可以帮助你选题、找热点,找流量博主学习。

小红书的数据应该很有价值,特别有兴趣的小伙伴可以在公众号私聊我,以一杯瑞幸咖啡的价格获取全部代码(毕竟我写代码写了一下午~~~)。

我还会继续写小红书别的内容的爬虫,本次付费可以免费获得后续更新的代码。名额有限,仅限前5位小伙伴,先到先得。

每一份能满足他人需求的努力都值得被付费。

本文首发在“程序员coding”公众号,欢迎关注与我一起交流学习。

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

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

相关文章

2-12 SDATR的训练与测试

2.12 SDATR的训练与测试 使用环境:3卡服务器SDATR 服务器代码地址:/home/lihuanyu/code/036SDATR 本地代码地址:F:\BaiduNetdiskDownload\code\036SDATR 2.12.1 训练文件修改 输入数据修改 载入词汇修改 短点保存修改 权重保存修改 其他位置修改:

docker搭建Mysql集群准备(一)

docker搭建Mysql集群准备 Linux基本知识: 修改机器 IP,变成静态 IP vim /etc/sysconfig/network-scripts/ifcfg-ens33 文件 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic IPADDR192.168.190.67 NETMASK255.255.255.0 GAT…

优秀学习网站推荐-第一辑

原文地址:https://jaune162.blog/2024/02/15/study-website-recommend Developer Roadmaps(开发者路线图) 官网地址:https://roadmap.sh/ 该网站包含了各个方向、各个语言的开发人员从零开始学习的路线图。 下图为Java方向的学…

1997-2022年中央对各省份一般公共预算转移支付数据

1997-2022年中央对各省份一般公共预算转移支付数据 1、时间:1997-2022年 2、范围:31省 3、指标:一般公共预算转移支付 4、来源:wind 财政部 5、指标解释:一般性转移支付又称体制性转移支付,是指上级政…

回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小二乘支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小二乘支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小二乘支持向量机的数据多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于OOA-LSSVM鱼鹰算法…

Linux---进程间通信 | 管道 | PIPE | MKFIFO | 共享内存 | 消息队列

管道 管道是UNIX中最古老的进程间通信的形式,我们把从一个进程连接到另一个进程的数据流称为一个管道。 一个文件,可以被多个进程打开吗?可以,那如果一个进程打开文件,往文件里面写数据,另一个进程打开文…

SQL Server之DML触发器

一、如何创建一个触发器呢 触发器的定义语言如下: CREATE [ OR ALTER ] TRIGGER trigger_nameon {table_name | view_name}{for | After | Instead of }[ insert, update,delete ]assql_statement从这个定义语言我们可以知道如下信息: trigger_name&…

supervision区域行人计数和轨迹追踪初步尝试

1、背景介绍 最近,一位朋友向我介绍了定位与视觉融合的需求,我发现这个想法非常有价值。恰逢我了解到了Supervision框架,便决定尝试运用它来进行初步的测试。这样做不仅有助于探索可以实际应用的项目,还能促进我自己在研究创新方…

035 Arrays类

示例 int[] nums new int[10]; // fill Arrays.fill(nums, 666); System.out.println(Arrays.toString(nums)); // sort nums new int[]{1, 3, 5, 7, 9, 2, 4, 6, 8}; Arrays.sort(nums); System.out.println(Arrays.toString(nums)); // equals int[] nums2 new int[]{1,…

Linux 驱动开发基础知识——内核对设备树的处理与使用(十)

个人名片: 🦁作者简介:学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:Vir2021GKBS 🐼本文由…

angular2 开发遇到的问题

1:插件使用,要一同引入 不然报错 “ \ Changes detected. Rebuilding...X [ERROR] NG8001: sf-dashboard-overview is not a known element:”

Golang 并发控制方式有哪些

Go语言中的goroutine是一种轻量级的线程,其优点在于占用资源少、切换成本低,能够高效地实现并发操作。但如何对这些并发的goroutine进行控制呢? 一提到并发控制,大家最先想到到的是锁。Go中同样提供了锁的相关机制,包…

C++进阶(十)哈希的应用——位图布隆过滤器

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、位图1、位图概念2、位图的实现3、位图的应用 二、布隆过滤器1、布隆过滤器提出2、布隆过滤…

ZYNQ:CAN总线功能应用

前言 上篇文章解决了ZYNQ搭建PS和PL系统的问题,相当于完成最小系统板搭建。因此,本篇文章主要用于记录搭建CAN外设系统会出现的问题。由于ZYNQ系统包含PS和PL两个部分,PS部分往往问题较少,所以考虑先搭建PS系统的CAN外设系统。熟…

微信网页授权之使用完整服务解决方案

目录 微信网页授权能力调整造成的问题 能力调整的内容和理由 原有运行方案 is_snapshotuser字段 改造原有方案 如何复现测试场景 小结 微信网页授权能力调整造成的问题 依附于第三方的开发,做为开发者经常会遇到第三方进行规范和开发的调整,如开…

PCL安装以及CGAL构建三维凸包

基础理论专栏目录 - 知乎 (zhihu.com) 凸包问题——概述 - 知乎 (zhihu.com) 1、安装PCL 安装pcl,我的是window10,vs2019。我安装的是1.13 win10系统下 VS2019点云库PCL1.12.0的安装与配置_windows 10使用pcl-CSDN博客 照着上述博客进行配置,再结合这个设置环境变…

微信小程序(三十三)promise异步写法

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.promise异步与普通异步的写法区别 2.promise异步的优势 源码&#xff1a; index.wxml <view class"preview" bind:tap"onChoose"><image src"{{avatar}}" mode"…

WorkPlus Meet视频会议系统,支持局域网部署

随着科技的不断发展&#xff0c;视频会议系统已经成为企业、教育机构和医疗领域等各行各业远程协作和沟通的重要工具。恒拓高科的WorkPlus Meet视频会议系统以其强大的功能和便捷的操作&#xff0c;满足了不同行业的实际需求&#xff0c;成为市场上备受青睐的解决方案。 在金融…

Vue3+TS+Vite+Pinia最全学习总结

VUE3介绍 vue2和vue3之间的区别 因为需要遍历data对象上所有属性&#xff0c;所以如果data对象属性结构嵌套很深&#xff0c;就会存在性能问题。因为需要遍历属性&#xff0c;所有需要提前知道对象上有哪些属性&#xff0c;才能将其转化为getter和setter,所以vue2中无法将data新…

【详细教程】Kubernetes集群部署:使用kubeadm创建集群

文章目录 一、虚拟机准备&#xff08;一&#xff09;主机基本配置&#xff08;二&#xff09;安装docker&#xff08;三&#xff09;配置cri-docker环境&#xff08;四&#xff09;安装kubeadm、kubelet、kubectl&#xff08;五&#xff09;克隆主机 二、环境配置工作&#xff…