一、先说重点:原生爬虫爬 1688 的致命痛点(不推荐自研爬虫)
1688 有极强反爬体系,直接写 requests/selenium 爬虫会遇到多重限制:
- 高频滑块验证、人机校验:短时间批量请求直接弹出验证码,自动化难以绕过;
- 接口加密签名:商品详情、价格、SKU 接口携带复杂 ak/sk/token 动态签名,每次请求参数实时变化;
- IP 封禁:单 IP 并发抓取几十条就会限制访问,需要大量代理池,成本极高;
- 合规风险:违反 1688《开放平台服务协议》,批量爬取商用会被起诉、索赔,店铺有牵连封禁风险;
- 页面动态渲染:价格、SKU、详情图通过 JS 异步加载,静态 requests 拿不到完整数据。
二、两种采集方案对比
表格
| 方案 | 难度 | 稳定性 | 合规性 | 成本 | 数据完整度 |
|---|---|---|---|---|---|
| 自研 Selenium/Playwright 爬虫 | 高 | 极低,频繁封号 | 不合规 | 代理池 + 服务器成本高 | 容易缺失阶梯价、代发价 |
| Open Claw 封装 API(推荐) | 极低 | 高,平台处理反爬 | 服务商合规采集 | 按量计费,免费测试额度 | 全量 B2B 专属字段(阶梯价、代发、工厂资质) |
三、方案 1:原生爬虫(仅学习演示,不建议商用)
3.1 轻量静态爬虫(仅能抓基础页面,拿不到批发价 / SKU)
python
运行
import requests
from lxml import etree
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"referer": "https://www.1688.com/"
}
def simple_crawl_1688(url):
res = requests.get(url, headers=headers, timeout=15)
html = etree.HTML(res.text)
# 仅能提取基础标题,批发价、SKU、代发价JS渲染无法获取
title = html.xpath('//h1[contains(@class,"title-text")]/text()')
print("商品标题:", title[0].strip() if title else "获取失败")
simple_crawl_1688("https://detail.1688.com/offer/680000000000.html")
缺陷:批发阶梯价、一件代发价、库存、SKU 全部为空,核心 B2B 数据缺失。
3.2 无头浏览器 Playwright 动态爬虫(可渲染 JS,但反爬严重)
python
运行
from playwright.sync_api import sync_playwright
def playwright_crawl_1688(url):
with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # 无头模式headless=True极易被检测
page = browser.new_page(user_agent="Mozilla/5.0 Chrome/120")
page.goto(url, timeout=30000)
page.wait_for_timeout(3000)
title = page.locator('h1.title-text').inner_text()
print("标题:", title)
browser.close()
# 运行后大概率弹出滑块验证,批量采集完全不可行
playwright_crawl_1688("https://detail.1688.com/offer/680000000000.html")
四、方案 2:高效合规采集(Open Claw API,商用首选)
4.1 核心优势(解决爬虫全部痛点)
- 平台底层处理 IP 代理、滑块、签名加密,无需维护爬虫、代理池;
- 无需 1688 企业开发者账号,个人注册即可调用;
- 返回完整结构化 JSON,包含爬虫拿不到的阶梯批发价、一件代发价、起批量、工厂资质;
- 无法律风险,服务商统一合规对接,适合店群、ERP、AI 选品系统商用;
- 支持以图搜货 + 批量详情抓取联动,效率远超爬虫。
4.2 商品详情采集完整代码
python
运行
import requests
import pandas as pd
# Open Claw后台获取密钥
KEY = "你的key"
SECRET = "你的secret"
def get_1688_detail(num_iid):
api_url = "https://api-gw.onebound.cn/1688/item_get"
params = {
"key": KEY,
"secret": SECRET,
"api_name": "item_get",
"num_iid": num_iid,
"agent": 1, # 返回一件代发价
"sku_detail": 1, # 返回完整SKU库存、规格
"sales_data": 1 # 返回30天销量数据
}
resp = requests.get(api_url, params=params, timeout=20)
data = resp.json()
if data["code"] == 200:
return data["result"]
else:
print(f"抓取失败 {num_iid}: {data['msg']}")
return None
# 批量采集并导出Excel
def batch_export(goods_id_list):
all_data = []
for iid in goods_id_list:
item = get_1688_detail(iid)
if not item:
continue
row = {
"商品ID": item["num_iid"],
"标题": item["title"],
"代发价": item["agent_price"],
"最小起批量": item["min_num"],
"月销量": item["month_sales"],
"发货地": item["delivery_place"],
"店铺类型": item["seller_type"],
"详情图数量": len(item.get("desc_img", []))
}
all_data.append(row)
df = pd.DataFrame(all_data)
df.to_excel("1688商品采集表.xlsx", index=False)
print("批量采集完成,已导出表格")
if __name__ == "__main__":
# 批量商品ID列表
goods_ids = ["680000000000", "690000000001"]
batch_export(goods_ids)
五、爬虫采集效率优化避坑指南(若坚持自研爬虫)
- 请求频率控制:单次请求间隔 3~5 秒,禁止多线程并发;
- UA 随机轮换:维护大量浏览器 User-Agent 池,每次请求随机切换;
- Cookie 持久化:浏览器首次访问缓存 Cookie,避免频繁触发验证;
- 代理池必备:使用住宅动态代理,禁止机房静态 IP;
- 禁止高频批量:单日抓取不超过 200 条,否则 IP 永久封禁;
- 数据兼容:单独请求 1688 隐藏的商品接口,解析加密返回的 JSON 获取价格(接口每天更新,维护成本极高)。