以下是主流電商平臺(tái)(淘寶、京東、拼多多、1688、唯品會(huì))商品詳情頁(yè)面的解析示例,包含核心字段提取方法和應(yīng)對(duì)策略:
一、淘寶商品詳情解析
1. 頁(yè)面結(jié)構(gòu)特點(diǎn)
- 動(dòng)態(tài)渲染:部分?jǐn)?shù)據(jù)通過(guò) JS 異步加載(如 SKU 信息)
- 防爬機(jī)制:頻繁請(qǐng)求會(huì)觸發(fā)驗(yàn)證碼
- 數(shù)據(jù)加密:部分價(jià)格信息使用字體加密
- 注冊(cè)賬號(hào): [注冊(cè)獲取 API 數(shù)據(jù)](以下是主流電商平臺(tái)(淘寶、京東、拼多多、1688、唯品會(huì))商品詳情頁(yè)面的解析示例,包含核心字段提取方法和應(yīng)對(duì)策略:
一、淘寶商品詳情解析
1. 頁(yè)面結(jié)構(gòu)特點(diǎn)
- 動(dòng)態(tài)渲染:部分?jǐn)?shù)據(jù)通過(guò) JS 異步加載(如 SKU 信息)
- 防爬機(jī)制:頻繁請(qǐng)求會(huì)觸發(fā)驗(yàn)證碼
- 數(shù)據(jù)加密:部分價(jià)格信息使用字體加密
- 注冊(cè)賬號(hào): 注冊(cè)直接獲取 API 數(shù)據(jù)
2. 核心字段解析
import requests
from bs4 import BeautifulSoup
import re
def parse_taobao_item(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.taobao.com'
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 提取商品標(biāo)題
title = soup.select_one('h1[data-spm="1000983"]').text.strip()
# 提取價(jià)格(處理加密字體)
price_text = soup.select_one('.tm-price').text
price = re.search(r'\d+.\d+', price_text).group(0)
# 提取SKU信息(動(dòng)態(tài)加載,需分析AJAX請(qǐng)求)
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))
for sku_id, sku in sku_json.items():
sku_info.append({
'properties': sku['name'],
'price': sku['price'],
'stock': sku['stock']
})
# 提取店鋪信息
shop_name = soup.select_one('.slogo-shopname').text.strip()
return {
'title': title,
'price': float(price),
'sku_info': sku_info,
'shop_name': shop_name
}
二、京東商品詳情解析
1. 頁(yè)面結(jié)構(gòu)特點(diǎn)
- API 接口清晰:大部分?jǐn)?shù)據(jù)通過(guò) JSON 接口返回
- 價(jià)格保護(hù):價(jià)格信息可能需要登錄才能獲取
- 動(dòng)態(tài)評(píng)論:評(píng)論數(shù)據(jù)通過(guò)分頁(yè) API 加載
2. 核心字段解析
import requests
import json
def parse_jd_item(item_id):
# 獲取商品基本信息
base_url = f"https://item.jd.com/{item_id}.html"
headers = {
'User-Agent': 'Mozilla/5.0',
'Referer': base_url
}
# 獲取商品標(biāo)題和價(jià)格(需分析頁(yè)面結(jié)構(gòu))
response = requests.get(base_url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.select_one('.sku-name').text.strip()
# 通過(guò)價(jià)格API獲取價(jià)格
price_url = f"https://p.3.cn/prices/mgets?skuIds=J_{item_id}"
price_data = requests.get(price_url, headers=headers).json()
price = float(price_data[0]['p'])
# 獲取SKU信息
sku_url = f"https://item-soa.jd.com/getWareBusiness?skuId={item_id}"
sku_data = requests.get(sku_url, headers=headers).json()
sku_info = []
if 'wareSku' in sku_data and 'skus' in sku_data['wareSku']:
for sku in sku_data['wareSku']['skus']:
sku_info.append({
'sku_id': sku['skuId'],
'properties': sku['name'],
'price': float(sku['price']),
'stock': sku['stockState']
})
return {
'title': title,
'price': price,
'sku_info': sku_info
}
三、拼多多商品詳情解析
1. 頁(yè)面結(jié)構(gòu)特點(diǎn)
- 移動(dòng)端優(yōu)先:PC 端頁(yè)面簡(jiǎn)化,數(shù)據(jù)主要來(lái)自移動(dòng)端 API
- 加密請(qǐng)求:請(qǐng)求參數(shù)和響應(yīng)數(shù)據(jù)可能經(jīng)過(guò)加密
- 反爬嚴(yán)格:頻繁請(qǐng)求會(huì)觸發(fā)滑塊驗(yàn)證
2. 核心字段解析
import requests
import json
import time
import random
def parse_pinduoduo_item(item_id):
# 拼多多移動(dòng)端API(示例,實(shí)際需分析最新接口)
url = "https://apiv3.pinduoduo.com/api/item/get"
# 構(gòu)建請(qǐng)求參數(shù)(包含加密信息)
params = {
'item_id': item_id,
'pdduid': int(time.time() * 1000), # 模擬用戶ID
'_': int(time.time() * 1000), # 時(shí)間戳
'random': random.random() # 隨機(jī)數(shù)
}
# 添加必要的請(qǐng)求頭
headers = {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit',
'Referer': f'https://mobile.yangkeduo.com/goods.html?goods_id={item_id}',
'Origin': 'https://mobile.yangkeduo.com',
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json, text/plain, */*'
}
# 發(fā)送請(qǐng)求
response = requests.get(url, params=params, headers=headers)
data = response.json()
# 解析數(shù)據(jù)
item = data.get('item', {})
return {
'title': item.get('goods_name'),
'price': item.get('min_group_price') / 100, # 拼多多價(jià)格單位為分
'original_price': item.get('market_price') / 100,
'sales': item.get('sales_tip'),
'images': item.get('gallery'),
'description': item.get('goods_desc')
}
四、1688 商品詳情解析
1. 頁(yè)面結(jié)構(gòu)特點(diǎn)
- 企業(yè)級(jí)數(shù)據(jù):包含更多供應(yīng)商信息和批發(fā)屬性
- 多規(guī)格商品:SKU 結(jié)構(gòu)復(fù)雜,支持混批
- API 權(quán)限:部分?jǐn)?shù)據(jù)需要授權(quán)訪問(wèn)
2. 核心字段解析
import requests
from bs4 import BeautifulSoup
import json
def parse_1688_item(item_id):
# 1688商品詳情頁(yè)
url = f"https://detail.1688.com/offer/{item_id}.html"
headers = {
'User-Agent': 'Mozilla/5.0',
'Referer': 'https://www.1688.com'
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 提取商品標(biāo)題
title = soup.select_one('.d-title').text.strip()
# 提取價(jià)格范圍
price_range = soup.select_one('.price-now').text.strip()
# 提取供應(yīng)商信息
company_name = soup.select_one('.company-name').text.strip()
location = soup.select_one('.location').text.strip()
# 提取SKU信息(動(dòng)態(tài)加載)
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))
for sku_id, sku in sku_json.items():
sku_info.append({
'properties': sku['name'],
'price': sku['price'],
'min_order': sku['minOrderQuantity'],
'available_quantity': sku['availableQuantity']
})
return {
'title': title,
'price_range': price_range,
'company_name': company_name,
'location': location,
'sku_info': sku_info
}
五、唯品會(huì)商品詳情解析
1. 頁(yè)面結(jié)構(gòu)特點(diǎn)
- 品牌特賣:強(qiáng)調(diào)品牌和折扣力度
- 限時(shí)活動(dòng):價(jià)格和庫(kù)存時(shí)效性強(qiáng)
- 移動(dòng)端為主:PC 端功能簡(jiǎn)化
2. 核心字段解析
import requests
import json
import re
def parse_vip_item(item_id):
# 唯品會(huì)商品詳情API(示例,實(shí)際需分析最新接口)
url = f"https://m.vip.com/product-{item_id}.html"
headers = {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit',
'Referer': 'https://m.vip.com/'
}
# 獲取頁(yè)面內(nèi)容
response = requests.get(url, headers=headers)
html = response.text
# 提取商品信息(JSON數(shù)據(jù)嵌入在頁(yè)面script中)
item_data = None
match = re.search(r'window.productInfo\s*=\s*({.*?});', html)
if match:
item_data = json.loads(match.group(1))
if not item_data:
return None
# 解析核心數(shù)據(jù)
product = item_data.get('product', {})
return {
'title': product.get('name'),
'brand': product.get('brandName'),
'original_price': product.get('marketPrice'),
'current_price': product.get('salePrice'),
'discount': product.get('discount'),
'images': [img.get('url') for img in product.get('detailImages', [])],
'color_options': [color.get('name') for color in product.get('colors', [])]
}
六、通用解析策略與注意事項(xiàng)
- 動(dòng)態(tài)內(nèi)容處理:
- 使用 Selenium/Puppeteer 渲染 JavaScript 內(nèi)容
- 注冊(cè)直接獲取 API 數(shù)據(jù)
- 反爬應(yīng)對(duì):
- 隨機(jī) User-Agent 輪換
- 設(shè)置合理請(qǐng)求間隔(建議≥1 秒)
- 使用 IP 代理池(Luminati、Oxylabs)
- 數(shù)據(jù)驗(yàn)證:
- 使用正則表達(dá)式驗(yàn)證價(jià)格、ID 等字段
- 檢查數(shù)據(jù)完整性,處理空值情況
通過(guò)分析各平臺(tái)的頁(yè)面結(jié)構(gòu)特點(diǎn)和數(shù)據(jù)加載方式,結(jié)合適當(dāng)?shù)慕馕龉ぞ吆头磁啦呗?,可高效獲取商品詳情數(shù)據(jù)。建議針對(duì)具體平臺(tái)定期更新解析邏輯,以應(yīng)對(duì)頁(yè)面結(jié)構(gòu)變化。