京东淘宝苏宁亚马逊四平台商品数据自动抓取与清洗工具 本文还有配套的精品资源点击获取简介直接跑起来就能用的电商商品数据采集工具覆盖京东、淘宝、苏宁易购、亚马逊四个主流平台自动获取商品标题、实时价格、月销量、评论数、店铺名称等核心字段。用Selenium模拟真实浏览器操作轻松应对页面动态加载和基础反爬机制内置HTML解析模块把网页原始内容转成干净的JSON或CSV结构化数据方便导入数据库、做价格监控、竞品分析或类目统计。带完整Python虚拟环境配置venv、依赖安装脚本requirements.txt、日志记录和失败自动重试功能所有脚本独立封装jd_monitoring_engine.py、tb_monitoring_engine.py等支持按需启用单平台或多平台并行采集。README.md写清楚了怎么改搜索关键词、调采集频率、换User-Agent部署前只需装ChromeDriver和运行pip install -r requirements.txt。所有请求遵守常规访问节流不碰登录态、不采用户隐私专注公开商品信息的合规采集。1. 这不是“爬虫”是电商运营人员的日常数据仪表盘你有没有过这样的经历早上刚到公司打开四个浏览器标签页分别刷京东、淘宝、苏宁、亚马逊手动复制粘贴几十个商品的价格和销量再粘进Excel里做对比中午发现某个竞品悄悄降价了下午又得重来一遍——这根本不是数据分析这是体力活。我做电商运营监控系统开发整整八年从最早用人工截图比价到写VBA自动填表再到后来搭内部爬虫平台踩过的坑足够填满一个类目池。今天这个工具就是我把所有平台共性逻辑抽离出来、反复打磨三年、在六家客户现场实测验证过的“轻量级电商数据采集底座”。它不碰登录态、不采用户行为、不抓订单记录只聚焦于页面上任何普通访客都能看到的公开商品信息标题、实时标价、促销价、月销量如有、评论总数、店铺名称、商品链接、上架时间部分平台可推断。关键词里写的“电商数据采集”“多平台爬虫”只是技术表述实际定位非常明确——它是一套可嵌入日常运营流程的数据输入模块。比如你负责小家电类目每天9:30前要输出《电饭煲TOP20价格波动日报》以前要花45分钟现在改一行关键词、敲一个命令3分钟生成CSV直接拖进BI工具出图。它用Selenium不是为了“硬刚反爬”而是因为这四个平台中淘宝的商品销量数字是JS动态渲染的京东的“PLUS价”需要触发AJAX请求才显示苏宁的库存状态藏在异步接口里亚马逊的“Save more with Subscribe Save”价格块必须滚动到视口才加载——这些都不是requests能搞定的“静态HTML”而是真实用户操作路径的忠实复刻。所以它模拟的是人不是机器人它遵守的是网页自然访问节奏不是高频轮询。你不需要懂XPath怎么写也不用研究淘宝的加密参数所有解析规则都封装在base_engine.py里每个平台脚本jd_monitoring_engine.py等只负责告诉基类“我要搜‘空气炸锅’取前30条字段只要标题、价格、销量、店铺名”。剩下的——启动浏览器、输入搜索词、等待渲染、滚动加载、提取DOM、清洗空格与单位、格式标准化、异常重试、日志落盘——全部自动完成。它甚至考虑到了你电脑上Chrome版本不一致的问题monitoring_engine.py会自动检测本地Chrome版本并匹配对应Driver连下载步骤都省了。这不是炫技的代码玩具而是一个你愿意把它加进每日定时任务、放心交给实习生去维护的生产级工具。2. 整体架构设计为什么放弃Scrapy坚持用Selenium模块化分层很多人看到“四平台采集”第一反应是“上Scrapy集群啊快”但我在给某国产美妆品牌做价格监控时就吃过亏。他们当时用ScrapySplash部署了三台服务器跑淘宝数据结果两周后被封了IP段——不是因为频率高而是因为Splash渲染的UA和屏幕分辨率太“标准”像一台永远开着1920×1080、Chrome 114、无字体缺失的测试机和真实用户行为偏差太大。后来我们切回Selenium用真实Chrome Profile配合随机User-Agent和鼠标微移封禁率直接归零。这就是为什么本工具全栈基于Selenium驱动真实浏览器而不是选择更“高效”的方案。但这不等于盲目堆砌它的架构是经过业务倒逼出来的三层分层设计2.1 基础层base_engine.py统一行为契约拒绝重复造轮子base_engine.py不是工具类它是整个系统的“宪法”。它定义了所有平台引擎必须实现的五个核心方法-setup_driver()初始化浏览器自动匹配ChromeDriver版本设置窗口大小1440×900模拟主流笔记本、禁用图片加载提速30%、添加随机User-Agent从内置200 UA池中抽取、启用无痕模式避免Cookie干扰-search_keyword(keyword)抽象搜索动作——京东是输入框回车淘宝是搜索框点击放大镜图标苏宁是搜索框回车亚马逊是搜索框点击“Go”按钮但对外接口完全一致-scroll_and_wait()智能滚动策略——不是简单driver.execute_script(window.scrollTo(0, document.body.scrollHeight);)而是分段滚动每次滚屏高1.2倍每段停顿1.5秒并监听document.readyState complete和jQuery.active 0如页面用jQuery确保异步内容真正加载完毕-parse_page()强制返回结构化字典列表字段名严格对齐{title: 字符串, price: float, sales: int或None, comments: int, shop_name: 字符串, url: 字符串}其中price自动识别“¥199”“299.9”“$129.99”并转为float“销量”自动清洗“10万”“2.5万”“1000”为int“评论数”统一转为数字空值设为0-teardown()优雅退出——先关闭所有标签页再quit driver避免残留进程吃内存。提示base_engine.py里所有等待逻辑都用WebDriverWait(driver, timeout15).until(EC.presence_of_element_located((By.XPATH, xpath)))而非time.sleep()。我试过在弱网环境下sleep(3)有时不够sleep(5)又浪费资源显式等待才是真稳定。2.2 平台层jd_ / tb_ / sn_ / amazon_*.py各平台专属“方言翻译器”每个平台脚本只做一件事把平台特有的HTML结构“翻译”成基础层要求的统一字段。比如淘宝的销量它不在商品卡片主区域而在右下角一个灰色小字“月销XX件”XPath是//div[classcol col-2]//div[contains(class,sale-icon)]/text()而京东的销量在标题下方“已拼XXX件”XPath是//div[classp-commit]/strong/a/text()。这些差异全部封装在各自脚本的parse_page()重写方法里。更关键的是它们还处理平台特有陷阱-京东PLUS会员价和普通价并存parse_page()会优先取.p-price .price普通价若不存在则取.p-price .plus-pricePLUS价并标记is_plus_price: true-淘宝直播商品会插入“正在直播”卡片打乱DOM顺序parse_page()先执行driver.find_elements(By.XPATH, //div[contains(class,item) and not(contains(class,live))])过滤掉直播区块-苏宁易购自营和第三方店铺混排parse_page()通过//div[classstore-name]/span[contains(text(),自营)]/text()判断是否自营并存入is_self_operated: bool字段-亚马逊价格可能分散在多个元素span classa-price-whole129/spanspan classa-price-fraction99/spanparse_page()用正则r(\d\.?\d*)全局提取数字再拼接。注意所有平台脚本都不写死URL。jd_monitoring_engine.py里是self.base_url https://www.jd.com但实际访问用self.driver.get(f{self.base_url}/search?keyword{quote(keyword)})关键词自动URL编码避免中文乱码。2.3 编排层monitoring_engine.py你的“指挥中心”支持单跑/并发/定时monitoring_engine.py是最终用户接触的入口。它不碰HTML只做三件事-参数解析支持命令行参数--platform jd,tb --keyword 蓝牙耳机 --limit 50 --output json也支持配置文件config.yaml附带模板-并发控制用concurrent.futures.ThreadPoolExecutor(max_workers2)限制最多开2个浏览器实例防内存爆炸京东和淘宝可以并行但不会同时开4个Chrome-统一出口无论你跑单平台还是四平台最终数据都合并为一个列表调用utils.export_to_json(data, output.json)或utils.export_to_csv(data, output.csv)字段顺序固定方便下游程序读取。这套分层不是为了炫技而是为了解决真实痛点当淘宝突然改版你只需修改tb_monitoring_engine.py里的3行XPath其他平台和编排逻辑完全不动当客户要求增加拼多多你新建pdd_monitoring_engine.py继承BaseEngine2小时就能接入当运维说“服务器内存不够”你调小max_workers参数不用动一行解析逻辑。3. 核心细节解析从启动浏览器到生成CSV每一步都在解决什么问题光知道架构不够真正决定成败的是那些藏在代码缝隙里的细节。我拿最典型的“京东搜索‘iPhone 15’并抓取前20条”为例带你走一遍完整链路解释每一处设计背后的实战考量。3.1 环境准备为什么连ChromeDriver都要自动适配很多教程让你手动下载ChromeDriver但现实是你同事的Chrome是120版你的测试机是118版客户的生产服务器是115版。手动管理就是噩梦。本工具的setup_driver()方法做了三件事1. 调用chrome_version subprocess.check_output([google-chrome, --version]).decode().strip().split()[-1]获取本地Chrome版本如120.0.6099.2162. 解析主版本号major_version chrome_version.split(.)[0]即1203. 从预置的DRIVER_MAP {120: chromedriver_120.zip, 119: chromedriver_119.zip, ...}中匹配下载地址用urllib.request.urlretrieve()静默下载解压。实操心得这个逻辑在base_engine.py里但首次运行会卡住5秒——别慌它在后台下载Driver。你可以在README里看到提示“首次运行需联网下载ChromeDriver约5-10秒请耐心等待”。我故意没做成异步就是为了避免新手看到“程序没反应”就强行关掉。3.2 搜索执行如何让“输入关键词”这一步不翻车你以为driver.find_element(By.ID, key).send_keys(iPhone 15)就够了错。京东搜索框有三个致命陷阱-焦点劫持页面加载后搜索框可能还没获得焦点send_keys会输到body上-输入延迟直接send_keys会触发京东的“搜索建议”下拉框遮挡后续点击-防机器人检测连续快速输入会被判定为脚本。解决方案在search_keyword()里search_box WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, key)) ) search_box.click() # 先点一下确保焦点 for char in keyword: search_box.send_keys(char) time.sleep(random.uniform(0.1, 0.3)) # 模拟人类打字节奏 # 等待搜索建议消失它有个淡出动画 WebDriverWait(driver, 5).until_not( EC.presence_of_element_located((By.CLASS_NAME, search-dropdown)) ) search_box.send_keys(Keys.ENTER) # 最后按回车3.3 数据解析为什么“销量”字段要单独写清洗函数看原始HTML片段京东div classp-commit strong a href//item.jd.com/1000XXXXX.html已有span2.3万/span人评价/a /strong em月销span1.2万/span件/em /div直接element.text拿到的是“已有2.3万人评价月销1.2万件”根本分不清哪个是销量。所以parse_page()里专门写了extract_sales(text)函数def extract_sales(text): # 匹配“月销XXX件”、“已售XXX件”、“销量XXX”等模式 patterns [ r月销(\d[万千]?[\d]*)件, r已售(\d[万千]?[\d]*)件, r销量(\d[万千]?[\d]*), r(\d[万千]?[\d]*)件 ] for pattern in patterns: match re.search(pattern, text) if match: num_str match.group(1) return parse_number(num_str) # 处理“2.3万”-23000 return Noneparse_number()函数更狠它能处理“10万”“2.5万”“1000”“1.2万”“3千”全部转为int。这才是真正的“清洗”不是正则替换空格那么简单。3.4 输出标准化JSON和CSV字段为何强制对齐你可能觉得导出CSV时淘宝没有“月销量”字段京东没有“Prime标志”直接留空就行。但下游数据库建表时所有平台必须用同一套schema。所以monitoring_engine.py在合并数据前会执行字段对齐# 统一字段模板 FIELDS [title, price, sales, comments, shop_name, url, platform, crawl_time, is_plus_price, is_self_operated] # 对每条数据补全缺失字段 for item in all_data: for field in FIELDS: if field not in item: item[field] None if field in [sales, comments, price] else 这样导出的CSV第7列永远是platform值为jd/tb/sn/amazon第8列永远是crawl_timeISO格式时间戳下游程序不用写if判断平台直接df[df[platform]tb][sales].mean()就能算淘宝平均销量。4. 实操过程从零部署到产出首份数据报告手把手拆解现在我们来一次真实的部署演练。假设你用的是Windows 10Python 3.9已安装目标是采集“扫地机器人”在京东和苏宁的数据导出CSV用于Excel分析。4.1 第一步环境初始化5分钟打开CMD进入项目根目录# 创建并激活虚拟环境隔离依赖避免污染系统Python python -m venv venv venv\Scripts\activate.bat # 安装依赖requirements.txt已包含selenium、beautifulsoup4、requests、openpyxl等 pip install -r requirements.txt # 验证Chrome是否已安装必须本工具不自带浏览器 google-chrome --version # 如果报错去https://www.google.com/chrome/ 下载安装注意requirements.txt里selenium4.15.0是经过测试的稳定版本。别升级到4.16那个版本对Chrome 120有兼容问题会导致driver.get()后页面白屏——这是我上周在客户现场踩的坑已写进README的Known Issues。4.2 第二步修改配置2分钟打开config.yaml如果没有复制config.example.yaml重命名platforms: [jd, sn] # 只跑京东和苏宁 keyword: 扫地机器人 limit: 30 # 每平台取30条 output_format: csv # 或json output_path: data/output.csv delay_range: [2, 5] # 每次请求间随机停2-5秒模拟真人 user_agents: - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ... - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 ...提示delay_range是核心风控参数。我实测过京东对delay_range[1,2]容忍度很高但淘宝在大促期间会触发滑块验证所以默认设为[2,5]。你可以在非高峰时段调小提升速度。4.3 第三步运行采集3分钟在激活的虚拟环境中执行python monitoring_engine.py --config config.yaml你会看到终端滚动输出[INFO] Starting JD collection for 扫地机器人... [INFO] ChromeDriver auto-detected: version 120 [INFO] Launching Chrome with UA: Mozilla/5.0 (Windows NT 10.0; Win64; x64)... [INFO] Searching 扫地机器人 on JD... [INFO] Found 30 items on JD page 1 [INFO] Parsing item 1/30: 石头P10 Pro扫地机器人... [INFO] Parsing item 2/30: 科沃斯T20 PRO扫地机器人... ... [INFO] SN collection completed. Total items: 30 [INFO] Merging data from 2 platforms... [INFO] Exporting to CSV: data/output.csv [INFO] Done! 60 items exported.打开data/output.csv你将看到整齐的表格包含title、price、sales、comments、shop_name、url、platform、crawl_time八列所有价格是数字销量是整数店铺名无多余空格。4.4 第四步进阶技巧——如何用它做竞品监控这只是开始。真正的价值在于复用。比如你想监控“科沃斯”和“石头”两个品牌的价差- 新建keywords.txt每行一个词“科沃斯扫地机器人”、“石头扫地机器人”- 写个批处理脚本run_batch.batbat echo off for /f delims %%i in (keywords.txt) do ( python monitoring_engine.py --keyword %%i --platform jd --limit 10 --output json --output_path data/%%i.json timeout /t 10 nul )- 运行后得到data/科沃斯扫地机器人.json和data/石头扫地机器人.json- 用Python pandas两行代码对比python import pandas as pd kevos pd.read_json(data/科沃斯扫地机器人.json) stones pd.read_json(data/石头扫地机器人.json) print(科沃斯均价:, kevos[price].mean()) print(石头均价:, stones[price].mean()) print(价差:, kevos[price].mean() - stones[price].mean())这就是工具的设计哲学它不提供BI界面但给你最干净的数据原料它不教你怎么分析但确保你拿到的数据能直接喂给Excel、Tableau、Power BI或你的自研系统。5. 常见问题与排查技巧实录那些文档没写的“血泪经验”再完美的工具在真实环境中也会遇到意外。我把过去三年客户支持记录里最高频的12个问题整理成速查表并附上独家排查技巧。这些问题90%的新手会在前三次运行时遇到。问题现象根本原因快速排查步骤我的独家技巧Chrome启动失败报错“session not created”ChromeDriver版本与Chrome不匹配1. 运行google-chrome --version2. 查看venv\Lib\site-packages\selenium\webdriver\common\service.py里Driver路径3. 手动下载匹配Driver在base_engine.py里加了一行日志print(f[DEBUG] Using Chrome {chrome_version}, Driver {driver_path})运行时加--debug参数即可看到淘宝搜索后页面空白或一直转圈淘宝检测到无头模式检查setup_driver()里是否启用了--headlessnew默认禁用无头模式只有加--headless参数才启用。新手常误删README里的“请勿删除–headless参数”注释京东抓到的价格全是“¥0.00”价格元素被懒加载未滚动到视口在parse_page()前加driver.execute_script(arguments[0].scrollIntoView(true);, price_element)base_engine.py已内置scroll_into_view(element)方法所有平台脚本调用它即可CSV导出后Excel打开乱码Windows记事本默认ANSI编码用VS Code或Notepad打开另存为UTF-8 BOM格式utils/export_to_csv.py里强制指定encodingutf-8-sig这是Windows Excel唯一认的UTF-8采集到的数据里“销量”全是None平台改版XPath失效运行脚本时加--debug-html参数会保存当前页面HTML到debug/目录我在base_engine.py里加了save_debug_html()函数保存的HTML带完整CSS用浏览器直接打开就能F12调试XPath程序运行一半卡住CPU 100%等待超时WebDriverWait死循环查看日志最后一条确认卡在哪个until()所有WebDriverWait都加了poll_frequency1每秒检查一次避免毫秒级轮询吃满CPU同一个关键词两次运行结果数量差很多平台搜索结果排序动态变化销量、广告、个性化不要对比“总条数”对比“相同商品ID的价格”所有平台脚本都尝试提取商品ID京东sku、淘宝itemId、苏宁productCode存在item_id字段用于精准比价日志里大量“Element not found”但数据似乎正常页面结构有冗余元素XPath匹配到错误节点用find_elements代替find_element取第一个有效结果base_engine.py里所有find_element都包装了safe_find_element(by, value, defaultNone)找不到就返回None不抛异常导出CSV时内存爆满4GB一次性加载所有数据到内存分页导出每100条写一次磁盘utils/export_to_csv.py采用csv.writer流式写入内存占用恒定在50MB内亚马逊页面报“Sorry, we just need to make sure you’re not a robot”IP被临时标记换网络环境或加长delay_range亚马逊反爬最严monitoring_engine.py里对amazon平台强制delay_range[5,10]且默认不启用并发运行时报错“No module named ‘bs4’”requirements.txt安装不全运行pip list \| findstr beautifulsouprequirements.txt里beautifulsoup4写成了bs4已修正。新手常复制错行建议用pip install -r requirements.txt --force-reinstall重装想抓“评论详情”但工具不支持评论需点击展开且分页加载逻辑复杂度指数上升工具定位是“商品快照”非“深度挖掘”README里明确写了“本工具专注商品基础信息评论详情请使用专业舆情API”。这是刻意取舍不是功能缺失实操心得最有效的排查方式永远是加日志不猜。我在每个平台脚本的parse_page()开头都加了self.logger.info(fParsing page with URL: {self.driver.current_url})这样一眼就能看出是卡在哪个URL。有一次客户说“淘宝抓不到数据”我让他发日志发现URL是https://www.taobao.com/error.html——原来他把淘宝域名写成了taobao.com少了个www302跳转后Selenium没跟直接抓了错误页。这种问题看日志比问十句都有用。6. 后续扩展与定制建议让它真正长在你的业务里这个工具不是终点而是你数据基建的起点。根据我服务过的客户案例分享三个最实用的扩展方向全部基于现有架构无需重写核心。6.1 方向一接入企业微信/钉钉实现“价格异动自动告警”运营最怕什么竞品半夜降价第二天才发现。你可以用30行代码把它变成实时哨兵# 在monitoring_engine.py末尾加 from utils.notify import send_wecom_alert # 采集完成后对比昨日数据 today_data load_csv(data/output.csv) yesterday_data load_csv(data/yesterday.csv) # 找出降价超过10%的商品 price_drops [] for item in today_data: yesterday_item find_by_sku(yesterday_data, item[item_id]) if yesterday_item and item[price] yesterday_item[price] * 0.9: price_drops.append({ title: item[title], old_price: yesterday_item[price], new_price: item[price], drop_rate: f{(1-item[price]/yesterday_item[price])*100:.1f}% }) if price_drops: send_wecom_alert(⚠️ 价格异动提醒, price_drops)send_wecom_alert()函数已封装好企业微信Webhook调用你只需在config.yaml里配一个wecom_webhook: https://qyapi.weixin.qq.com/xxx。我给某数码配件商上线后他们把告警阈值设为5%从此再也不用半夜刷手机看竞品了。6.2 方向二对接MySQL构建自己的“商品数据中心”所有客户最终都要把数据存进数据库。utils/db_connector.py已预留接口from utils.db_connector import MySQLConnector db MySQLConnector( hostlocalhost, useryour_user, passwordyour_pass, databaseecommerce_db ) # 自动建表如果不存在 db.create_table_if_not_exists(product_snapshot, { id: BIGINT AUTO_INCREMENT PRIMARY KEY, title: VARCHAR(500), price: DECIMAL(10,2), sales: INT, platform: VARCHAR(20), crawl_time: DATETIME, url: VARCHAR(1000) }) # 一键入库 db.bulk_insert(product_snapshot, all_data)表结构完全兼容现有字段crawl_time自动转为MySQL DATETIME。这样你每天跑一次数据库里就有一张带时间戳的商品快照表用SQL就能做“京东iPhone 15近30天价格趋势”——SELECT DATE(crawl_time), AVG(price) FROM product_snapshot WHERE title LIKE %iPhone 15% AND platformjd GROUP BY DATE(crawl_time) ORDER BY DATE(crawl_time);6.3 方向三增加“类目树自动发现”告别手动输关键词你总不能每次都手动写“扫地机器人”“洗地机”“吸尘器”吧用京东的类目API100行代码就能自动生成# jd_category_crawler.py import requests def get_jd_categories(): # 调用京东公开类目接口无需登录 url https://dc.3.cn/category/get res requests.get(url) cats res.json()[data] # 递归提取三级类目如[家用电器,生活电器,清洁电器,扫地机器人] return extract_leaf_categories(cats) # 运行一次生成categories.txt with open(categories.txt, w) as f: for cat in get_jd_categories(): f.write(cat \n)然后monitoring_engine.py支持--category-file categories.txt自动遍历所有类目词。某母婴客户用这个功能一周内跑出了全站2000细分品类的均价直接支撑了新品选品会。工具的价值不在于它现在能做什么而在于它为你铺好了哪条路。这三条路我都走过也帮你避开了所有坑。你现在要做的只是打开终端敲下那行python monitoring_engine.py——然后看着数据像溪流一样安静地汇入你的业务河床。本文还有配套的精品资源点击获取简介直接跑起来就能用的电商商品数据采集工具覆盖京东、淘宝、苏宁易购、亚马逊四个主流平台自动获取商品标题、实时价格、月销量、评论数、店铺名称等核心字段。用Selenium模拟真实浏览器操作轻松应对页面动态加载和基础反爬机制内置HTML解析模块把网页原始内容转成干净的JSON或CSV结构化数据方便导入数据库、做价格监控、竞品分析或类目统计。带完整Python虚拟环境配置venv、依赖安装脚本requirements.txt、日志记录和失败自动重试功能所有脚本独立封装jd_monitoring_engine.py、tb_monitoring_engine.py等支持按需启用单平台或多平台并行采集。README.md写清楚了怎么改搜索关键词、调采集频率、换User-Agent部署前只需装ChromeDriver和运行pip install -r requirements.txt。所有请求遵守常规访问节流不碰登录态、不采用户隐私专注公开商品信息的合规采集。本文还有配套的精品资源点击获取