实战解析:如何用Python爬虫抓取得物、京东、唯品会实时比价数据

发布时间:2026/6/28 19:39:26

实战解析:如何用Python爬虫抓取得物、京东、唯品会实时比价数据 1. 为什么需要实时比价工具作为一个经常网购的消费者我发现自己经常在不同平台之间来回切换比价既浪费时间又容易错过优惠。后来我发现很多潮品投资者和代购商家其实也面临同样的困扰 - 他们需要实时掌握多个平台的商品价格波动才能做出最优的购买决策。以球鞋为例同一双AJ在不同平台的价格可能相差几百元。得物上的限量款可能溢价严重而唯品会可能正在做特价。如果能实时监控这些价格变化就能抓住最佳入手时机。这就是为什么我们需要用Python开发一个自动化的比价工具。这个工具的核心价值在于节省大量手动比价时间捕捉转瞬即逝的价格优惠发现平台间的套利机会为批量采购提供数据支持2. 环境准备与基础配置2.1 安装必要的Python库在开始编写爬虫之前我们需要准备好开发环境。我推荐使用Python 3.8版本并安装以下关键库pip install requests selenium beautifulsoup4 pycryptodome fake-useragent这些库各有用途requests用于发送HTTP请求selenium处理需要JavaScript渲染的页面beautifulsoup4解析HTML内容pycryptodome处理加密参数fake-useragent随机生成User-Agent2.2 配置浏览器驱动对于京东这类需要渲染的网站我们需要配置浏览器驱动。我实测过Chrome和Firefox推荐使用ChromeDriverfrom selenium import webdriver options webdriver.ChromeOptions() options.add_argument(--headless) # 无头模式 options.add_argument(--disable-gpu) driver webdriver.Chrome(executable_pathchromedriver, optionsoptions)记得下载与你的Chrome版本匹配的chromedriver并放在项目目录下。3. 唯品会数据抓取实战3.1 接口分析与参数破解唯品会的移动端接口相对友好核心API是https://mapi.vip.com/vips-mobile/rest/shopping/wap2/vendorSkuList/v4但难点在于authorization头的生成。经过我的逆向分析发现它是对多个参数进行SHA1加密的结果import hashlib def generate_vip_signature(api_key, hash_param, sid, cid): secret 8cec5243ade04ed3a02c5972bcda0d3f # 固定值 raw_str fapi{api_key}hash_param{hash_param}sid{sid}cid{cid}secret{secret} return hashlib.sha1(raw_str.encode()).hexdigest()实际请求时需要拼接大量参数这里给出关键部分params { app_name: shop_wap, app_version: 4.0, api_key: 8cec5243ade04ed3a02c5972bcda0d3f, brandid: brand_id, mid: product_id, # 其他30参数... }3.2 价格数据提取技巧唯品会的价格体系比较复杂返回的JSON中包含多个价格字段data.product_price_range_mapping.priceView.finalPrice实际支付价priceView.salePrice.saleMarketPrice划线价心理锚点priceView.salePrice.salePrice展示价我建议重点关注finalPrice这是叠加所有优惠后的真实价格。同时要注意部分商品的价格是区间形式如300-500元需要特殊处理。4. 京东数据抓取方案4.1 应对动态渲染的页面京东的商品页面大量使用JavaScript动态加载传统的requests方法很难获取完整数据。我的解决方案是使用Selenium模拟真实浏览器def get_jd_price(url): driver.get(url) WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, price)) ) html driver.page_source soup BeautifulSoup(html, lxml) price soup.select_one(.price).get_text() return float(price.strip()[1:]) # 去除¥符号这里有几个关键点必须等待价格元素加载完成京东的价格通常包含在.price类中记得处理货币符号和空白字符4.2 处理登录与验证码当请求频率过高时京东会触发验证码。我的应对策略是控制请求间隔在3-5秒使用代理IP轮换必要时模拟登录获取cookie# 模拟登录函数示例 def jd_login(username, password): driver.get(https://passport.jd.com/new/login.aspx) # 执行登录操作... cookies driver.get_cookies() return {c[name]: c[value] for c in cookies}5. 得物数据抓取技巧5.1 小程序接口逆向得物的H5端防护很强但小程序接口相对稳定。核心接口是https://app.dewu.com/api/v1/h5/inventory/price/h5/queryBuyNowInfo这个接口需要两个关键参数sign请求签名SK动态密钥签名算法如下import time import hashlib def generate_dewu_sign(params): secret 你的secret_key # 需要逆向获取 timestamp str(int(time.time() * 1000)) raw_str f{params}{timestamp}{secret} return hashlib.md5(raw_str.encode()).hexdigest()5.2 处理多规格商品得物上的商品通常有多个规格尺码/颜色价格也不同。返回数据中的tradeChannelInfoList包含了这些信息for item in response.json()[data][tradeChannelInfoList]: size item[size] price item[price] trade_type item[tradeType] # 0普通价,1极速价,2闪电价... print(f尺码:{size} 价格:{price} 类型:{trade_type})特别要注意tradeType字段不同值代表不同的价格类型闪电价通常比普通价贵10-20%。6. 数据存储与比价分析6.1 设计数据存储结构我推荐使用SQLite存储抓取的数据表结构设计如下CREATE TABLE products ( id INTEGER PRIMARY KEY, platform TEXT, -- 平台名称 product_id TEXT, -- 商品ID title TEXT, -- 商品标题 price REAL, -- 当前价格 original_price REAL, -- 原价 size TEXT, -- 规格(用得物时需要) timestamp DATETIME -- 抓取时间 );对于频繁更新的价格数据可以再建一个价格历史表CREATE TABLE price_history ( product_id INTEGER, price REAL, timestamp DATETIME, FOREIGN KEY(product_id) REFERENCES products(id) );6.2 实现比价算法比价的核心是找到同一商品在不同平台的价格差异。我的做法是通过商品标题和型号进行模糊匹配计算价格差异百分比标记最优购买平台def compare_prices(product_title): # 查询各平台最新价格 jd_price get_latest_price(京东, product_title) vip_price get_latest_price(唯品会, product_title) dewu_prices get_dewu_prices(product_title) # 得物可能有多个规格 # 找出得物最低价 dewu_min min(p[price] for p in dewu_prices) # 计算价差 results { 京东: jd_price, 唯品会: vip_price, 得物最低价: dewu_min, 最优平台: min([jd_price, vip_price, dewu_min], keylambda x: x[price]) } return results7. 反爬策略与优化建议7.1 各平台反爬特点总结根据我的实战经验三个平台的反爬策略各有特点平台主要防护手段应对方法唯品会接口签名、参数加密逆向签名算法、控制请求频率京东动态渲染、行为验证Selenium模拟、合理等待时间得物请求签名、数据加密、风控严格模拟小程序、使用动态设备信息7.2 提升爬虫稳定性的技巧请求频率控制为每个平台设置不同的请求间隔import time time.sleep(random.uniform(1, 3)) # 随机延迟代理IP池使用付费代理服务避免IP被封proxies { http: http://user:passproxy_ip:port, https: http://user:passproxy_ip:port }自动重试机制对失败请求进行有限次重试def safe_request(url, max_retry3): for i in range(max_retry): try: return requests.get(url) except Exception as e: if i max_retry - 1: raise time.sleep(2 ** i) # 指数退避监控与报警设置异常监控及时发现问题在实际项目中我建议先从少量商品开始测试逐步扩大抓取规模。同时要定期检查各平台的接口变化及时调整爬虫策略。

相关新闻