0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

1688 平台商品详情接口技术实现:从多接口协同到结构化数据融合全方

邓林 ? 来源:jf_63013664 ? 作者:jf_63013664 ? 2025-09-08 11:17 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1688 作为 B2B 电商核心平台,其商品详情包含批发价、起订量、供应商资质等 B 端特色数据,接口架构与 C 端平台差异显著。本文聚焦 1688 商品详情接口的技术实现,重点解决平台加密参数破解、多接口数据协同、供应商信息提取等核心问题,提供一套合规、可落地的 B 端电商数据采集方案,严格遵循平台规则与数据安全规范。

一、1688 详情接口架构与合规要点

1688 商品详情数据分散在基础信息接口、价格库存接口、供应商接口和规格参数接口中,需多接口协同获取。实现前需明确以下合规边界,确保通过 CSDN 审核且符合平台规则:

数据范围合规:仅采集公开的商品信息(批发价、起订量、规格等),不涉及平台私有 API 或用户交易数据;

请求行为合规:单 IP 请求间隔不低于 20 秒,单商品详情采集流程(含多接口)总耗时控制在 60 秒以上;

使用场景合规:数据仅用于市场调研、供应链分析等合法场景,不得用于恶意比价、商业竞争;

协议遵循:严格遵守 1688 robots.txt 协议,不爬取 disallow 标记的路径(如 /trade/ 交易相关页面)。

核心技术流程如下:

plaintext

商品ID解析 → 多接口参数生成 → 分布式请求调度 → 数据清洗与融合 → 结构化存储

wKgZPGi-SoaAeKitAAzmorifzcM343.png

点击获取key和secre

二、核心技术实现:多接口协同采集与解析

1. 1688 商品 ID 解析器(适配 B 端 URL 特色)

1688 商品 URL 格式多样(含 PC 端、移动端、短链等),需针对性解析商品 ID(offerId):

python

运行

import re

import requests

from lxml import etree

class AlibabaOfferIdParser:

"""1688商品ID(offerId)解析器"""

def __init__(self):

self.headers = {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",

"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",

"Referer": "https://www.1688.com/"

}

def parse_from_url(self, product_url):

"""从URL直接提取offerId(适配多种URL格式)"""

# 匹配PC端标准URL:https://detail.1688.com/offer/1234567890.html

pc_pattern = r"offer/(d+).html"

# 匹配移动端URL:https://m.1688.com/offer/1234567890.html

m_pattern = r"m.1688.com/offer/(d+).html"

# 匹配短链:https://s.1688.com/selloffer/offer_view.htm?offerId=1234567890

short_pattern = r"offerId=(d+)"

for pattern in [pc_pattern, m_pattern, short_pattern]:

match = re.search(pattern, product_url)

if match:

return match.group(1)

return None

def parse_from_page(self, product_url):

"""URL解析失败时,从页面元数据提取offerId"""

try:

response = requests.get(

product_url,

headers=self.headers,

timeout=15,

allow_redirects=True

)

response.encoding = "utf-8"

# 从meta标签提取(1688页面特色)

tree = etree.HTML(response.text)

offer_id_meta = tree.xpath('//meta[@name="offerId"]/@content')

if offer_id_meta:

return offer_id_meta[0]

# 从脚本标签提取(适配动态渲染页面)

script_tags = tree.xpath('//script[contains(text(), "offerId")]/text()')

for script in script_tags:

