ARTICLE DETAIL

建站实战干货

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

Python爬虫实战:逆向小米有品API实现智能新品监控

2026/9/12 13:02:53 拓冰建站 浏览量
Python爬虫实战:逆向小米有品API实现智能新品监控 1. 项目背景与需求分析最近在研究电商平台的新品数据监控时发现小米有品作为小米生态链的核心电商平台其众筹板块经常会出现一些极具性价比的智能硬件和生活方式产品。但官方APP的推送机制存在两个痛点一是推送时间固定容易错过限量抢购二是推送内容过于宽泛无法精准匹配个人兴趣。作为一个常年蹲守众筹板块的数码爱好者我决定用Python打造一个定制化的新品监控工具。这个工具需要实现三个核心功能实时获取小米有品众筹板块的新品数据对感兴趣的商品类别进行过滤和优先级排序通过即时通讯工具推送符合条件的新品信息2. 逆向分析小米有品API2.1 抓包工具选择与配置我选择了Charles作为主要抓包工具配合安卓模拟器进行抓包。具体配置步骤如下在模拟器中安装小米有品APP版本7.5.2配置Charles代理端口设为8888在模拟器WiFi设置中手动配置代理指向本机IP和8888端口安装Charles根证书到模拟器系统证书目录注意部分安卓版本特别是7.0以上需要将证书安装到系统目录而非用户目录否则无法拦截HTTPS流量。2.2 API接口分析与破解通过分析抓包数据发现核心接口是https://api.youpin.mi.com/app/shopv3/pipe这个接口采用POST请求请求体是JSON格式关键参数包括{ method: product.productList, data: { page_index: 1, page_size: 20, type: crowdfunding } }接口的难点在于签名验证机制。经过反复测试发现签名算法如下将所有参数按key字母序排序拼接成key1value1key2value2格式的字符串在字符串末尾追加固定密钥mi_youpin_2021对拼接后的字符串取MD5值用Python实现的签名函数import hashlib def generate_sign(params, secret_keymi_youpin_2021): sorted_params sorted(params.items(), keylambda x: x[0]) param_str .join([f{k}{v} for k, v in sorted_params]) sign_str param_str secret_key return hashlib.md5(sign_str.encode()).hexdigest()3. 爬虫系统设计与实现3.1 基础架构设计系统采用分层架构数据采集层负责调用API获取原始数据数据处理层解析、清洗和存储数据业务逻辑层实现监控规则和推送逻辑通知层对接各类消息推送渠道3.2 核心代码实现数据采集模块的核心类import requests import json from datetime import datetime class YouPinSpider: def __init__(self): self.base_url https://api.youpin.mi.com/app/shopv3/pipe self.headers { User-Agent: Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36, Content-Type: application/json } def get_product_list(self, page1, page_size20): params { method: product.productList, data: json.dumps({ page_index: page, page_size: page_size, type: crowdfunding }), timestamp: int(datetime.now().timestamp()) } params[sign] self.generate_sign(params) response requests.post( self.base_url, headersself.headers, datajson.dumps(params) ) return response.json()3.3 数据存储方案考虑到数据量不大但需要快速查询选择SQLite作为存储引擎。表结构设计如下CREATE TABLE products ( id INTEGER PRIMARY KEY, product_id TEXT UNIQUE, name TEXT, price REAL, target_amount REAL, funded_amount REAL, backers INTEGER, end_time INTEGER, category TEXT, image_url TEXT, detail_url TEXT, created_time INTEGER, updated_time INTEGER );4. 反反爬策略与稳定性优化4.1 请求频率控制通过测试发现API的限流策略是单IP每分钟不超过30次请求单账号每小时不超过500次请求因此需要实现请求间隔控制import time from functools import wraps def rate_limited(max_per_minute): interval 60.0 / max_per_minute def decorator(func): last_called [0.0] wraps(func) def wrapper(*args, **kwargs): elapsed time.time() - last_called[0] wait_time interval - elapsed if wait_time 0: time.sleep(wait_time) last_called[0] time.time() return func(*args, **kwargs) return wrapper return decorator # 使用装饰器限制为每分钟20次请求 rate_limited(20) def safe_request(url, params): # 请求逻辑4.2 IP代理池搭建为了避免IP被封可以使用免费代理池import random class ProxyPool: def __init__(self): self.proxies [ http://proxy1.example.com:8080, http://proxy2.example.com:8080, # 更多代理... ] def get_random_proxy(self): return random.choice(self.proxies) # 在请求中使用代理 proxy ProxyPool().get_random_proxy() requests.get(url, proxies{http: proxy, https: proxy})5. 数据可视化与消息推送5.1 数据可视化方案使用Pyecharts生成众筹进度仪表盘from pyecharts import options as opts from pyecharts.charts import Gauge def create_gauge(product_name, progress): gauge ( Gauge() .add(, [(完成度, progress)]) .set_global_opts( title_optsopts.TitleOpts(titlef{product_name}众筹进度), legend_optsopts.LegendOpts(is_showFalse) ) ) return gauge.render_notebook()5.2 微信推送集成通过Server酱实现微信推送import requests def send_wechat_notification(sckey, title, content): url fhttps://sc.ftqq.com/{sckey}.send data { text: title, desp: content } requests.post(url, datadata)6. 系统部署与维护6.1 定时任务配置使用APScheduler实现定时爬取from apscheduler.schedulers.blocking import BlockingScheduler scheduler BlockingScheduler() scheduler.scheduled_job(interval, minutes30) def scheduled_job(): spider YouPinSpider() data spider.get_product_list() # 处理数据... scheduler.start()6.2 异常监控机制实现简单的异常监控import logging from logging.handlers import SMTPHandler logger logging.getLogger() logger.setLevel(logging.ERROR) mail_handler SMTPHandler( mailhost(smtp.example.com, 587), fromaddralertexample.com, toaddrs[adminexample.com], subject爬虫异常报警, credentials(username, password), secure() ) logger.addHandler(mail_handler) try: # 爬虫代码 except Exception as e: logger.error(爬虫运行异常, exc_infoTrue)在实际运行中这个系统帮我抢到了小米智能门锁、电动牙刷等多个热门众筹商品。最关键的经验是逆向分析时要特别注意时间戳参数的格式小米有品API要求时间戳精确到秒而不是毫秒这个细节卡了我整整一个下午。另外建议对每个新品设置独立的监控规则比如我对智能家居类产品设置了更高的优先级这样不会错过真正感兴趣的商品。