【2026最新xhs爬虫】用Python批量爬取关键词笔记,异步下载高清图片!

您好,我是@iFeng的小屋,一枚4年程序猿。

一、爬取目标

很多做运营、电商数据分析或内容研究的朋友,都需要批量获取xhs笔记数据。但xhs反爬比较严格,手动翻页效率太低,而且单个Cookie很容易失效。

所以,我写了这个小红书关键词笔记爬虫,它能:

  • 从Excel文件里批量读取搜索词,自动循环爬取

  • 支持多个Cookie轮换使用,失效自动切换,提高稳定性

  • 不仅能拿到笔记的标题、内容、发布时间,还能获取点赞、收藏、评论、分享数

  • 异步下载笔记中的所有高清图片,以最高质量保存为JPG

  • 所有数据安全追加到Excel文件,即使中途出错也能保留已爬数据。

二、展示爬取结果

爬取结果包含以下字段,一键存入Excel:

  • 关键词(搜索词)

  • 链接 & 链接ID(笔记唯一标识)

  • 昵称(发布者)

  • 帖子发布时间(精确到秒)

  • 笔记标题 & 内容(正文)

  • 点赞数、收藏数、评论数、分享数(互动核心指标)

  • 图片链接列表(可一键下载到本地)

所有数据自动保存为关键词.xlsx文件,图片保存在图片/关键词/文件夹内

三、原理讲解

  1. 数据准备:从Excel文件中读取搜索词和Cookie列表,每个搜索词独立保存,支持多Cookie轮换。

  2. 搜索接口 :模拟小红书网页版搜索接口 edith.xiaohongshu.com/api/sns/web/v1/search/notes,POST请求,携带加密参数(x-s, x-t等),返回笔记列表。

  3. 翻页控制 :通过 page 参数循环请求,直到无数据或达到用户设置的上限。

  4. 详情页解析 :对每个笔记ID,请求详情页 explore/{id},从HTML中提取 window.__INITIAL_STATE__ 变量,里面包含了完整笔记数据和图片列表。

  5. 数据提取:解析JSON,取出互动数、发布时间、图片高清链接等。

  6. 图片下载 :使用 aiohttp 异步并发下载图片,自动处理RGBA转RGB,统一保存为JPG格式。

  7. 安全存储 :通过 safe_read_excelsave_to_excel 函数处理文件损坏、读取失败等异常,保证数据不丢。

三、爬虫代码讲解

导入库:

python 复制代码
import requests
import pandas as pd
import json
import time
from datetime import datetime
from lxml import etree
import asyncio
import aiohttp
from DrissionPage import ChromiumPage
# 其他库用于文件处理和异常处理
3.1 核心思路与配置

整个爬虫最核心的难点在于签名参数(x-s, x-s-common)多Cookie轮换。这些参数必须从浏览器真实请求中复制,过期后需要重新获取。

为了方便使用,我把Cookie和搜索词都放在Excel文件里管理:

  • 搜索词.xlsx:第一列放关键词,一行一个。

  • cookie.xlsx:第一列放完整的cookie字符串,一行一个(可以放多个,程序自动轮换)。

python运行

3.1 关键模块:搜索接口与翻页

搜索接口返回的是笔记列表,包含笔记ID、作者信息、xsec_token等关键字段。

python 复制代码
json_data = {
    'keyword': keyword,
    'page': page,
    'page_size': 20,
    'sort': 'time_descending',  # 按最新排序
    'note_type': 0,  # 普通笔记
    'filters': [{'tags': ['半年内'], 'type': 'filter_note_time'}]  # 时间筛选
}
response = requests.post(url, json=json_data, headers=headers, cookies=cookies1)
items = response.json()['data']['items']

注意 :这里使用了 sort 参数控制排序方式(综合/最新/最热),以及 filters 限定时间范围(半年内)。你可以根据自己的需求调整这些值。

3.2 关键模块:详情页解析(提取完整数据)

从搜索列表拿到笔记ID和xsec_token后,构造详情页URL:

python 复制代码
url = f'https://www.xiaohongshu.com/explore/{id}?xsec_token={xsec_token}'
response_detail = requests.get(url, headers=headers_detail, cookies=cookies1)

content_raw = response_detail.text.split('window.__INITIAL_STATE__=')[1].split('</script>')[0]
if content_raw.endswith(';'):
    content_raw = content_raw[:-1]
content_raw = content_raw.replace('undefined', 'null')
parsed_data = json.loads(content_raw)