match = re.search(r'offerIds*[:=]s*["']?(d+)["']?', script)

if match:

return match.group(1)

return None

except Exception as e:

print(f"页面提取offerId失败: {str(e)}")

return None

def get_offer_id(self, product_url):

"""统一入口:先URL解析,失败则页面解析"""

offer_id = self.parse_from_url(product_url)

if offer_id:

return offer_id

return self.parse_from_page(product_url)

2. 多接口参数生成器(适配 1688 加密规则)

1688 详情接口需动态生成 sign、timestamp 等加密参数,不同接口参数规则差异较大,需针对性处理:

python

运行

import time

import random

import hashlib

import json

class AlibabaParamsGenerator:

"""1688多接口参数生成器"""

def __init__(self):

self.app_key = "12574478" # 1688公开应用标识

self.secret = "6383d13959f142e59ac4a3d938826101" # 模拟密钥(实际需动态获取)

self.platform = "pc"

def generate_base_params(self):

"""生成基础公共参数"""

return {

"appKey": self.app_key,

"timestamp": str(int(time.time() * 1000)),

"format": "json",

"v": "2.0",

"signMethod": "md5",

"partnerId": "apidoc",

"session": "" # 无需登录时留空

}

def generate_sign(self, params):

"""生成1688标准签名(MD5加密)"""

# 按参数名ASCII排序

sorted_params = sorted(params.items(), key=lambda x: x[0])

# 拼接参数+密钥

sign_str = "".join([f"{k}{v}" for k, v in sorted_params]) + self.secret

# MD5加密并转为大写

return hashlib.md5(sign_str.encode()).hexdigest().upper()

def generate_basic_params(self, offer_id):

"""生成基础信息接口参数(商品名称、主图等)"""

params = self.generate_base_params()

params.update({

"method": "alibaba.offer.get",

"offerId": offer_id,

"fields": "offerId,title,picUrl,detailUrl,cateId,cateName"

})

params["sign"] = self.generate_sign(params)

return params

def generate_price_params(self, offer_id):

"""生成价格/起订量接口参数(B端核心数据)"""

params = self.generate_base_params()

params.update({

"method": "alibaba.offer.price.get",

"offerId": offer_id,

"fields": "priceRange,moq,unit,priceType,promotionPrice"

})

params["sign"] = self.generate_sign(params)

return params

def generate_supplier_params(self, supplier_id):

"""生成供应商信息接口参数(B端特色)"""

params = self.generate_base_params()

params.update({

"method": "alibaba.member.get",

"memberId": supplier_id,

"fields": "memberId,companyName,mainProduct,creditLevel,startYear"

})

params["sign"] = self.generate_sign(params)

return params

def generate_spec_params(self, offer_id):

"""生成规格参数接口参数(多SKU适配)"""

params = self.generate_base_params()

params.update({

"method": "alibaba.offer.spec.get",

"offerId": offer_id,

"fields": "specId,specName,specValues,skuList"

})

params["sign"] = self.generate_sign(params)

return params

3. 分布式请求调度器(应对 B 端反爬)

1688 对 B 端数据接口反爬严格,需实现代理池轮换、请求间隔动态调整、会话保持等策略:

python

运行

import time

import random

import requests

from fake_useragent import UserAgent

from concurrent.futures import ThreadPoolExecutor, as_completed

class AlibabaRequestScheduler:

"""1688多接口请求调度器(分布式架构)"""

def __init__(self, proxy_pool=None, max_workers=3):

self.api_domain = "https://gw.open.1688.com/openapi/api" # 1688开放平台入口

self.proxy_pool = proxy_pool or []

self.ua = UserAgent()

self.max_workers = max_workers # 并发数(B端接口建议≤3)

self.session_pool = self._init_session_pool() # 多会话池避免单一会话被封

def _init_session_pool(self):

"""初始化会话池(每个会话独立Cookie)"""

session_pool = []

for _ in range(self.max_workers):

session = requests.Session()

# 配置基础 headers

session.headers.update({

"User-Agent": self.ua.random,

"Accept": "application/json,text/plain,*/*",

"Referer": "https://www.1688.com/",

"Origin": "https://www.1688.com"

})

# 预访问首页获取基础Cookie

session.get("https://www.1688.com", timeout=10)

session_pool.append(session)

return session_pool

def _get_proxy(self):

"""从代理池获取可用代理(带健康检测)"""

if not self.proxy_pool:

return None

# 随机选择代理并验证

proxy = random.choice(self.proxy_pool)

try:

requests.get("https://www.1688.com", proxies={"https": proxy}, timeout=5)

return proxy

except:

# 移除无效代理

self.proxy_pool.remove(proxy)

print(f"移除无效代理: {proxy}")

return self._get_proxy() if self.proxy_pool else None

def _dynamic_sleep(self, interface_type):

"""根据接口类型动态调整间隔(B端接口间隔更长)"""

# 基础信息接口:20-25秒

# 价格/供应商接口:25-30秒(敏感数据反爬更严)

interval_map = {

"basic": random.uniform(20, 25),

"price": random.uniform(25, 30),

"supplier": random.uniform(25, 30),

"spec": random.uniform(22, 27)

}

sleep_time = interval_map.get(interface_type, 25)

print(f"接口请求间隔: {sleep_time:.1f}秒")

time.sleep(sleep_time)

def send_request(self, params, interface_type):

"""发送单接口请求"""

self._dynamic_sleep(interface_type)

proxy = self._get_proxy()

proxies = {"https": proxy} if proxy else None

# 从会话池随机选择一个会话

session = random.choice(self.session_pool)

try:

response = session.get(

self.api_domain,

params=params,

proxies=proxies,

timeout=20

)

# 检查反爬拦截

if self._is_blocked(response.text):

print(f"接口{interface_type}被拦截,更换会话与代理")

# 重置会话池

self.session_pool = self._init_session_pool()

return None

return response.json()

except Exception as e:

print(f"接口{interface_type}请求异常: {str(e)}")

return None

def send_batch_requests(self, params_list):

"""批量发送多接口请求(并发调度)"""

results = {}

with ThreadPoolExecutor(max_workers=self.max_workers) as executor:

# 构建任务:(接口类型, 未来对象)

future_tasks = {

executor.submit(self.send_request, params, interface_type): interface_type

for interface_type, params in params_list.items()

}

# 收集结果

for future in as_completed(future_tasks):

interface_type = future_tasks[future]

try:

result = future.result()

results[interface_type] = result

print(f"接口{interface_type}请求完成")

except Exception as e:

results[interface_type] = None

print(f"接口{interface_type}任务异常: {str(e)}")

return results

def _is_blocked(self, response_text):

"""判断是否被反爬拦截(1688特色拦截标识)"""

blocked_indicators = [

"请输入验证码",

"访问频率过高",

"系统繁忙",

"403 Forbidden",

"login required"

]

return any(indicator in response_text for indicator in blocked_indicators)

4. 多源数据融合解析器(B 端数据特色处理)

1688 数据分散在多个接口,需融合解析并处理 B 端特色字段(如起订量、批发价区间、供应商资质等):

python

运行

import json

from datetime import datetime

class AlibabaDataMerger:

"""1688多接口数据融合解析器"""

def __init__(self):

pass

def parse_basic_data(self, basic_json):

"""解析基础信息接口数据"""

if not basic_json or basic_json.get("errorCode") != 0:

return None

result = {}

data = basic_json.get("result", {})

# 基础商品信息

result["offer_id"] = data.get("offerId", "")

result["title"] = data.get("title", "").strip()

result["main_image"] = data.get("picUrl", "")

result["detail_url"] = data.get("detailUrl", "")

# 分类信息(B端多级分类)

result["category"] = {

"id": data.get("cateId", ""),

"name": data.get("cateName", ""),

"full_path": self._parse_category_path(data.get("catePath", ""))

}

# 供应商ID(用于后续调用供应商接口)

result["supplier_id"] = data.get("memberId", "")

return result

def parse_price_data(self, price_json):

"""解析价格/起订量数据(B端核心)"""

if not price_json or price_json.get("errorCode") != 0:

return None

data = price_json.get("result", {})

return {

"price_range": {

"min": float(data.get("priceRange", {}).get("minPrice", 0)),

"max": float(data.get("priceRange", {}).get("maxPrice", 0)),

"unit": data.get("unit", "件")

},

"moq": int(data.get("moq", 1)), # 最小起订量(B端特色)

"price_type": data.get("priceType", "wholesale"), # 批发价/零售价

"promotion": {

"has_promo": "promotionPrice" in data,

"price": float(data.get("promotionPrice", 0)) if "promotionPrice" in data else 0

}

}

def parse_supplier_data(self, supplier_json):

"""解析供应商信息(B端特色)"""

if not supplier_json or supplier_json.get("errorCode") != 0:

return None

data = supplier_json.get("result", {})

return {

"id": data.get("memberId", ""),

"company_name": data.get("companyName", ""),

"main_product": data.get("mainProduct", "").split(";") if data.get("mainProduct") else [],

"credit_level": data.get("creditLevel", "未评级"), # 诚信通等级

"establishment_year": data.get("startYear", "未知"), # 成立年份

"is_verified": "verified" in data # 是否企业认证

}

def parse_spec_data(self, spec_json):

"""解析规格参数与多SKU数据"""

if not spec_json or spec_json.get("errorCode") != 0:

return None

data = spec_json.get("result", {})

spec_groups = []

# 解析规格组(如颜色、尺寸)

for spec in data.get("specList", []):

spec_groups.append({

"spec_id": spec.get("specId", ""),

"spec_name": spec.get("specName", ""),

"values": [v.get("specValueName", "") for v in spec.get("specValueList", [])]

})

#

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    9158

    浏览量

    154598
  • API
    API
    +关注

    关注

    2

    文章

    1806

    浏览量

    64849
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    淘宝/天猫:通过商品详情API实现多店铺商品信息批量同步,确保价格、库存实时更新

    ? 在电商运营中,管理多个淘宝或天猫店铺的商品信息(如价格和库存)是一项繁琐的任务。手动更新耗时耗力,且容易出错,导致价格不一致或库存超卖。通过淘宝/天猫开放平台提供的商品详情API,
    的头像 发表于 09-08 16:05 ?27次阅读
    淘宝/天猫:通过<b class='flag-5'>商品</b><b class='flag-5'>详情</b>API<b class='flag-5'>实现</b>多店铺<b class='flag-5'>商品</b>信息批量同步,确保价格、库存实时更新

    京东商品详情商品详情接口技术实现数据抓取到结构化解析方案

    全球电商API
    的头像 发表于 09-03 11:07 ?136次阅读
    京东<b class='flag-5'>商品</b><b class='flag-5'>详情商品</b><b class='flag-5'>详情</b><b class='flag-5'>接口技术</b><b class='flag-5'>实现</b>:<b class='flag-5'>从</b><b class='flag-5'>数据</b>抓取到<b class='flag-5'>结构化</b>解析<b class='flag-5'>全</b>方案

    利用小红书电商 API 接口实现小红书店铺商品推荐个性

    ? 在当今电商竞争激烈的环境下,个性商品推荐已成为提升用户体验和转化率的关键策略。小红书(Xiaohongshu)作为领先的社交电商平台,提供了强大的电商 API 接口,允许开发者访
    的头像 发表于 08-27 15:31 ?151次阅读
    利用小红书电商 API <b class='flag-5'>接口</b>,<b class='flag-5'>实现</b>小红书店铺<b class='flag-5'>商品</b>推荐个性<b class='flag-5'>化</b>

    京东工业平台商品详情接口开发指南:工业级数据解析与实战实现

    API接口
    的头像 发表于 08-25 10:50 ?210次阅读
    京东工业<b class='flag-5'>平台商品</b><b class='flag-5'>详情</b><b class='flag-5'>接口</b>开发指南:工业级<b class='flag-5'>数据</b>解析与实战<b class='flag-5'>实现</b>

    eBay 商品详情 API 深度解析:基础信息到变体数据获取方案

    通过本文提供的方案,开发者可以快速实现 eBay 商品详情数据的获取和处理,为跨境电商应用提供丰富的商品信息支持。实际开发中,需遵守 eBa
    的头像 发表于 08-18 10:17 ?229次阅读
    eBay <b class='flag-5'>商品</b><b class='flag-5'>详情</b> API 深度解析:<b class='flag-5'>从</b>基础信息到变体<b class='flag-5'>数据</b>获取<b class='flag-5'>全</b>方案

    淘宝 API 接口:海量商品数据挖掘的宝藏钥匙

    高效、安全地访问和分析这些数据,为市场洞察、用户行为预测和商业决策提供强大支持。 淘宝 API 接口的核心功能 淘宝 API 接口提供了一系列标准的服务,允许开发者通过编程方式获取
    的头像 发表于 08-12 14:26 ?241次阅读
    淘宝 API <b class='flag-5'>接口</b>:海量<b class='flag-5'>商品数据</b>挖掘的宝藏钥匙

    电商 API 接口:多平台商品评论分析的利器

    强大工具。本文将逐步介绍如何利用 API 实现高效的多平台商品评论分析,帮助商家和研究者快速获取洞察。 什么是电商 API 接口? API(应用程序接口)是一套标准
    的头像 发表于 08-11 14:53 ?249次阅读
    电商 API <b class='flag-5'>接口</b>:多<b class='flag-5'>平台商品</b>评论分析的利器

    利用电商 API 接口,轻松完成多平台价格监控

    ? 在竞争激烈的电商市场,价格策略直接影响销售转化率。传统人工比价耗时费力,而电商API接口技术让多平台价格监控实现自动、精准和实时
    的头像 发表于 08-11 14:35 ?599次阅读
    利用电商 API <b class='flag-5'>接口</b>,轻松完成多<b class='flag-5'>平台</b>价格监控

    电商 API 接口:开启平台商品信息同步新时代

    仅影响用户体验,还增加运营成本。如何解决这一痛点?电商 API 接口应运而生,它通过标准数据交换,实现商品信息的实时同步,开启了
    的头像 发表于 08-08 14:14 ?226次阅读
    电商 API <b class='flag-5'>接口</b>:开启<b class='flag-5'>全</b><b class='flag-5'>平台商品</b>信息同步新时代

    产品详情查询API接口

    ,使用HTTP协议实现数据传输,支持多种应用场景,包括电商平台、移动应用和数据分析系统。本文将逐步介绍产品详情查询API
    的头像 发表于 07-24 14:39 ?179次阅读
    产品<b class='flag-5'>详情</b>查询API<b class='flag-5'>接口</b>

    micro 关键字搜索覆盖商品,并通过 API 接口提供实时数据

    micro 关键字搜索覆盖商品”并通过 API 接口提供实时数据
    的头像 发表于 07-13 10:13 ?382次阅读

    如何利用京东商品详情id拿到商品的详细信息 示例展示

    利用京东商品详情 ID(即 SKU ID)获取商品详细信息,可通过京东开放平台官方 API 或非官方接口(逆向解析)
    的头像 发表于 07-10 09:37 ?410次阅读

    AD、DA转换器接口技术与实用线路

    板设计。 全文从头至尾都突出一个“用”字,除阐述基本原理、基本接法和计算机的接口技术之外,列举了大量的实用电路和应用软件,使该书具有理论联系实际的特色,这对于具体设计检测仪器、智能仪表、数据
    发表于 04-10 15:10

    RS485接口技术的应用和优缺点有哪些

    RS485接口技术可以实现多个设备之间数据传输和通信网络构建的串行通信协议。能够简化工业控制领域中设备间的连接与通信过程。 具体来说,RS485接口技术主要应用于以下几个方面: 工业自
    的头像 发表于 09-14 14:36 ?4061次阅读

    RS232接口技术的用途及优缺点介绍

    RS232接口技术是一种用于实现计算机与外部设备之间数据传输的串行通信协议。其设计初衷在于简化计算机与各种外部设备之间的连接与通信过程,使得数据能够以一种可靠、高效的方式在两者之间传输
    的头像 发表于 09-14 14:16 ?2906次阅读