在電商領(lǐng)域,獲取 1688 店鋪的所有商品信息對(duì)于市場(chǎng)分析、競(jìng)品研究和用戶(hù)體驗(yàn)優(yōu)化至關(guān)重要。1688 作為國(guó)內(nèi)領(lǐng)先的 B2B 電商平臺(tái),提供了豐富的商品資源。通過(guò) Python 爬蟲(chóng)技術(shù),我們可以高效地獲取 1688 店鋪的所有商品信息。本文將詳細(xì)介紹如何利用 Python 爬蟲(chóng)獲取 1688 店鋪的所有商品,并提供完整的代碼示例。
一、準(zhǔn)備工作
(一)注冊(cè) 1688 開(kāi)放平臺(tái)賬號(hào)
首先,需要在 1688 開(kāi)放平臺(tái)注冊(cè)一個(gè)開(kāi)發(fā)者賬號(hào)。登錄后,創(chuàng)建一個(gè)新的應(yīng)用,獲取應(yīng)用的 App Key 和 App Secret,這些憑證將用于后續(xù)的 API 調(diào)用。
(二)安裝必要的 Python 庫(kù)
安裝以下 Python 庫(kù),用于發(fā)送 HTTP 請(qǐng)求、解析 HTML 內(nèi)容和生成簽名:
bash
pip install requests beautifulsoup4 pandas hashlib
二、爬蟲(chóng)實(shí)現(xiàn)步驟
(一)分析 1688 頁(yè)面結(jié)構(gòu)
目標(biāo) URL 示例:https://shop.1688.com/xxxxx/xxxxxx.htm(店鋪主頁(yè))。商品數(shù)據(jù)通常通過(guò) AJAX 加載,需分析:
- 商品列表的 API 接口(如果有)
- 動(dòng)態(tài)加載的滾動(dòng)觸發(fā)方式
- 分頁(yè)邏輯
(二)模擬登錄(可選)
部分店鋪需要登錄才能查看價(jià)格,可使用 Selenium 自動(dòng)填充賬號(hào)密碼:
Python
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://login.1688.com/")
driver.find_element_by_id("fm-login-id").send_keys("your_username")
driver.find_element_by_id("fm-login-password").send_keys("your_password")
driver.find_element_by_class_name("fm-submit").click()
(三)獲取商品列表
使用 Selenium 滾動(dòng)頁(yè)面,觸發(fā) AJAX 加載所有商品:
Python
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
def scroll_to_bottom(driver):
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2) # 等待加載
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
driver.get("https://shop.1688.com/shop/xxxxxx.htm")
scroll_to_bottom(driver) # 滾動(dòng)到底部加載所有商品
(四)解析商品數(shù)據(jù)
使用 BeautifulSoup 提取商品信息:
Python
from bs4 import BeautifulSoup
soup = BeautifulSoup(driver.page_source, 'html.parser')
products = []
for item in soup.select(".offer-list-row .offer-item"):
name = item.select_one(".offer-title").get_text(strip=True)
price = item.select_one(".price").get_text(strip=True)
sales = item.select_one(".sale-num").get_text(strip=True)
link = item.select_one(".offer-title a")["href"]
products.append({
"商品名稱(chēng)": name,
"價(jià)格": price,
"銷(xiāo)量": sales,
"鏈接": link
})
(五)使用 API 接口獲取商品詳情
如果需要獲取更豐富的商品詳情數(shù)據(jù),可以使用 1688 開(kāi)放平臺(tái)的 API 接口。通過(guò) API 接口獲取數(shù)據(jù)可以避免反爬限制,同時(shí)獲取更完整的商品信息。
生成簽名
1688 API 接口采用 MD5 加密簽名驗(yàn)證請(qǐng)求合法性。簽名生成步驟如下:
- 將除 sign 外的參數(shù)按字母升序排列。
- 拼接鍵值對(duì)為字符串,末尾追加 App Secret。
- 對(duì)拼接結(jié)果進(jìn)行 MD5 哈希并轉(zhuǎn)為大寫(xiě)。
- 以下是 Python 代碼示例:
Python
import hashlib
import time
def generate_sign(params, app_secret):
params_sorted = sorted(params.items())
sign_str = "&".join([f"{k}{v}" for k, v in params_sorted if k != "sign"])
sign = hashlib.md5((sign_str + app_secret).encode('utf-8')).hexdigest().upper()
return sign
發(fā)送請(qǐng)求
使用 requests 庫(kù)向 1688 API 接口發(fā)送請(qǐng)求。以下是完整代碼示例:
Python
import requests
app_key = "YOUR_APP_KEY"
app_secret = "YOUR_APP_SECRET"
product_id = "商品ID" # 示例:從商品 URL 中獲取
params = {
"method": "alibaba.product.get",
"app_key": app_key,
"product_id": product_id,
"timestamp": str(int(time.time() * 1000)),
"format": "json",
"v": "2.0"
}
params["sign"] = generate_sign(params, app_secret)
response = requests.get("https://gw.open.1688.com/openapi/param2/2/portals.open/api/", params=params)
data = response.json()
print(data)
(六)分頁(yè)數(shù)據(jù)抓取
如果需要獲取店鋪全量商品數(shù)據(jù),可以使用 alibaba.trade.product.search4trade 接口,并通過(guò)分頁(yè)機(jī)制循環(huán)獲?。?/p>
Python
def fetch_all_products(seller_member_id, app_key, app_secret):
page_no = 1
all_products = []
while True:
params = {
"method": "alibaba.trade.product.search4trade",
"app_key": app_key,
"seller_member_id": seller_member_id,
"page_no": page_no,
"page_size": 50,
"timestamp": str(int(time.time() * 1000)),
"format": "json",
"v": "2.0"
}
params["sign"] = generate_sign(params, app_secret)
response = requests.get("https://gw.open.1688.com/openapi/param2/2/portals.open/api/", params=params)
data = response.json()
products = data.get("result", {}).get("products", [])
if not products:
break
all_products.extend(products)
page_no += 1
return all_products
三、注意事項(xiàng)與優(yōu)化建議
(一)遵守法律法規(guī)
在進(jìn)行爬蟲(chóng)操作時(shí),必須嚴(yán)格遵守相關(guān)法律法規(guī),尊重 1688 開(kāi)放平臺(tái)的使用協(xié)議。
(二)合理設(shè)置請(qǐng)求頻率
避免過(guò)高的請(qǐng)求頻率導(dǎo)致對(duì)方服務(wù)器壓力過(guò)大,可能觸發(fā)反爬機(jī)制。
(三)數(shù)據(jù)安全
保護(hù)好 API 憑證,避免泄露。
(四)錯(cuò)誤處理
在實(shí)際開(kāi)發(fā)中,需要對(duì) API 返回的錯(cuò)誤碼進(jìn)行處理,例如:
- 401 Unauthorized:檢查 API 憑證是否正確。
- 429 Too Many Requests:降低請(qǐng)求頻率。
四、總結(jié)
通過(guò)上述步驟和代碼示例,你可以高效地利用 Python 爬蟲(chóng)技術(shù)獲取 1688 店鋪的所有商品信息。無(wú)論是用于市場(chǎng)調(diào)研、競(jìng)品分析還是用戶(hù)體驗(yàn)優(yōu)化,這些數(shù)據(jù)都將為你提供強(qiáng)大的支持。希望本文的示例和策略能幫助你在爬蟲(chóng)開(kāi)發(fā)中更好地應(yīng)對(duì)各種挑戰(zhàn),確保爬蟲(chóng)程序的高效、穩(wěn)定運(yùn)行。