如何利用 Python 爬虫获取 1688 店铺的所有商品:实战指南

在电商领域,获取 1688 店铺的所有商品信息对于市场分析、竞品研究和用户体验优化至关重要。1688 作为国内领先的 B2B 电商平台,提供了丰富的商品资源。通过 Python 爬虫技术,我们可以高效地获取 1688 店铺的所有商品信息。本文将详细介绍如何利用 Python 爬虫获取 1688 店铺的所有商品,并提供完整的代码示例。

一、准备工作

(一)注册  开放平台账号

访问开放平台,完成企业开发者实名认证和企业资质认证。创建应用并申请“商品信息查询”权限,审核周期通常为 1 - 3 个工作日。审核通过后,系统会生成 App KeyApp 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 加密签名验证请求合法性。签名生成步骤如下:

  1. 将除 sign 外的参数按字母升序排列。

  2. 拼接键值对为字符串,末尾追加 App Secret

  3. 对拼接结果进行 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 店铺的所有商品信息。无论是用于市场调研、竞品分析还是用户体验优化,这些数据都将为你提供强大的支持。希望本文的示例和策略能帮助你在爬虫开发中更好地应对各种挑战,确保爬虫程序的高效、稳定运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值