×

深度分析电子元件API接口,用Python脚本实现

万邦科技Lex 万邦科技Lex 发表于2025-08-28 13:57:25 浏览234 评论0

抢沙发发表评论

  免费测试电子元件API接口

电子元件 API 接口主要服务于电子制造业、研发企业、供应链平台等,提供电子元件(如电阻、电容、芯片、传感器等)的**型号查询、库存实时查询、价格对比、供应商信息、 datasheet 下载** 等核心功能,支撑采购决策、库存管理、研发选型等场景。目前主流的电子元件 API 主要来自专业电子元件平台(如 Digikey、Mouser、RS Components)或国内供应链平台(如立创商城、华强电子网),其接口设计、认证机制和数据维度存在差异,但核心逻辑一致。

 一、电子元件 API 核心特性分析

 1. 主流 API 平台及接口体系

电子元件 API 按服务范围可分为**国际平台**(覆盖全球供应链)和**国内平台**(聚焦国内现货),核心平台及接口功能如下:

数据维度关键字段说明
元件基础信息part_number(型号)、manufacturer(原厂)、category(品类)、specs(规格参数)如芯片型号STM32F103C8T6、规格32位ARM Cortex-M3
库存信息stock_quantity(库存数量)、location(库存位置)、lead_time(交货周期)区分 “现货”(In Stock)和 “期货”(Pre-order
价格信息unit_price(单价)、moq(最小起订量)、price_break(阶梯价)如 “1-99 个:5 元 / 个;100-999 个:4.5 元 / 个”
供应商信息supplier_id(供应商 ID)、supplier_rating(供应商评级)、shipping_method国内平台含 “是否支持包邮”“发货时效”,国际平台含 “关税预估”
技术文档datasheet_url( datasheet 下载链接)、cad_model(CAD 模型链接)研发选型核心数据,部分平台需权限才能下载

3. 认证机制

电子元件 API 因涉及商业数据(如供应商报价、库存),认证机制较严格,主流方式有两种:


  1. API Key 认证(国内平台常用):
    • 开发者在平台注册账号并创建应用,获取 api_key(或 app_key);

    • 调用接口时在请求头(如 Authorization: Bearer {api_key})或参数中携带 api_key,无需用户授权,适合服务器端调用。

  2. OAuth 2.0 认证(国际平台常用,如 Digikey):
    • 需先申请 client_id 和 client_secret,引导用户授权(如采购账号授权);

    • 通过授权码获取 access_token,调用接口时携带令牌,支持权限细分(如 “仅查询库存”“可创建订单”)。

二、典型平台 API 深度解析(以立创商城 LCSC 为例)

立创商城是国内电子元件现货平台,其 API 接口(立创开放平台)对开发者友好,支持免费申请,适合国内场景的 Python 实现。以下以其核心接口为例展开分析:

1. 核心接口列表

接口名称请求方式核心参数功能描述响应数据示例(简化)
/api/v1/part/searchGETkeyword(关键词)、page按型号 / 关键词搜索元件{"code":200,"data":{"total":120,"parts":[{"part_number":"STM32F103C8T6","stock":5000}]}}
/api/v1/part/stockGETpart_number(型号)查询指定型号的实时库存{"code":200,"data":{"stock_quantity":5000,"location":"深圳仓","lead_time":"1-2天"}}
/api/v1/part/priceGETpart_numberquantity查询指定型号的阶梯价{"code":200,"data":{"moq":1,"price_break":[{"qty":1,"price":5.2},{"qty":100,"price":4.8}]}}
/api/v1/bom/parsePOSTbom_content(BOM 文本)解析 BOM 清单,匹配现货元件{"code":200,"data":{"matched_count":8,"unmatched_count":2,"items":[...]}}

2. 接口限制与合规性

  • 调用频率:免费账号 QPS 限制为 1(每秒 1 次),企业账号可提升至 5;

  • 数据权限:仅返回立创自营及合作供应商的现货数据,无期货信息;

  • 合规要求:禁止用于 “批量爬取库存后加价转售”“恶意查询非采购需求的元件”,违反将封禁 API 权限。

三、Python 脚本实现(基于立创商城 API)

以下实现立创商城 API 的通用调用框架,包含元件搜索、库存查询、价格查询功能,需先在立创开放平台申请 api_key

1. 完整代码实现

import requestsimport jsonimport loggingfrom typing import Dict, Optional, Listfrom requests.exceptions import RequestException# 配置日志(记录请求状态和错误)logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s")class LCSCAPI:
    def __init__(self, api_key: str):
        """
        初始化立创商城API客户端
        :param api_key: 立创开放平台获取的api_key
        """
        self.api_key = api_key
        self.base_url = "https://open.lcsc.com/api/v1"
        self.session = requests.Session()
        # 设置默认请求头(携带api_key)
        self.session.headers.update({
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json;charset=UTF-8"
        })

    def _handle_response(self, response: requests.Response) -> Optional[Dict]:
        """
        统一处理接口响应(错误判断、JSON解析)
        :param response: 接口响应对象
        :return: 业务数据(无错误时)或None
        """
        try:
            response.raise_for_status()  # 抛出HTTP错误(如404、500)
            result = response.json()

            # 立创API错误码:code=200为成功,其他为错误
            if result.get("code") != 200:
                error_msg = result.get("msg", "未知错误")
                logging.error(f"API错误:{error_msg}(错误码:{result.get('code')})")
                return None

            return result.get("data", {})  # 返回业务数据

        except RequestException as e:
            logging.error(f"请求异常:{str(e)}")
            return None
        except json.JSONDecodeError:
            logging.error(f"响应解析失败:{response.text[:200]}...")
            return None

    def search_part(self, keyword: str, page: int = 1, page_size: int = 20) -> Optional[Dict]:
        """
        搜索电子元件(按型号/关键词)
        :param keyword: 搜索关键词(如"STM32F103C8T6"、"0805电容")
        :param page: 页码(默认第1页)
        :param page_size: 每页数量(最大50)
        :return: 搜索结果(含总条数、元件列表)
        """
        url = f"{self.base_url}/part/search"
        params = {
            "keyword": keyword,
            "page": page,
            "pageSize": page_size        }

        try:
            response = self.session.get(url, params=params, timeout=10)
            data = self._handle_response(response)
            if not data:
                return None

            # 格式化元件列表(提取核心字段)
            formatted_parts = []
            for part in data.get("parts", []):
                formatted_parts.append({
                    "part_number": part.get("partNumber"),  # 元件型号
                    "manufacturer": part.get("manufacturer"),  # 原厂
                    "category": part.get("categoryName"),  # 品类(如"MCU")
                    "stock_quantity": part.get("stockQuantity"),  # 库存数量
                    "min_price": float(part.get("minPrice", 0)),  # 最低单价
                    "moq": part.get("moq"),  # 最小起订量
                    "datasheet_url": part.get("datasheetUrl"),  # datasheet链接
                    "lcsc_part_number": part.get("lcscPartNumber")  # 立创内部型号
                })

            return {
                "total_count": data.get("totalCount", 0),  # 总搜索结果数
                "current_page": page,
                "page_size": page_size,
                "parts": formatted_parts            }

        except Exception as e:
            logging.error(f"元件搜索失败:{str(e)}")
            return None

    def get_part_stock(self, part_number: str) -> Optional[Dict]:
        """
        查询指定型号的实时库存
        :param part_number: 元件型号(如"STM32F103C8T6")
        :return: 库存信息(数量、位置、交货周期)
        """
        url = f"{self.base_url}/part/stock"
        params = {"partNumber": part_number}

        try:
            response = self.session.get(url, params=params, timeout=10)
            data = self._handle_response(response)
            if not data:
                return None

            # 格式化库存数据
            return {
                "part_number": part_number,
                "stock_quantity": data.get("stockQuantity"),  # 总库存
                "stock_detail": [  # 分仓库库存详情
                    {
                        "location": warehouse.get("warehouseName"),  # 仓库位置(如"深圳仓")
                        "quantity": warehouse.get("quantity"),  # 该仓库库存
                        "lead_time": warehouse.get("leadTime")  # 交货周期
                    } for warehouse in data.get("stockDetails", [])
                ],
                "stock_status": "有货" if data.get("stockQuantity", 0) > 0 else "无货"
            }

        except Exception as e:
            logging.error(f"库存查询失败:{str(e)}")
            return None

    def get_part_price(self, part_number: str) -> Optional[Dict]:
        """
        查询指定型号的阶梯价格
        :param part_number: 元件型号
        :return: 价格信息(最小起订量、阶梯价)
        """
        url = f"{self.base_url}/part/price"
        params = {"partNumber": part_number}

        try:
            response = self.session.get(url, params=params, timeout=10)
            data = self._handle_response(response)
            if not data:
                return None

            # 格式化阶梯价数据
            price_breaks = []
            for pb in data.get("priceBreaks", []):
                price_breaks.append({
                    "min_quantity": pb.get("minQuantity"),  # 该阶梯最小数量
                    "max_quantity": pb.get("maxQuantity"),  # 该阶梯最大数量(None表示无上限)
                    "unit_price": float(pb.get("unitPrice", 0))  # 该阶梯单价
                })

            return {
                "part_number": part_number,
                "moq": data.get("moq"),  # 最小起订量
                "currency": data.get("currency", "CNY"),  # 货币类型(默认人民币)
                "price_breaks": price_breaks            }

        except Exception as e:
            logging.error(f"价格查询失败:{str(e)}")
            return None# 示例调用if __name__ == "__main__":
    # 1. 替换为你的立创API Key(从开放平台获取)
    LCSC_API_KEY = "your_lcsc_api_key"

    # 2. 初始化API客户端
    lcsc_api = LCSCAPI(api_key=LCSC_API_KEY)

    # 3. 搜索元件(以"STM32F103C8T6"为例)
    search_keyword = "STM32F103C8T6"
    search_result = lcsc_api.search_part(keyword=search_keyword, page=1, page_size=5)
    if search_result:
        print(f"=== 元件搜索结果(关键词:{search_keyword})===")
        print(f"总找到 {search_result['total_count']} 个元件,当前第 {search_result['current_page']} 页\n")
        for i, part in enumerate(search_result["parts"], 1):
            print(f"{i}. 型号:{part['part_number']}")
            print(f"   原厂:{part['manufacturer']} | 品类:{part['category']}")
            print(f"   库存:{part['stock_quantity']} 件 | 最小单价:{part['min_price']} 元")
            print(f"   起订量:{part['moq']} 件 | datasheet:{part['datasheet_url'][:50]}...")
            print("-" * 100)

    # 4. 查询第一个元件的库存和价格
    if search_result and search_result["parts"]:
        target_part = search_result["parts"][0]["part_number"]
        print(f"\n=== 元件 {target_part} 详情 ===")

        # 4.1 查询库存
        stock_info = lcsc_api.get_part_stock(part_number=target_part)
        if stock_info:
            print(f"库存状态:{stock_info['stock_status']}(总库存:{stock_info['stock_quantity']} 件)")
            print("分仓库库存:")
            for warehouse in stock_info["stock_detail"]:
                print(f"   - {warehouse['location']}:{warehouse['quantity']} 件,交货周期:{warehouse['lead_time']}")

        # 4.2 查询价格
        price_info = lcsc_api.get_part_price(part_number=target_part)
        if price_info:
            print(f"\n价格信息(货币:{price_info['currency']}):")
            print(f"最小起订量:{price_info['moq']} 件")
            print("阶梯价:")
            for pb in price_info["price_breaks"]:
                max_qty = pb["max_quantity"] if pb["max_quantity"] else "不限"
                print(f"   - {pb['min_quantity']}-{max_qty} 件:{pb['unit_price']} 元/件")

2. 代码说明

(1)核心模块

  • 认证处理:通过请求头 Authorization: Bearer {api_key} 携带认证信息,符合立创 API 规范;

  • 响应统一处理_handle_response 函数封装 HTTP 错误、JSON 解析、错误码判断,减少重复代码;

  • 数据格式化:提取接口返回的核心字段(如型号、库存、单价),过滤冗余数据,便于后续使用。

(2)关键功能

  • 元件搜索:支持按型号(精确)或关键词(模糊,如 “0805 电容”)搜索,返回分页结果;

  • 库存查询:返回总库存及分仓库详情(如深圳仓、上海仓的库存分布);

  • 价格查询:解析阶梯价,帮助采购判断 “批量采购的成本优势”。

四、国际平台 API 扩展(以 Digikey 为例)

若需对接国际平台(如 Digikey),其 API 逻辑与立创类似,但需注意以下差异:


  1. 认证方式:采用 OAuth 2.


群贤毕至

访客