在电商领域,获取 1688 店铺的所有商品信息对于市场分析、竞品研究和用户体验优化至关重要。1688 作为国内领先的 B2B 电商平台,提供了丰富的商品资源。通过 Python 爬虫技术,我们可以高效地获取 1688 店铺的所有商品信息。本文将详细介绍如何利用 Python 爬虫获取 1688 店铺的所有商品,并提供完整的代码示例。
一、准备工作
(一)注册 1688 开放平台账号
首先,需要在 1688 开放平台注册一个开发者账号。登录后,创建一个新的应用,获取应用的 App Key 和 App Secret,这些凭证将用于后续的 API 调用。
(二)安装必要的 Python 库
安装以下 Python 库,用于发送 HTTP 请求、解析 HTML 内容和生成签名:
bash
pip install requests beautifulsoup4 pandas hashlib
二、爬虫实现步骤
(一)分析 1688 页面结构
目标 URL 示例:https://shop.1688.com/xxxxx/xxxxxx.htm(店铺主页)。商品数据通常通过 AJAX 加载,需分析:
- 商品列表的 API 接口(如果有)
- 动态加载的滚动触发方式
- 分页逻辑
(二)模拟登录(可选)
部分店铺需要登录才能查看价格,可使用 Selenium 自动填充账号密码:
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 滚动页面,触发 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) # 滚动到底部加载所有商品
(四)解析商品数据
使用 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({
"商品名称": name,
"价格": price,
"销量": sales,
"链接": link
})
(五)使用 API 接口获取商品详情
如果需要获取更丰富的商品详情数据,可以使用 1688 开放平台的 API 接口。通过 API 接口获取数据可以避免反爬限制,同时获取更完整的商品信息。
生成签名
1688 API 接口采用 MD5 加密签名验证请求合法性。签名生成步骤如下:
- 将除 sign 外的参数按字母升序排列。
- 拼接键值对为字符串,末尾追加 App Secret。
- 对拼接结果进行 MD5 哈希并转为大写。
- 以下是 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
发送请求
使用 requests 库向 1688 API 接口发送请求。以下是完整代码示例:
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)
(六)分页数据抓取
如果需要获取店铺全量商品数据,可以使用 alibaba.trade.product.search4trade 接口,并通过分页机制循环获取:
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
三、注意事项与优化建议
(一)遵守法律法规
在进行爬虫操作时,必须严格遵守相关法律法规,尊重 1688 开放平台的使用协议。
(二)合理设置请求频率
避免过高的请求频率导致对方服务器压力过大,可能触发反爬机制。
(三)数据安全
保护好 API 凭证,避免泄露。
(四)错误处理
在实际开发中,需要对 API 返回的错误码进行处理,例如:
- 401 Unauthorized:检查 API 凭证是否正确。
- 429 Too Many Requests:降低请求频率。
四、总结
通过上述步骤和代码示例,你可以高效地利用 Python 爬虫技术获取 1688 店铺的所有商品信息。无论是用于市场调研、竞品分析还是用户体验优化,这些数据都将为你提供强大的支持。希望本文的示例和策略能帮助你在爬虫开发中更好地应对各种挑战,确保爬虫程序的高效、稳定运行。