ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

小红书数据采集终极指南:基于Python的高效反爬虫技术实现与实战应用

2026/8/5 9:30:24 拓冰建站 浏览量
小红书数据采集终极指南:基于Python的高效反爬虫技术实现与实战应用 小红书数据采集终极指南基于Python的高效反爬虫技术实现与实战应用【免费下载链接】xhs基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/项目地址: https://gitcode.com/gh_mirrors/xh/xhs在小红书这个拥有数亿用户的生活方式分享平台上海量的公开数据蕴含着巨大的商业价值和研究意义。然而平台日益严格的反爬虫机制让传统的数据采集方法举步维艰。xhs项目正是为了解决这一技术难题而生的Python工具库通过深度逆向工程和智能签名算法为开发者和数据分析师提供了稳定、高效的小红书数据采集解决方案。为什么需要专业的小红书数据采集工具小红书作为中国领先的社交媒体平台其数据采集面临着多重挑战复杂的签名机制小红书采用JavaScript混淆的动态签名算法每次请求都需要生成特定的x-s和x-t签名严格的反爬虫检测包括IP限制、频率控制、浏览器指纹检测等多重防护动态加载技术大量内容通过AJAX动态加载传统爬虫难以获取完整数据数据格式复杂笔记、用户信息、评论等数据结构嵌套复杂xhs项目通过技术手段巧妙解决了这些问题让数据采集变得简单可靠。 快速开始三步搭建数据采集环境第一步安装xhs库# 通过pip安装xhs库 pip install xhs # 安装Playwright浏览器自动化工具 pip install playwright playwright install chromium # 下载反检测脚本 curl -O https://cdn.jsdelivr.net/gh/requireCool/stealth.min.js/stealth.min.js第二步获取小红书Cookie要使用xhs库你需要获取小红书的登录Cookie。打开浏览器登录小红书后按F12打开开发者工具在Application或Storage标签页中找到Cookie复制a1、web_session和webId三个关键字段。第三步编写第一个采集脚本import json from xhs import XhsClient # 初始化客户端 cookie your_cookie_here xhs_client XhsClient(cookie) # 获取用户信息 user_info xhs_client.get_user_info(用户ID) print(f用户昵称: {user_info.get(nickname)}) print(f粉丝数量: {user_info.get(fans_count)}) # 搜索热门内容 search_results xhs_client.get_note_by_keyword(Python编程, page1) print(f搜索到 {len(search_results)} 条笔记) # 获取笔记详情 note_detail xhs_client.get_note_by_id(笔记ID) print(f笔记标题: {note_detail.get(title)})⚙️ 核心架构如何绕过小红书的反爬虫机制签名算法逆向工程xhs项目的核心技术在于模拟小红书Web端的JavaScript签名算法。通过Playwright浏览器自动化项目能够执行页面中的签名函数生成正确的请求签名。def sign(uri, dataNone, a1, web_session): 小红书签名函数实现 for _ in range(10): try: with sync_playwright() as playwright: chromium playwright.chromium browser chromium.launch(headlessTrue) browser_context browser.new_context() # 加载反检测脚本 browser_context.add_init_script(pathstealth.min.js) context_page browser_context.new_page() context_page.goto(https://www.xiaohongshu.com) # 设置cookie browser_context.add_cookies([ {name: a1, value: a1, domain: .xiaohongshu.com, path: /} ]) context_page.reload() sleep(1) # 执行签名函数 encrypt_params context_page.evaluate( ([url, data]) window._webmsxyw(url, data), [uri, data] ) return { x-s: encrypt_params[X-s], x-t: str(encrypt_params[X-t]) } except Exception: continue raise Exception(签名重试多次失败)服务端签名方案对于生产环境xhs项目提供了服务端签名方案将签名计算独立为服务客户端只需调用API即可# 启动签名服务 docker run -it -d -p 5005:5005 reajason/xhs-api:latest # 客户端使用签名服务 from xhs import XhsClient def sign_from_server(uri, dataNone): 从签名服务获取签名 import requests response requests.post( http://localhost:5005/sign, json{uri: uri, data: data} ) return response.json() xhs_client XhsClient(cookie, signsign_from_server) 数据采集功能全解析用户数据采集# 获取用户基本信息 user_info xhs_client.get_user_info(用户ID) # 获取用户发布的笔记 user_notes xhs_client.get_user_notes(用户ID, page1, limit20) # 获取用户收藏的笔记 user_collects xhs_client.get_user_collect_notes(用户ID) # 获取用户点赞的笔记 user_likes xhs_client.get_user_like_notes(用户ID) # 获取用户关注列表 following_list xhs_client.get_following(用户ID) # 获取用户粉丝列表 fans_list xhs_client.get_followers(用户ID)内容搜索与过滤xhs库支持多种搜索方式和过滤条件from xhs import SearchSortType, SearchNoteType # 按关键词搜索 results xhs_client.get_note_by_keyword( keyword美食探店, sort_typeSearchSortType.MOST_POPULAR, # 按热度排序 note_typeSearchNoteType.ALL, # 所有类型 page1 ) # 获取首页推荐内容 home_feed xhs_client.get_home_feed(feed_typehomefeed_recommend)笔记详情与互动数据# 获取笔记完整信息 note_detail xhs_client.get_note_by_id(笔记ID) # 获取笔记评论 comments xhs_client.get_note_comments(笔记ID, cursor) # 获取笔记子评论 sub_comments xhs_client.get_note_sub_comments(笔记ID, 父评论ID) # 点赞笔记 xhs_client.like_note(笔记ID) # 收藏笔记 xhs_client.collect_note(笔记ID) # 发表评论 xhs_client.comment_note(笔记ID, 评论内容) 高级功能与性能优化批量数据处理from concurrent.futures import ThreadPoolExecutor, as_completed import time def batch_collect_user_notes(user_ids, max_workers3): 批量采集多个用户的笔记 results {} with ThreadPoolExecutor(max_workersmax_workers) as executor: future_to_user { executor.submit(xhs_client.get_user_notes, user_id): user_id for user_id in user_ids } for future in as_completed(future_to_user): user_id future_to_user[future] try: notes future.result() results[user_id] notes print(f用户 {user_id} 的笔记采集完成共 {len(notes)} 条) except Exception as e: print(f用户 {user_id} 采集失败: {e}) # 控制请求频率 time.sleep(1) return results智能频率控制import time from collections import deque from threading import Lock class RateLimiter: 智能请求频率控制器 def __init__(self, max_requests20, period60): self.max_requests max_requests self.period period self.request_times deque() self.lock Lock() def wait_if_needed(self): 根据请求频率决定是否等待 with self.lock: now time.time() # 清理过期请求记录 while self.request_times and now - self.request_times[0] self.period: self.request_times.popleft() # 检查是否超过频率限制 if len(self.request_times) self.max_requests: oldest_time self.request_times[0] wait_time self.period - (now - oldest_time) if wait_time 0: time.sleep(wait_time) now time.time() # 记录当前请求时间 self.request_times.append(now) 实战案例构建竞品监测系统系统架构设计import pandas as pd from datetime import datetime, timedelta import json class CompetitorMonitor: 竞品监测系统 def __init__(self, competitors, xhs_client): self.competitors competitors self.xhs_client xhs_client self.data {} def monitor_daily(self): 每日监测任务 results {} for competitor in self.competitors: try: # 获取竞品最新数据 user_info self.xhs_client.get_user_info(competitor[user_id]) recent_notes self.xhs_client.get_user_notes( competitor[user_id], page1, limit20 ) # 计算关键指标 metrics self.calculate_metrics(recent_notes) # 存储结果 results[competitor[name]] { user_info: user_info, recent_notes: recent_notes[:10], # 只保留最近10条 metrics: metrics, timestamp: datetime.now().isoformat() } print(f竞品 {competitor[name]} 监测完成) except Exception as e: print(f竞品 {competitor[name]} 监测失败: {e}) continue # 请求间隔 time.sleep(2) return results def calculate_metrics(self, notes): 计算内容指标 if not notes: return {} total_likes sum(note.get(liked_count, 0) for note in notes) total_comments sum(note.get(comment_count, 0) for note in notes) total_collects sum(note.get(collected_count, 0) for note in notes) return { total_notes: len(notes), avg_likes: total_likes / len(notes) if notes else 0, avg_comments: total_comments / len(notes) if notes else 0, avg_collects: total_collects / len(notes) if notes else 0, engagement_rate: (total_likes total_comments) / len(notes) if notes else 0 }数据可视化分析import matplotlib.pyplot as plt import seaborn as sns def visualize_competitor_data(data): 可视化竞品数据 # 准备数据 competitors list(data.keys()) avg_likes [data[c][metrics][avg_likes] for c in competitors] avg_comments [data[c][metrics][avg_comments] for c in competitors] engagement_rates [data[c][metrics][engagement_rate] for c in competitors] # 创建图表 fig, axes plt.subplots(1, 3, figsize(15, 5)) # 平均点赞数 axes[0].bar(competitors, avg_likes, colorskyblue) axes[0].set_title(平均点赞数) axes[0].set_ylabel(点赞数) axes[0].tick_params(axisx, rotation45) # 平均评论数 axes[1].bar(competitors, avg_comments, colorlightgreen) axes[1].set_title(平均评论数) axes[1].set_ylabel(评论数) axes[1].tick_params(axisx, rotation45) # 互动率 axes[2].bar(competitors, engagement_rates, colorsalmon) axes[2].set_title(互动率) axes[2].set_ylabel(互动率) axes[2].tick_params(axisx, rotation45) plt.tight_layout() plt.savefig(competitor_analysis.png, dpi300, bbox_inchestight) plt.show()️ 异常处理与稳定性保障完善的异常处理机制from xhs.exception import DataFetchError, IPBlockError, SignError, NeedVerifyError def safe_xhs_request(func, *args, **kwargs): 安全的xhs请求包装器 max_retries 3 retry_delay 2 for attempt in range(max_retries): try: return func(*args, **kwargs) except IPBlockError as e: print(fIP被封禁: {e}) # 切换到备用IP或等待 time.sleep(60 * (attempt 1)) # 指数退避 continue except SignError as e: print(f签名错误: {e}) # 重新获取签名或刷新cookie refresh_cookie() continue except NeedVerifyError as e: print(f需要验证: {e}) # 触发人工验证流程 trigger_human_verification() break except DataFetchError as e: print(f数据获取失败: {e}) time.sleep(retry_delay * (attempt 1)) continue except Exception as e: print(f未知错误: {e}) time.sleep(retry_delay * (attempt 1)) continue raise Exception(f请求失败重试 {max_retries} 次后仍然失败)代理IP池管理import random class ProxyManager: 代理IP池管理器 def __init__(self, proxy_list): self.proxy_list proxy_list self.current_index 0 self.failed_proxies set() def get_proxy(self): 获取可用的代理 if not self.proxy_list: return None # 尝试获取下一个代理 for _ in range(len(self.proxy_list)): proxy self.proxy_list[self.current_index] self.current_index (self.current_index 1) % len(self.proxy_list) if proxy not in self.failed_proxies: return proxy # 所有代理都失败了清空失败记录重新开始 self.failed_proxies.clear() return self.proxy_list[0] def mark_failed(self, proxy): 标记代理失败 self.failed_proxies.add(proxy) print(f代理 {proxy} 标记为失败) def mark_success(self, proxy): 标记代理成功 if proxy in self.failed_proxies: self.failed_proxies.remove(proxy) 性能优化策略连接池与缓存优化import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry class OptimizedXhsClient: 优化版的Xhs客户端 def __init__(self, cookie, sign_funcNone): self.cookie cookie self.sign_func sign_func # 创建优化的session self.session requests.Session() # 配置连接池 adapter HTTPAdapter( pool_connections10, pool_maxsize100, max_retriesRetry( total3, backoff_factor0.5, status_forcelist[500, 502, 503, 504] ) ) self.session.mount(https://, adapter) self.session.mount(http://, adapter) # 设置请求头 self.session.headers.update({ User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Accept: application/json, text/plain, */*, Accept-Language: zh-CN,zh;q0.9,en;q0.8, Accept-Encoding: gzip, deflate, br, Connection: keep-alive, }) # 初始化缓存 self.cache {} self.cache_ttl 300 # 5分钟缓存 def get_with_cache(self, key, func, *args, **kwargs): 带缓存的请求 current_time time.time() if key in self.cache: cached_data, timestamp self.cache[key] if current_time - timestamp self.cache_ttl: return cached_data # 缓存未命中或过期 result func(*args, **kwargs) self.cache[key] (result, current_time) return result 常见问题与解决方案问题1签名失败怎么办解决方案检查cookie是否过期重新获取有效的cookie确保a1、web_session、webId三个字段都存在尝试增加签名函数中的sleep时间使用服务端签名方案# 重新获取cookie def refresh_cookie(): # 实现cookie刷新逻辑 pass # 增加签名等待时间 def sign_with_longer_wait(uri, dataNone, a1, web_session): # 在context_page.reload()后增加等待时间 sleep(3) # 增加到3秒问题2IP被封禁如何处理解决方案使用代理IP轮换降低请求频率实现指数退避重试机制class SmartRetry: 智能重试机制 def __init__(self, max_retries5, base_delay1): self.max_retries max_retries self.base_delay base_delay def execute_with_retry(self, func, *args, **kwargs): for attempt in range(self.max_retries): try: return func(*args, **kwargs) except IPBlockError: if attempt self.max_retries - 1: raise wait_time self.base_delay * (2 ** attempt) # 指数退避 print(fIP被封禁等待 {wait_time} 秒后重试) time.sleep(wait_time)问题3数据获取不完整解决方案检查网络连接和代理设置验证请求参数是否正确使用分页获取完整数据def get_all_user_notes(user_id, max_pages10): 获取用户所有笔记分页 all_notes [] for page in range(1, max_pages 1): try: notes xhs_client.get_user_notes(user_id, pagepage) if not notes: break all_notes.extend(notes) print(f已获取第 {page} 页共 {len(notes)} 条笔记) time.sleep(1) # 控制请求频率 except Exception as e: print(f第 {page} 页获取失败: {e}) break return all_notes 未来发展与扩展建议技术演进方向签名算法自适应实现签名算法的自动检测和更新AI辅助反爬使用机器学习识别新的反爬机制分布式架构支持水平扩展的大规模数据采集实时数据处理集成流处理框架实现实时数据分析生态扩展计划数据导出插件支持导出到MySQL、PostgreSQL、MongoDB等数据库可视化分析工具集成数据可视化和报表生成API网关服务提供统一的RESTful API接口云服务平台部署为SaaS服务降低使用门槛 最佳实践总结开发环境配置# 创建虚拟环境 python -m venv venv source venv/bin/activate # Linux/Mac # 或 venv\Scripts\activate # Windows # 安装依赖 pip install xhs playwright playwright install chromium # 配置环境变量 export XHS_COOKIEyour_cookie_here export XHS_PROXYhttp://proxy.example.com:8080生产环境部署# Dockerfile FROM python:3.9-slim WORKDIR /app # 安装系统依赖 RUN apt-get update apt-get install -y \ wget \ gnupg \ rm -rf /var/lib/apt/lists/* # 安装Chrome RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ echo deb [archamd64] http://dl.google.com/linux/chrome/deb/ stable main /etc/apt/sources.list.d/google.list \ apt-get update apt-get install -y google-chrome-stable # 复制项目文件 COPY requirements.txt . COPY . . # 安装Python依赖 RUN pip install --no-cache-dir -r requirements.txt # 安装Playwright浏览器 RUN playwright install chromium # 启动服务 CMD [python, your_main_script.py]监控与日志import logging from datetime import datetime # 配置日志 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(fxhs_crawler_{datetime.now().strftime(%Y%m%d)}.log), logging.StreamHandler() ] ) logger logging.getLogger(__name__) class MonitoredXhsClient: 带监控的Xhs客户端 def __init__(self, cookie, sign_funcNone): self.client XhsClient(cookie, signsign_func) self.logger logger self.request_count 0 self.error_count 0 def get_note_by_id(self, note_id, *args, **kwargs): 带监控的获取笔记方法 self.request_count 1 start_time time.time() try: result self.client.get_note_by_id(note_id, *args, **kwargs) elapsed time.time() - start_time self.logger.info(f获取笔记 {note_id} 成功耗时 {elapsed:.2f}秒) return result except Exception as e: self.error_count 1 self.logger.error(f获取笔记 {note_id} 失败: {str(e)}) raise结语xhs项目为小红书数据采集提供了一个完整、稳定、高效的解决方案。通过深度逆向工程和技术创新它成功绕过了平台的反爬虫机制为开发者和数据分析师打开了小红书数据宝库的大门。无论你是进行市场研究、竞品分析、用户洞察还是构建基于小红书数据的应用系统xhs都能为你提供强大的技术支持。项目采用模块化设计易于扩展和维护同时提供了完善的异常处理和性能优化机制。记住技术只是工具合理、合法、合规地使用数据才是最重要的。xhs项目鼓励开发者在遵守平台规则和相关法律法规的前提下创造有价值的数据应用。开始你的小红书数据采集之旅吧【免费下载链接】xhs基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/项目地址: https://gitcode.com/gh_mirrors/xh/xhs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考