要采集速卖通关键词排名数据,核心思路是 模拟浏览器请求 获取搜索结果页面,解析商品信息与排名位置。以下是完整的 Python 实现方案,包含反反爬策略、数据解析和保存功能。
一、核心说明
-
反反爬注意事项:
- 速卖通有反爬机制(IP 限制、User-Agent 验证、Cookie 验证),需控制请求频率、使用真实浏览器头。
- 避免高频次请求,建议添加随机延迟(10-30 秒)。
- 若需大量采集,建议使用代理 IP 池(免费代理稳定性差,推荐付费代理)。
-
技术栈:
- 网络请求:
requests(模拟浏览器) - 页面解析:
BeautifulSoup4(提取商品数据) - 数据保存:
pandas(保存为 Excel/Csv)
- 网络请求:
二、完整代码实现
python
运行
import requests
from bs4 import BeautifulSoup
import pandas as pd
import random
import time
from urllib.parse import quote
# -------------------------- 配置参数 --------------------------
KEYWORD = "wireless earbuds" # 要查询的关键词(可修改)
PAGE_NUM = 3 # 要采集的页数(速卖通默认1页40条商品)
USER_AGENTS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Edge/120.0.0.0 Safari/537.36"
]
PROXY = None # 代理IP(格式:"http://用户名:密码@IP:端口",无需代理则留None)
# -------------------------- 工具函数 --------------------------
def get_aliexpress_search_url(keyword, page):
"""生成速卖通搜索URL(关键词URL编码,page为页数)"""
encoded_keyword = quote(keyword) # 关键词URL编码(处理中文/特殊字符)
# 速卖通搜索接口(s=gwp 表示全球配送,可根据需求修改参数)
url = f"https://www.aliexpress.com/wholesale?catId=0&initiative_id=SB_20251124&SearchText={encoded_keyword}&page={page}&s=gwp"
return url
def send_request(url):
"""发送HTTP请求(带反反爬配置)"""
headers = {
"User-Agent": random.choice(USER_AGENTS),
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Referer": "https://www.aliexpress.com/",
"Connection": "keep-alive"
}
proxies = {"http": PROXY, "https": PROXY} if PROXY else None
try:
response = requests.get(
url,
headers=headers,
proxies=proxies,
timeout=30,
allow_redirects=False # 禁止重定向(避免被反爬跳转)
)
response.raise_for_status() # 抛出HTTP错误(403/404等)
return response.text
except requests.exceptions.RequestException as e:
print(f"请求失败:{e}")
return None
def parse_product_data(html, page):
"""解析商品数据(排名、标题、价格、销量等)"""
soup = BeautifulSoup(html, "html.parser")
products = soup.find_all("div", class_="manhattan--content--1KpBb") # 商品容器(可能随页面更新)
data_list = []
for idx, product in enumerate(products):
# 计算排名(第page页,每页40条,排名= (page-1)*40 + idx+1)
rank = (page - 1) * 40 + idx + 1
# 商品标题
title_tag = product.find("h1", class_="manhattan--title--WccSj")
title = title_tag.get_text(strip=True) if title_tag else "无"
# 商品价格(取最低价格)
price_tag = product.find("span", class_="manhattan--price-sale--1CCSZ")
price = price_tag.get_text(strip=True) if price_tag else "无"
# 销量
sales_tag = product.find("span", class_="manhattan--trade--2Yo05")
sales = sales_tag.get_text(strip=True) if sales_tag else "0"
# 店铺名称
shop_tag = product.find("div", class_="manhattan--storeName--2h0tX")
shop_name = shop_tag.get_text(strip=True) if shop_tag else "无"
# 商品链接
link_tag = product.find("a", class_="manhattan--container--1lP57")
link = "https:" + link_tag["href"] if link_tag and "href" in link_tag.attrs else "无"
# 评分(星级)
rating_tag = product.find("span", class_="manhattan--score--2qRRX")
rating = rating_tag.get_text(strip=True) if rating_tag else "无"
# 保存数据
data_list.append({
"排名": rank,
"关键词": KEYWORD,
"商品标题": title,
"价格": price,
"销量": sales,
"店铺名称": shop_name,
"商品链接": link,
"评分": rating,
"页码": page
})
return data_list
# -------------------------- 主程序 --------------------------
def main():
all_data = []
print(f"开始采集速卖通关键词「{KEYWORD}」的排名数据(共{PAGE_NUM}页)...")
for page in range(1, PAGE_NUM + 1):
# 生成URL
url = get_aliexpress_search_url(KEYWORD, page)
print(f"\n正在采集第{page}页:{url}")
# 发送请求
html = send_request(url)
if not html:
print(f"第{page}页采集失败,跳过...")
time.sleep(random.uniform(15, 25)) # 失败后延迟更久
continue
# 解析数据
product_data = parse_product_data(html, page)
if product_data:
all_data.extend(product_data)
print(f"第{page}页采集成功,获取{len(product_data)}条商品数据")
else:
print(f"第{page}页未解析到商品数据")
# 随机延迟(避免高频请求被封)
time.sleep(random.uniform(10, 20))
# 保存数据到Excel
if all_data:
df = pd.DataFrame(all_data)
filename = f"速卖通_{KEYWORD}_排名数据_{time.strftime('%Y%m%d')}.xlsx"
df.to_excel(filename, index=False, engine="openpyxl")
print(f"\n采集完成!共获取{len(all_data)}条数据,已保存到:{filename}")
else:
print("\n未采集到任何数据!")
if __name__ == "__main__":
main()
三、使用说明
-
安装依赖:先安装所需 Python 库,执行命令:
bash
运行
pip install requests beautifulsoup4 pandas openpyxl -
参数配置:
KEYWORD:修改为需要查询的关键词(支持中文,如 "无线耳机")。PAGE_NUM:需要采集的页数(1 页约 40 条商品)。PROXY:若被速卖通限制 IP,需填写代理(格式:"http://用户名:密码@IP:端口"),无需代理则留None。
-
运行代码:直接执行脚本,采集完成后会在当前目录生成 Excel 文件(命名格式:
速卖通_关键词_排名数据_日期.xlsx)。
四、常见问题解决
-
页面结构变化导致解析失败:速卖通可能更新页面 HTML 结构(如商品容器的 class 名),此时需要:
- 用浏览器打开速卖通搜索页 → 右键「检查」→ 找到商品卡片的 HTML 标签 → 修改代码中
find_all的class_参数(如manhattan--content--1KpBb可能变更)。
- 用浏览器打开速卖通搜索页 → 右键「检查」→ 找到商品卡片的 HTML 标签 → 修改代码中
-
403 Forbidden(被反爬):
- 更换
USER_AGENTS中的浏览器头。 - 降低请求频率(增大
time.sleep的延迟时间)。 - 使用高质量代理 IP(避免使用免费代理)。
- 清除浏览器 Cookie 后,复制真实 Cookie 到请求头(添加
"Cookie": "你的Cookie"到headers)。
- 更换
-
中文关键词乱码:代码中已用
urllib.parse.quote对关键词进行 URL 编码,直接输入中文即可(如KEYWORD = "无线耳机")。 -
Excel 保存失败:确保已安装
openpyxl库(pip install openpyxl),若仍失败可改为保存为 Csv 格式:python
运行
df.to_csv(filename.replace(".xlsx", ".csv"), index=False, encoding="utf-8-sig")
五、注意事项
- 本代码仅用于 学习和研究,请勿用于商业用途或高频次采集,避免违反速卖通的《用户协议》。
- 速卖通的反爬机制会动态更新,若代码失效,需重新分析页面结构并调整解析逻辑。
- 大量采集建议使用无头浏览器(如
selenium、playwright)模拟真实用户操作,反反爬效果更好,但效率较低。

343

被折叠的 条评论
为什么被折叠?



