在电商领域,获取 1688 店铺的所有商品信息对于市场分析、竞品研究和用户体验优化至关重要。1688 作为国内领先的 B2B 电商平台,提供了丰富的商品资源。通过 Python 爬虫技术,我们可以高效地获取 1688 店铺的所有商品信息。本文将详细介绍如何利用 Python 爬虫获取 1688 店铺的所有商品,并提供完整的代码示例。
一、准备工作
(一)注册 开放平台账号
访问开放平台,完成企业开发者实名认证和企业资质认证。创建应用并申请“商品信息查询”权限,审核周期通常为 1 - 3 个工作日。审核通过后,系统会生成 App Key
和 App Secret
,这两个凭证是调用接口的必要参数。
(二)安装必要的 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 = soup.find_all('div', class_='product-item')
for product in products:
title = product.find('a', class_='product-title').text
price = product.find('span', class_='price').text
link = product.find('a', class_='product-title')['href']
print(f"商品标题:{title}")
print(f"商品价格:{price}")
print(f"商品链接:{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 店铺的所有商品信息。无论是用于市场调研、竞品分析还是用户体验优化,这些数据都将为你提供强大的支持。希望本文的示例和策略能帮助你在爬虫开发中更好地应对各种挑战,确保爬虫程序的高效、稳定运行。