Shopee API逆向分析:Python实战全站商品分类树获取
当我们需要分析电商平台商品结构时,获取完整的分类体系是基础工作。本文将分享如何通过Python逆向分析Shopee的API接口,高效获取包含一二级分类的商品分类树,并提供可直接运行的代码实现。
1. 技术准备与环境搭建
在开始之前,确保已安装以下Python库:
pip install requests pandas pyquery建议使用Python 3.7+环境,主要依赖库包括:
requests:用于发送HTTP请求pandas:数据处理和分析pyquery:HTML解析
注意:实际操作前请确认目标网站的robots.txt协议,本文仅用于技术研究目的。
2. API接口分析
通过浏览器开发者工具分析Shopee网页请求,我们发现两个关键API端点:
获取基础分类(仅一级):
/api/v4/pages/get_homepage_category_list获取完整分类树(含二级):
/api/v4/pages/get_category_tree
关键响应数据结构如下:
{ "data": { "category_list": [ { "catid": 11040766, "parent_catid": 0, "name": "Women's Apparel", "display_name": "女生衣著", "level": 1, "children": [ { "catid": 11042304, "parent_catid": 11040766, "name": "T-Shirts", "display_name": "T恤", "level": 2 } ] } ] } }3. 分类数据获取实现
以下是完整的Python实现代码:
import requests import pandas as pd from pyquery import PyQuery as pq class ShopeeCategoryCrawler: def __init__(self): self.base_url = "https://shopee.com.my" self.session = requests.Session() self.session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Referer': f'{self.base_url}/' }) def get_category_tree(self): """获取完整分类树""" api_url = f"{self.base_url}/api/v4/pages/get_category_tree" try: response = self.session.get(api_url, timeout=10) if response.status_code == 200: return response.json() raise Exception(f"API请求失败: {response.status_code}") except Exception as e: print(f"获取分类树出错: {str(e)}") return None def parse_categories(self, data): """解析分类数据""" categories = [] for cat in data['data']['category_list']: categories.append({ 'level': 1, 'catid': cat['catid'], 'parent_id': 0, 'name': cat['name'], 'display_name': cat['display_name'] }) for child in cat.get('children', []): categories.append({ 'level': 2, 'catid': child['catid'], 'parent_id': cat['catid'], 'name': child['name'], 'display_name': child['display_name'] }) return categories def export_to_excel(self, data, filename): """导出到Excel""" df = pd.DataFrame(data) df.to_excel(filename, index=False) print(f"数据已导出到 {filename}") if __name__ == '__main__': crawler = ShopeeCategoryCrawler() tree_data = crawler.get_category_tree() if tree_data: categories = crawler.parse_categories(tree_data) crawler.export_to_excel(categories, 'shopee_categories.xlsx')4. 关键技术点解析
4.1 请求头模拟
Shopee的API对请求头有基本验证,需要设置合理的User-Agent和Referer:
self.session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Referer': f'{self.base_url}/' })4.2 异常处理机制
完善的异常处理保证程序稳定性:
try: response = self.session.get(api_url, timeout=10) if response.status_code == 200: return response.json() raise Exception(f"API请求失败: {response.status_code}") except Exception as e: print(f"获取分类树出错: {str(e)}") return None4.3 数据解析技巧
使用递归方式处理多级分类:
def parse_categories(self, data): categories = [] for cat in data['data']['category_list']: # 一级分类处理 categories.append({...}) # 二级分类处理 for child in cat.get('children', []): categories.append({...}) return categories5. 数据应用扩展
获取分类数据后,可以进一步实现:
商品列表获取:
def get_items_by_category(self, cat_id, page=0, limit=60): api_url = f"{self.base_url}/api/v4/search/search_items" params = { 'by': 'relevancy', 'fe_categoryids': cat_id, 'limit': limit, 'newest': page * limit, 'order': 'desc', 'page_type': 'search', 'scenario': 'PAGE_OTHERS', 'version': 2 } return self.session.get(api_url, params=params).json()分类关系可视化:
import networkx as nx import matplotlib.pyplot as plt def visualize_category_tree(categories): G = nx.Graph() for cat in categories: if cat['level'] == 1: G.add_node(cat['catid'], label=cat['display_name']) else: G.add_edge(cat['parent_id'], cat['catid']) nx.draw(G, with_labels=True) plt.show()
6. 反爬应对策略
在实际应用中可能会遇到反爬措施,建议:
- 合理设置请求间隔
- 使用代理IP池
- 模拟真实用户行为模式
- 处理Cookie和Session
# 示例:使用代理 proxies = { 'http': 'http://your_proxy:port', 'https': 'https://your_proxy:port' } response = self.session.get(api_url, proxies=proxies)7. 完整项目结构建议
对于生产环境应用,建议采用如下项目结构:
shopee_crawler/ ├── core/ │ ├── crawler.py # 主爬虫逻辑 │ ├── parser.py # 数据解析 │ └── storage.py # 数据存储 ├── utils/ │ ├── proxy.py # 代理管理 │ └── logger.py # 日志记录 ├── config.py # 配置文件 └── main.py # 入口文件这种模块化设计便于功能扩展和维护。