提取图片列表

python 复制代码
image_url_all = []
for image in parsed_data['note']['noteDetailMap'][id]['note']['imageList']:
    # 原图链接在 infoList[0]['url'],有些图片还有第二张、第三张尺寸
    image_url = image['infoList'][0]['url']  # 取最高清
    image_url_all.append(image_url)

提取互动数据

python 复制代码
interact_info = note_data['note']['interactInfo']
liked_count = interact_info['likedCount']
collected_count = interact_info['collectedCount']
comment_count = interact_info['commentCount']
shared_count = interact_info['shareCount']
3.3 关键模块:异步下载图片

小红书图片比较多,如果用同步下载会非常慢。我用了 aiohttp 异步并发下载,速度提升好几倍:

python 复制代码
async def download_single_image_async(session, image_url, save_path, filename):
    async with session.get(image_url) as response:
        content = await response.read()
        image = Image.open(io.BytesIO(content))
        # 处理RGBA透明图,转为RGB保存为JPG
        image.save(full_path, 'JPEG', quality=95)

async def download_multiple_images_async(image_urls, save_path):
    tasks = [download_single_image_async(...) for ...]
    await asyncio.gather(*tasks)

def download_multiple_images_fast(image_urls, save_path):
    asyncio.run(download_multiple_images_async(image_urls, save_path))
3.4 主循环逻辑

主函数 main() 整合以上所有模块,流程如下:

  1. 调用 initialize_data_files() 读取搜索词和Cookie。

  2. 对每个关键词,让用户输入想爬取的数量。

  3. 对每个排序方式(默认只启用了"最新"),开始分页循环:

    • 构建搜索请求,如果失败则切换Cookie。

    • 遍历笔记列表,对每个笔记请求详情页,提取数据。

    • 如果详情页解析失败(可能Cookie失效),切换Cookie并重试。

    • 达到数量上限或没有更多数据时停止。

    • 每页数据调用 save_to_excel 追加保存。

    • 图片链接存入Excel,但不自动下载(可选,需要下载可调用 download_multiple_images_fast)。

四、如何运行?

  1. 准备文件

    • 创建 搜索词.xlsx,第一列放你想搜的关键词。

    • 创建 cookie.xlsx,第一列放你的小红书网页版Cookie(可从浏览器开发者工具复制)。

  2. 安装依赖

python 复制代码
pip install requests pandas lxml openpyxl aiohttp aiofiles pillow DrissionPage

3.运行脚本。输入每个关键词想爬取的数量(最多220条,建议小批量测试)。

  1. 查看结果 :每个关键词生成一个 关键词.xlsx 文件,图片(如果启用下载)保存在 图片/关键词/ 文件夹。

五、说明

  1. Cookie 和签名时效性:小红书的Cookie和签名有效期较短,如果出现大量请求失败,请重新抓取并替换。

  2. 请求频率 :代码中已加入 time.sleep(5) 等延迟,请勿修改过短,否则容易触发封IP。

  3. 图片下载 :默认不自动下载图片,如需下载,请在代码中取消注释 download_multiple_images_fast 的调用。

  4. 完整源码 :上述代码为关键模块展示,完整可运行的源码包含了更多细节(如路径处理、异常重试、参数校验等),已打包整理。

需要本文完整可运行Python源码的小伙伴,我都放在了与此号同名的公主号里,大家自行获取。

持续分享Python干货中!更多爬虫源码干货,请前往主页查看.

相关推荐
今天你TLE了吗1 小时前
JVM学习笔记:第五章——堆内存
java·jvm·笔记·后端·学习
得一录1 小时前
AI Agent的主流设计模式之ReAct模式
人工智能·python·深度学习
火红色祥云1 小时前
Python机器学习入门与实战_笔记
笔记·python·机器学习
IT19952 小时前
Java文档阅读笔记-AI LangChain4j - Single User Chat Memory with AI Services
笔记
唐璜Taro2 小时前
Function Calling介绍
python
xin_yao_xin2 小时前
PDF 转 图片(python)
python·pdf
每天都要加加油王得坤2 小时前
langchain学习笔记
笔记·学习·langchain
石牌桥网管2 小时前
正则表达式:匹配不包含指定字符串的文本
java·javascript·python·正则表达式·go·php
AC赳赳老秦2 小时前
DeepSeek助力云原生AI降本:容器化部署资源优化与算力利用率提升技巧
网络·python·django·prompt·tornado·ai-native·deepseek