基于Scrapy的天貓商品數據爬取與分析實戰(含API簽名破解與可視化)

基于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 學 生 袁騁 指 導 教 師 史…