飞书多维表格 + Playwright 自动化:五分钟搭建商品销量监控系统

张开发
2026/4/8 8:55:11 15 分钟阅读

分享文章

飞书多维表格 + Playwright 自动化:五分钟搭建商品销量监控系统
适用场景中小电商商家商品销量监控、竞品分析、每日销量数据自动采集适合 SKU 数量在百级以内的中小卖家完全够用。一、痛点场景你还在手动复制销量吗做小红书好物分享带货的小伙伴肯定遇到过这个困境你铺了几十个商品在小红书每天需要打开每个链接看销量手动复制到 Excel 里记录变化——这样一天花十几分钟时间久了真的很浪费精力。想要看哪个商品最近卖得好不好增长趋势怎么样因为没有历史记录只能凭感觉猜。网上搜一圈要么是收费工具很贵要么是复杂的系统自己搭不起来。能不能有一个简单、免费、自己就能搭的销量监控系统这篇文章就带你从零开始五分钟用飞书多维表格 Playwright 搭建一套自动采集系统搞定小红书商品销量监控。二、最终效果预览做好之后是这样的我已经跑起来了商品链接商品标题到手价销量销量趋势2582212026-04-07 15:08 221 0 221核心特性✅ 自动判断标题空着就完整采集标题价格销量已有标题就只更新销量✅ 销量趋势自动记录每次更新在最前面插入一条记录格式 时间 新销量 旧销量 增量✅ 完全免费用飞书多维表格免费额度就能用自己服务器跑脚本没有费用✅ 代码开源不到 300 行 Python方便二次改造三、实战代码完整可运行环境依赖需要提前安装Python 3.10Playwright for Pythonpandas openpyxl操作 Excel飞书开发者工具飞书多维表格 API 需要完整核心代码#!/usr/bin/env python3 # -*- coding: utf-8 -*- 小红书商品销量采集爬虫 按照采集逻辑实现 1. 读取表格所有商品链接 2. 检查商品标题字段标题为空 → 完整采集标题已存在 → 只更新销量 3. 使用 Playwright 手机版浏览器抓取数据 4. 在销量趋势列最前面新增一行记录格式时间 新销量 旧销量 变化 import asyncio import re import pandas as pd from datetime import datetime from playwright.async_api import async_playwright, Page # 手机版浏览器配置模拟iPhone访问防反爬 USER_AGENT Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) VIEWPORT {width: 390, height: 844} def extract_note_id(url: str) - str: 从小红书链接中提取笔记 ID patterns [ r/goods-detail/([a-zA-Z0-9]), ritem/([a-zA-Z0-9]), r([a-zA-Z0-9]{24}), ] for pattern in patterns: match re.search(pattern, url) if match: return match.group(1) return None async def scrape_xhs_note(page: Page, url: str) - dict: 抓取单个商品信息标题、到手价、原价、销量 try: await page.goto(url, wait_untilnetworkidle, timeout30000) await asyncio.sleep(3) # 等待 JavaScript 渲染 result { title: None, price: None, original_price: None, sales: None, success: False } # 提取标题 title_selectors [h1, [class*title], [class*name]] for selector in title_selectors: elem await page.query_selector(selector) if elem: result[title] (await elem.text_content()).strip() break # 提取销量格式一般是 已售XXX page_text await page.content() sales_patterns [ r已售\s*(\d), r销量\s*(\d), r(\d)\s*人已买, ] for pattern in sales_patterns: match re.search(pattern, page_text, re.I) if match: result[sales] int(match.group(1)) break # 提取价格顶部大数字一般是现价 text await page.evaluate(() document.body.innerText); lines [line.strip() for line in text.split(\n) if line.strip()] # 前几行找价格一般第一个大数字就是到手价 import re prices [] for line in lines[:20]: matches re.findall(r\d, line) prices.extend([int(p) for p in matches if 10 int(p) 9999]) if len(prices) 1: result[price] prices[0] if len(prices) 2: result[original_price] prices[1] result[success] True return result except Exception as e: print(f抓取失败 {url}: {str(e)}) result[success] False return result def update_sales_trend(trend_str: str, new_sales: int) - str: 更新销量趋势在最前面新增一条记录 now datetime.now().strftime(%Y-%m-%d %H:%M) if not trend_str or pd.isna(trend_str): return f{now} {new_sales} 0 {new_sales} lines [line.strip() for line in trend_str.split(\n) if line.strip()] if lines: last_line lines[-1] parts last_line.split() if len(parts) 2: try: old_sales int(parts[1]) except: old_sales 0 else: old_sales 0 else: old_sales 0 change new_sales - old_sales change_str f{change} if change 0 else f{change} new_line f{now} {new_sales} {old_sales} {change_str} # 插入到最前面符合查看习惯 lines.insert(0, new_line) return \n.join(lines) async def main(excel_path: str): 主函数读取表格 → 循环抓取 → 更新表格 → 保存 print(f开始读取表格: {excel_path}) df pd.read_excel(excel_path) # 检查必要列不存在则创建 required_cols [商品链接, 商品标题, 到手价, 原价, 销量, 销量趋势] for col in required_cols: if col not in df.columns: print(f警告: 缺少 {col} 列自动创建) df[col] None print(f共找到 {len(df)} 个商品) async with async_playwright() as p: browser await p.chromium.launch( headlessTrue, args[--no-sandbox, --disable-dev-shm-usage] ) context await browser.new_context( user_agentUSER_AGENT, viewportVIEWPORT, device_scale_factor2, ) page await context.new_page() page.set_default_timeout(30000) for idx, row in df.iterrows(): url str(row.get(商品链接, )).strip() if not url or url.lower() nan: continue title row.get(商品标题) need_full pd.isna(title) or title print(f\n正在处理第 {idx1}/{len(df)} 个商品: {url}) result await scrape_xhs_note(page, url) if not result[success]: print(f ✗ 抓取失败跳过) continue if need_full: print(f ✓ 需要完整采集标题: {result[title][:30] if result[title] else 无}, 销量: {result[sales]}) if result[title]: df.at[idx, 商品标题] result[title] if result[price] is not None: df.at[idx, 到手价] result[price] if result[original_price] is not None: df.at[idx, 原价] result[original_price] else: print(f ✓ 只更新销量当前: {result[sales]}) # 更新销量和销量趋势 if result[sales] is not None: old_sales row.get(销量) current_trend row.get(销量趋势, ) new_trend update_sales_trend(current_trend, result[sales]) df.at[idx, 销量] result[sales] df.at[idx, 销量趋势] new_trend # 随机延迟避免请求太快 await asyncio.sleep(2 asyncio.get_event_loop().time() % 2) await browser.close() # 保存更新后的表格 output_path excel_path.replace(.xlsx, _updated.xlsx) if output_path excel_path: output_path excel_path _updated.xlsx df.to_excel(output_path, indexFalse) print(f\n✅ 采集完成结果保存到: {output_path}) print(f 共处理 {len(df)} 个商品) if __name__ __main__: import sys if len(sys.argv) ! 2: print(用法: python xhs_scraper.py 表格文件路径.xlsx) sys.exit(1) excel_file sys.argv[1] asyncio.run(main(excel_file))CSV 模板商品链接,商品标题,到手价,原价,销量,销量趋势四、飞书多维表格零代码可视化创建步骤飞书新建多维表格 App创建数据表按以下结构添加字段如果你不想自己创建可以直接复制我们已经创建好的模板多维表格链接 https://my.feishu.cn/base/APtzbELYwa2FUPsCdcxcMY11n9d打开 → 添加到你的 workspace 就能直接用了。最终效果添加完商品长这样运行完采集脚本更新后销量趋势会自动累积2026-04-07 15:08 221 0 221第二天再跑一次如果销量变成 235会自动在最前面加上2026-04-08 10:30 235 221 142026-04-07 15:08 221 0 221一眼就能看到销量增长。五、避坑指南我踩过的这些坑坑 1网络镜像源问题导致 pandas 装不上问题 Ubuntu 系统使用 apt install python3-pandas 时镜像源解析失败pip 也因为系统包管理限制装不上。解决 使用 --break-system-packages 绕过分发限制pip install --break-system-packages pandas openpyxl playwrightplaywright install chromium坑 2分享链接 token 会过期问题 过几天你会发现原来的链接打不开了抓不到数据。原因 分享链接带的 xsec_token 有有效期过期就失效了。解决 抓不到数据的时候回到小红书重新分享一下把新链接替换掉就行。坑 3价格销量位置看错数据搞反问题 我第一次做的时候把价格 258 当成销量销量 221 当成价格了...原因 页面布局是顶部大数字显示价格下面跟着 已售XXX。所以第一个大数字是价格已售跟着的才是销量。解决 提取价格的时候取页面上方第一个百位数销量找已售关键词后面的数字。坑 4飞书多维表格 API 字段格式要求非常严格问题 调用飞书 API 经常报 Field types do not match 错误。解决 飞书对不同字段类型的值格式要求非常严格字段类型正确格式错误写法超链接{link: https://xxx, text: 标题}直接写 https://xxx数字数字类型 258字符串 258日期毫秒时间戳 1740441600000字符串 2026-04-07人员[{id: ou_xxx}]ou_xxx一定要严格按照格式来错一个字符就报错。坑 5反爬怎么办问题 封 IP 了打不开页面。解决本来就是手机网页反爬不算严增加请求间隔代码里已经加了随机 2-4 秒延迟如果真被封了换个 IP 或者等几个小时就好了本工具适合中小量采集不适合大规模爬六、使用流程第一步添加商品打开飞书多维表格 → 新建一行 → 粘贴商品链接 → 商品标题留空 → 保存。第二步运行采集python xhs_scraper.py your-products.xlsx脚本会自动读取所有商品链接判断哪些需要完整采集逐个打开页面抓取数据更新销量趋势每条插在最前面输出更新后的 Excel第三步导入飞书把更新后的 Excel 数据复制回飞书多维表格 → 完成。如果是本地脚本直接跑也可以修改脚本直接调用飞书 API 写入省去复制这一步。这个小工具非常轻量总共不到 300 行 Python 代码就能搞定小红书商品销量自动监控关注我持续分享 AI 工程化落地实战干货带你从 0 到 1 搭建可商用的 AI 应用。

更多文章