基于Scrapy的天猫商品数据爬取与分析实战(含API签名破解与可视化)

在这里插入图片描述


本文以华为Mate 60 Pro为例,详细介绍如何使用Scrapy框架爬取天猫商品数据,涵盖API签名破解、反爬应对、数据存储及可视化全流程,适合爬虫进阶学习者实践。

一、抓包分析:定位天猫商品API

1.1 目标与工具

  • 目标:获取华为Mate 60 Pro的价格、销量等数据
  • 工具:Chrome开发者工具(F12)、Mitmproxy(可选)

1.2 操作步骤

  1. 登录天猫并打开商品页
    访问 https://detail.tmall.com/item.htm?id=725643567890,右键点击页面 → 检查,切换到 Network 面板。

  2. 刷新页面抓包
    输入关键词 detail/get.json 过滤请求,找到目标API:

    https://api.tmall.com/rest/item/1.0/item/detail/get.json?itemId=725643567890&t=1685275400000&sign=abc123...
    
  3. 提取关键参数

    • itemId:商品ID(725643567890
    • t:13位时间戳(如 1685275400000
    • sign:MD5签名(需逆向生成)

二、环境搭建:Scrapy项目初始化

2.1 创建虚拟环境与依赖安装

# 创建虚拟环境
python -m venv venv
# 激活环境(Windows)
venv\Scripts\activate.bat
# 安装依赖
pip install scrapy requests cryptography matplotlib

2.2 初始化Scrapy项目

scrapy startproject tmall_huawei
cd tmall_huawei
scrapy genspider huawei_spider tmall.com

2.3 项目结构

tmall_huawei/
├── scrapy.cfg
└── tmall_huawei/├── items.py         # 数据结构定义├── middlewares.py   # 反爬中间件├── pipelines.py     # 数据存储├── settings.py      # 配置文件└── spiders/└── huawei_spider.py  # 爬虫逻辑└── utils/└── crypto.py    # 签名生成函数

三、核心开发:签名生成与爬虫逻辑

3.1 编写签名生成函数(utils/crypto.py

import hashlib
import timedef generate_tmall_sign(item_id, app_key="12574478", salt="0c8a5244c7d2b6e1b"):"""生成天猫API签名"""t = str(int(time.time() * 1000))  # 13位时间戳sign_str = f"{t}{item_id}{app_key}{salt}"  # 拼接规则需与服务端一致sign = hashlib.md5(sign_str.encode()).hexdigest().lower()  # 转小写return {"t": t, "sign": sign, "appKey": app_key}# 测试函数
if __name__ == "__main__":params = generate_tmall_sign("725643567890")print(f"生成的时间戳:{params['t']},签名:{params['sign']}")

3.2 定义数据结构(items.py

import scrapyclass TmallHuaweiItem(scrapy.Item):item_id = scrapy.Field()     # 商品IDtitle = scrapy.Field()       # 商品标题price = scrapy.Field()       # 价格sales = scrapy.Field()       # 月销量shop_name = scrapy.Field()   # 店铺名称timestamp = scrapy.Field()   # 采集时间

3.3 编写爬虫逻辑(spiders/huawei_spider.py

import scrapy
from urllib.parse import urlencode
from ..utils.crypto import generate_tmall_sign
from ..items import TmallHuaweiItemclass HuaweiSpiderSpider(scrapy.Spider):name = "huawei_spider"allowed_domains = ["tmall.com"]start_urls = ["https://detail.tmall.com/item.htm?id=725643567890"]def start_requests(self):item_id = "725643567890"sign_params = generate_tmall_sign(item_id)# 构造API参数params = {"itemId": item_id,"type": "json","version": "1.0","isLowPrice": "false",**sign_params}api_url = f"https://api.tmall.com/rest/item/1.0/item/detail/get.json?{urlencode(params)}"# 发送带请求头的API请求yield scrapy.Request(api_url,callback=self.parse_item,headers=self.get_headers(),meta={"item_id": item_id})def parse_item(self, response):item = TmallHuaweiItem()data = response.json()item_info = data.get("data", {}).get("item", {})shop_info = item_info.get("shop", {})item["item_id"] = response.meta["item_id"]item["title"] = item_info.get("title", "")item["price"] = item_info.get("sellPrice", {}).get("price", "0.0")item["sales"] = item_info.get("sales", "0")item["shop_name"] = shop_info.get("name", "")item["timestamp"] = int(time.time())yield itemdef get_headers(self):"""模拟浏览器请求头(含Referer和User-Agent)"""return {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/114.0.0.0 Safari/537.36","Referer": "https://detail.tmall.com/item.htm?id=725643567890","Accept": "application/json, text/plain, */*"}

四、数据存储与可视化

4.1 存储到CSV(pipelines.py

import csv
import timeclass CSVPipeline:def __init__(self):self.filename = f"huawei_mate60_{time.strftime('%Y%m%d_%H%M')}.csv"self.file = open(self.filename, "w", newline="utf-8", encoding="utf-8-sig")  # 防止中文乱码self.writer = csv.DictWriter(self.file, fieldnames=["item_id", "title", "price", "sales", "shop_name", "timestamp"])self.writer.writeheader()def process_item(self, item, spider):self.writer.writerow(dict(item))return itemdef close_spider(self, spider):self.file.close()

4.2 启用管道(settings.py

ITEM_PIPELINES = {"tmall_huawei.pipelines.CSVPipeline": 300,
}

4.3 价格趋势可视化(visualize.py

import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetimedef plot_price_trend(csv_path):df = pd.read_csv(csv_path)df["price"] = df["price"].astype(float)df["time"] = df["timestamp"].apply(lambda x: datetime.fromtimestamp(x))plt.figure(figsize=(12, 6))plt.plot(df["time"], df["price"], marker="o", color="#FF6B6B", linestyle="-")plt.title("华为Mate 60 Pro价格趋势", fontsize=16)plt.xlabel("时间", fontsize=12)plt.ylabel("价格(元)", fontsize=12)plt.xticks(rotation=45)plt.grid(True, linestyle="--", alpha=0.7)plt.tight_layout()plt.show()if __name__ == "__main__":plot_price_trend("huawei_mate60_20250527_1530.csv")

五、调试技巧与反爬应对

5.1 常见错误与解决

错误类型原因分析解决方法
403 Forbidden签名错误或缺少请求头对比抓包签名,添加Cookie和Referer
JSONDecodeErrorAPI返回非JSON数据检查URL是否正确,确保登录态
KeyError: 'data'响应结构变化重新抓包分析JSON路径

5.2 反爬策略

  1. 请求间隔:在settings.py中设置 DOWNLOAD_DELAY = 2
  2. User-Agent轮换:使用fake_useragent库动态切换UA
  3. 代理IP池:集成scrapy-proxies中间件(需准备代理服务)

六、总结

本文通过实战演示了天猫商品数据爬取的完整流程,核心技术点包括:

  • 通过Chrome抓包定位API及参数逆向
  • 使用Scrapy框架实现分布式爬虫
  • MD5签名生成与反爬应对
  • 数据存储与可视化分析

实际应用中需根据网站反爬机制动态调整策略(如动态盐值、验证码处理),进一步可扩展为分布式集群或集成监控告警系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/907271.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/907271.shtml
英文地址,请注明出处:http://en.pswp.cn/news/907271.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++进阶篇】哈希表的模拟实现(赋源码)

这里写目录标题 前言一. 开放地址法实现哈希表1.1 闭散列结构定义1.2 构造函数1.3 插入(线性探测)1.3.1 传统写法1.3.2 现代写法 1.4 查找1.5 删除 二. 链地址法实现哈希表(哈希桶)2.1 开散列结构定义2.2 构造函数2.3 插入2.4 查找…

07-后端Web实战(部门管理)

5. 修改部门 对于任何业务的修改功能来说,一般都会分为两步进行:查询回显、修改数据。 5.1 查询回显 5.1.1 需求 当我们点击 "编辑" 的时候,需要根据ID查询部门数据,然后用于页面回显展示。 5.1.2 接口描述 参照参照…

深度解析项目集方向或目标根本性转变的应对策略 —— 项目集管理实战指南

在复杂多变的商业环境中,项目集管理面临着重重挑战,而项目集方向或目标的根本性转变无疑是其中最具冲击力的问题之一。本文将深度剖析这一难题,为项目集管理从业者提供实用、新颖且富有价值的应对策略,助力大家在项目集管理的复杂…

JAVA面试复习知识点

面试中遇到的题目,记录复习(持续更新) Java基础 1.String的最大长度 https://www.cnblogs.com/wupeixuan/p/12187756.html 2.集合 Collection接口的实现: List接口:ArraryList、LinkedList、Vector Set接口&#xff1a…

【烧脑算法】定长滑动窗口:算法题中的“窗口”智慧

目录 引言 定长滑动窗口习题剖析 3439. 重新安排会议得到最多空余时间 I 2134. 最少交换次数来组合所有的 1 II 1297. 子串的最大出现次数 2653. 滑动子数组的美丽值 567. 字符串的排列 438. 找到字符串中所有字母异位词 30. 串联所有单词的子串 220. 存在重复元素 II…

JWT安全:接收无签名令牌.【签名算法设置为none绕过验证】

JWT安全:假密钥【签名随便写实现越权绕过.】 JSON Web 令牌 (JWT)是一种在系统之间发送加密签名 JSON 数据的标准化格式。理论上,它们可以包含任何类型的数据,但最常用于在身份验证、会话处理和访问控制机制中发送有关用户的信息(“声明”)。…

XGBoost与SHAP深度解析:从算法原理到实战价值

在机器学习领域,XGBoost以其卓越的性能长期占据Kaggle竞赛和工业界的主流地位,而SHAP(SHapley Additive exPlanations)则成为模型可解释性的标杆工具。本文将深度解析两者的技术内核,并通过实战案例揭示其结合应用的实…

Java SE Cloneable接口和深/浅拷贝

Java为我们提供了各种各样功能的接口,Clonable接口就是其中之一。 它通常配合Object类的 clone方法使用。这个方法可以为我们创建一个对象的拷贝,即复制一个对象。在进入本文的主要内容之前,先来对访问限定符 protected进行一个解剖。 1.再…

Python学习(3) ----- Python的函数定义及其使用

Python 中函数是组织好的、可重复使用的代码块,用于实现单一或相关联的功能。下面是函数定义和使用的完整说明: 📌 一、函数定义语法 def 函数名(参数1, 参数2默认值, *args, **kwargs):"""函数说明文档"""函…

vue2使用el-tree实现两棵树间节点的拖拽复制

原文链接&#xff1a;两棵el-tree的节点跨树拖拽实现 参照这篇文章&#xff0c;把它做成组件&#xff0c;新增左侧树&#xff08;可拖出&#xff09;被拖节点变灰提示&#xff1b; 拖拽中&#xff1a; 拖拽后&#xff1a; TreeDragComponent.vue <template><!-- …

智变与重构:AI 赋能基础教育教学的范式转型研究报告

一、研究背景与核心价值 &#xff08;一&#xff09;技术驱动下的教育转型浪潮 在全球数字化转型加速的背景下&#xff0c;人工智能作为核心技术力量&#xff0c;正重塑基础教育生态。据《人工智能赋能未来教育研究报告》指出&#xff0c;我国教育数字化战略行动已推动超 70…

Go语言中Print、Printf和Println的区别及使用场景详解

在Go语言的fmt包中&#xff0c;Print、Printf和Println是三个基础但功能各异的输出函数。本文将从多个维度进行详细对比分析&#xff0c;并给出具体的使用建议。 1. 核心区别深度解析 1.1. 函数签名与基本行为 func Print(a ...interface{}) (n int, err error) func Printf…

高端制造行业 VMware 替代案例合集:10+ 头部新能源、汽车、半导体制造商以国产虚拟化支持 MES、PLM 等核心应用系统

在“中国制造 2025”政策的推动下&#xff0c;国内的新能源、汽车制造、半导体、高端装备等高端制造产业迎来了蓬勃发展&#xff0c;成为全球制造业版图中举足轻重的力量。订单数量的激增与国产化转型的趋势&#xff0c;也为高端制造企业的 IT 基础设施带来了新的挑战&#xff…

Spring Ai | 从零带你一起走进AI项目(中英)

目录 Thinking Study question pox.xml Maven Gradle Configure API Key Use the AI Client Question Thinking 让数据变得更加贴近用户的想法 Study question null pox.xml 添加依赖 Maven <dependencies><dependency><groupId>org.springfram…

LiveGBS作为下级平台GB28181国标级联2016|2022对接海康大华宇视华为政务公安内网等GB28181国标平台查看级联状态及会话

LiveGBS作为下级平台GB28181国标级联2016|2022对接海康大华宇视华为政务公安内网等GB28181国标平台查看级联状态及会话 1、GB/T28181级联概述2、搭建GB28181国标流媒体平台3、获取上级平台接入信息3.1、向下级提供信息3.2、上级国标平台添加下级域3.3、接入LiveGBS示例 4、配置…

卸载 Office PLUS

Office PLUS作为微软官方推出的智能办公提效工具&#xff0c;自2015年问世以来&#xff0c;凭借其丰富的模板资源和便捷的智能功能&#xff0c;迅速赢得了广大职场人士和学生的青睐。本文将全面介绍Office PLUS的发展历程、核心功能、可能带来的使用问题&#xff0c;以及如何彻…

影响沉金价格的因素如何体现在多层电路板制造上?

随着科技的不断发展&#xff0c;电子产品越来越普及&#xff0c;对电路板的需求也越来越大。多层电路板作为电子产品的核心部件&#xff0c;其性能和质量直接影响到整个产品的稳定性和可靠性。在多层电路板的生产过程中&#xff0c;沉金工艺是一种常用的表面处理方法&#xff0…

扩展摩尔投票法:找出出现次数超过 n/3 的元素

文章目录 问题描述关键洞察算法原理Java 实现算法演示投票阶段验证阶段 复杂度分析算法关键点通用化公式实际应用场景边界情况处理总结 标签&#xff1a;LeetCode 169, 摩尔投票法, 多数元素, 算法扩展, 数组处理 在解决多数元素问题时&#xff0c;我们学习了经典的摩尔投票法处…

Git:现代软件开发的基石——原理、实践与行业智慧·优雅草卓伊凡

Git&#xff1a;现代软件开发的基石——原理、实践与行业智慧优雅草卓伊凡 一、Git的本质与核心原理 1. 技术定义 Git是一个分布式版本控制系统&#xff08;DVCS&#xff09;&#xff0c;由Linus Torvalds在2005年为管理Linux内核开发而创建。其核心是通过快照&#xff08;Sna…

程序人生-hello’s P2P

计算机系统 大作业 题 目 程序人生-hello’s P2P 专 业 计算机与电子通信类 学   号 2023111990 班   级 23L0514 学 生 袁骋 指 导 教 师 史…