在电商数据获取场景中,淘宝、京东等平台的详情页解析是核心需求。本文精简梳理 5 大主流平台的解析要点,含核心代码与避坑提示,适配博客阅读场景,无冗余内容。
import requestsimport jsonfrom bs4 import BeautifulSoupimport redef parse_taobao_item(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.taobao.com'
}
try:
response = requests.get(url, headers=headers, timeout=10)
soup = BeautifulSoup(response.text, 'html.parser')
# 提取标题
title = soup.select_one('h1[data-spm="1000983"]').text.strip() if soup.select_one('h1[data-spm="1000983"]') else "未获取"
# 提取价格(基础解密)
price_text = soup.select_one('.tm-price').text if soup.select_one('.tm-price') else "0"
price = re.search(r'\d+\.\d+', price_text).group(0) if re.search(r'\d+\.\d+', price_text) else "0"
# 提取SKU(从JS解析)
sku_info = []
sku_script = soup.find('script', string=re.compile('skuMap'))
if sku_script:
sku_data = re.search(r'skuMap\s*:\s*({.*?})', sku_script.string)
if sku_data:
sku_json = json.loads(sku_data.group(1))
sku_info = [{'sku_id': k, 'props': v['name'], 'price': v['price']} for k, v in sku_json.items()]
return {'platform': '淘宝', 'title': title, 'price': float(price), 'sku_info': sku_info}
except Exception as e:
return {'error': f'淘宝解析失败:{str(e)}'}
- 数据多通过 JSON API 返回,价格需调用专属接口
- 登录态影响会员价获取
import requestsfrom bs4 import BeautifulSoupdef parse_jd_item(item_id):
headers = {'User-Agent': 'Mozilla/5.0', 'Referer': f'https://item.jd.com/{item_id}.html'}
try:
# 提取标题
base_res = requests.get(f'https://item.jd.com/{item_id}.html', headers=headers, timeout=8)
soup = BeautifulSoup(base_res.text, 'html.parser')
title = soup.select_one('.sku-name').text.strip() if soup.select_one('.sku-name') else "未获取"
# 提取价格(调用价格API)
price_res = requests.get(f'https://p.3.cn/prices/mgets?skuIds=J_{item_id}', headers=headers, timeout=8)
price = float(price_res.json()[0]['p']) if price_res.json() else 0
# 提取SKU
sku_res = requests.get(f'https://item-soa.jd.com/getWareBusiness?skuId={item_id}', headers=headers, timeout=8)
sku_info = []
if 'skus' in sku_res.json().get('wareSku', {}):
sku_info = [{'sku_id': s['skuId'], 'props': s['name'], 'price': float(s['price'])} for s in sku_res.json()['wareSku']['skus']]
return {'platform': '京东', 'title': title, 'price': price, 'sku_info': sku_info}
except Exception as e:
return {'error': f'京东解析失败:{str(e)}'}
- 依赖移动端 API,请求参数需模拟设备信息
- 反爬严格,需控制请求频率
import requestsimport timeimport randomdef parse_pinduoduo_item(item_id):
headers = {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15',
'Referer': f'https://mobile.yangkeduo.com/goods.html?goods_id={item_id}'
}
params = {
'item_id': item_id,
'pdduid': int(time.time()*1000),
'_': int(time.time()*1000),
'random': round(random.random(), 16)
}
try:
response = requests.get('https://apiv3.pinduoduo.com/api/item/get', params=params, headers=headers, timeout=5)
data = response.json().get('item', {})
return {
'platform': '拼多多',
'title': data.get('goods_name', '未获取'),
'price': data.get('min_group_price', 0)/100, # 单位:分转元
'sales': data.get('sales_tip', '0人已买')
}
except Exception as e:
return {'error': f'拼多多解析失败:{str(e)}'}
- 含供应商信息(企业名、所在地)
- SKU 支持混批属性(起订量、可售数量)
import requestsimport jsonfrom bs4 import BeautifulSoupimport redef parse_1688_item(item_id):
headers = {'User-Agent': 'Mozilla/5.0', 'Referer': 'https://www.1688.com'}
try:
response = requests.get(f'https://detail.1688.com/offer/{item_id}.html', headers=headers, timeout=10)
soup = BeautifulSoup(response.text, 'html.parser')
# 基础信息
title = soup.select_one('.d-title').text.strip() if soup.select_one('.d-title') else "未获取"
company = soup.select_one('.company-name').text.strip() if soup.select_one('.company-name') else "未获取"
# SKU提取
sku_info = []
sku_script = soup.find('script', string=re.compile('skuMap'))
if sku_script:
sku_data = re.search(r'skuMap\s*:\s*({.*?})', sku_script.string)
if sku_data:
sku_json = json.loads(sku_data.group(1))
sku_info = [{'sku_id': k, 'props': v['name'], 'min_order': v['minOrderQuantity']} for k, v in sku_json.items()]
return {'platform': '1688', 'title': title, 'company': company, 'sku_info': sku_info}
except Exception as e:
return {'error': f'1688解析失败:{str(e)}'}
- 突出品牌与折扣,数据嵌在页面 JS 中
- 活动时效性强,需标注数据时间
import requestsimport jsonimport refrom datetime import datetimedef parse_vip_item(item_id):
headers = {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15',
'Referer': 'https://m.vip.com/'
}
try:
response = requests.get(f'https://m.vip.com/product-{item_id}.html', headers=headers, timeout=8)
# 提取JS中的商品数据
match = re.search(r'window.productInfo\s*=\s*({.*?});', response.text, re.DOTALL)
if not match:
return {'error': '未找到唯品会数据'}
data = json.loads(match.group(1)).get('product', {})
return {
'platform': '唯品会',
'title': data.get('name', '未获取'),
'brand': data.get('brandName', '未获取'),
'price': float(data.get('salePrice', 0)),
'discount': data.get('discount', '无折扣'),
'fetch_time': datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
except Exception as e:
return {'error': f'唯品会解析失败:{str(e)}'}
-
动态内容处理:用 Selenium/Playwright 渲染 JS,或优先调用平台官方 API(如淘宝
item_get、京东联盟接口),减少爬取风险。
-
反爬应对:随机轮换 User-Agent,单 IP 请求间隔≥3 秒,避免高频触发验证。
-
数据验证:价格需校验格式(如两位小数),商品 ID 按平台规则核对(淘宝 11-12 位、京东 10-13 位)。
以上代码可直接用于基础数据提取,实际使用需根据平台页面更新调整选择器 / API 参数。若遇到 “接口加密”“滑块验证” 等问题,欢迎在评论区留言,会及时分享解决方式!
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70047598/viewspace-3097491/
,如需转载,请注明出处,否则将追究法律责任。