一、技术原理分析
- API定位方法
- 使用Chrome开发者工具(F12)的Network面板
- 筛选XHR/Fetch请求(通常返回JSON数据)
- 通过关键词搜索(如"itemDetail")
- 观察请求参数中的商品ID(offerId)
- 反爬机制应对
- 动态签名加密(需逆向JavaScript)
- Cookie验证(需保持登录状态)
- 请求频率限制(需控制请求间隔)
- 验证码机制(需接入打码平台)
二、实战操作指南
步骤1:环境准备
python复制代码
# 安装必要库 |
|
pip install requests mitmproxy |
步骤2:定位API接口
- 在1688商品页打开开发者工具/万邦科技开发平台
- 刷新页面,筛选XHR请求
- 找到包含完整商品数据的接口(特征:返回JSON且包含sku、price等字段)
示例接口特征:
复制代码
URL: https://item.1688.com/offer/ajax/detail/new/xxxx.json |
|
Params: offerId=123456&... |
步骤3:请求头构造
python复制代码
headers = { |
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', |
|
'Referer': 'https://detail.1688.com/offer/xxxx.html', |
|
'Cookie': '你的登录cookie' # 需保持登录状态 |
|
} |
步骤4:参数加密处理(关键难点)
python复制代码
# 示例:逆向JavaScript加密逻辑 |
|
def generate_sign(params): |
|
# 实际需根据网站加密逻辑实现 |
|
import hashlib |
|
raw_str = ''.join([f"{k}={v}" for k, v in sorted(params.items())]) |
|
return hashlib.md5(raw_str.encode()).hexdigest() |
|
params = { |
|
'offerId': '123456', |
|
't': str(int(time.time()*1000)), |
|
'_sign': generate_sign(params) |
|
} |
步骤5:发送请求
python复制代码
import requests |
|
url = "https://item.1688.com/offer/ajax/detail/new/xxxx.json" |
|
response = requests.get(url, params=params, headers=headers) |
|
data = response.json() |
步骤6:数据解析
python复制代码
# 提取关键字段示例 |
|
product_info = { |
|
"商品标题": data['offer']['subject'], |
|
"商品价格": data['offer']['price'], |
|
"库存数量": data['offer']['quantity'], |
|
"销售规格": [sku['spec'] for sku in data['offer']['skuList']], |
|
"商家信息": data['seller']['companyName'] |
|
} |
三、高级技巧
- 动态Cookie维护
- 使用selenium保持浏览器会话
- 定期更新Cookie池
- 代理IP配置
python复制代码
proxies = { |
|
'http': 'http://123.123.123.123:8080', |
|
'https': 'http://123.123.123.123:8080' |
|
} |
|
response = requests.get(url, proxies=proxies) |
- 批量采集优化
- 使用多线程/异步请求(aiohttp)
- 实现自动翻页逻辑
- 数据持久化(MySQL/MongoDB)
四、法律合规建议
- 遵守robots.txt协议
- 控制采集频率(建议≥3秒/次)
- 仅采集公开可访问数据
- 避免对服务器造成过大压力
五、完整代码示例
python复制代码
import requests |
|
import time |
|
from fake_useragent import UserAgent |
|
class Ali1688Crawler: |
|
def __init__(self): |
|
self.ua = UserAgent() |
|
self.session = requests.Session() |
|
self.headers = { |
|
'User-Agent': self.ua.random, |
|
'Referer': 'https://www.1688.com/' |
|
} |
|
def get_product_detail(self, offer_id): |
|
url = f"https://item.1688.com/offer/ajax/detail/new/{offer_id}.json" |
|
params = { |
|
'offerId': offer_id, |
|
't': str(int(time.time()*1000)), |
|
# 添加其他必要参数 |
|
} |
|
try: |
|
response = self.session.get(url, params=params, headers=self.headers) |
|
response.raise_for_status() |
|
return response.json() |
|
except Exception as e: |
|
print(f"请求失败: {e}") |
|
return None |
|
# 使用示例 |
|
crawler = Ali1688Crawler() |
|
product_data = crawler.get_product_detail("123456789") |
|
print(product_data) |
六、注意事项
- 1688的API接口可能随时变动,需定期维护代码
- 遇到复杂加密时,建议使用mitmproxy进行中间人抓包分析
- 大规模采集建议使用专业爬虫框架(Scrapy)
- 重要数据建议进行本地化存储和备份
建议先从少量数据测试开始,逐步优化采集策略和反爬应对措施。实际开发中需结合具体业务需求调整采集字段和频率。