构建面向电子行业的垂直信息采集系统:Digikey元器件搜索实战

爬虫代理

前言:采购决策背后的数据支撑

在硬件开发、工业控制、科研工程等多个领域,电子元器件的选型和采购过程日趋复杂。工程技术人员需要依据参数精确比对型号,采购方则关注供货周期与供货稳定性。然而,手动逐一在各平台检索信息,不仅耗时,也存在数据碎片化问题。

为提升效率与可视性,构建一个针对电子行业的自动采集系统,从主流分销平台中提取关键参数,已成为众多企业推动采购流程数字化的方向之一。本文将以 Digikey 平台为例,介绍一个模块化、可扩展的信息抓取方案,涵盖搜索、结构提取、代理配置与数据归档等环节。

系统结构拆解

我们设计的整体架构由五个主要组件构成,各司其职、互相解耦:

关键词输入

  ↓

请求构建器(配置IP代理、用户信息、浏览器标识)

  ↓

页面解析器(提取产品字段)

  ↓

数据存储器(保存至数据库)

  ↓

定时调度器(每日增量采集)

模块功能说明

请求构建器

* 构造搜索URL

* 接入代理IP服务(示例中使用亿牛云代理)

* 配置用户与浏览器伪装头

页面解析器

* 解析搜索结果页面HTML结构

* 获取字段:产品编号、制造商、制造商产品编号、描述、原厂交货周期等

* 支持翻页与冗余信息去重

数据存储器

* 将数据写入本地数据库(如 SQLite)

* 记录抓取时间、搜索关键词

* 为后续比对与趋势分析提供支撑

定时调度器

* 通过定时任务框架实现周期运行

* 可每日自动执行更新流程

实现示例

下面是简化版实现代码,用于演示如何结合代理、请求头伪装及HTML结构解析,完成核心数据提取并归档入库。

import requests

from bs4 import BeautifulSoup

import sqlite3

import time

from datetime import datetime

# 代理与请求头配置(参考亿牛云示例 www.16yun.cn)

proxies = {

    "http": "http://16YUN:16IP@proxy.16yun.cn:3100",

    "https": "http://16YUN:16IP@proxy.16yun.cn:3100"

}

headers = {

    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/122.0",

    "Cookie": "your_cookie_if_needed=abc123;"

}

# 初始化数据库结构

def init_db():

    conn = sqlite3.connect("digikey_products.db")

    c = conn.cursor()

    c.execute("""

        CREATE TABLE IF NOT EXISTS products (

            id INTEGER PRIMARY KEY AUTOINCREMENT,

            crawl_time TEXT,

            keyword TEXT,

            product_number TEXT,

            manufacturer TEXT,

            mfr_product_number TEXT,

            description TEXT,

            lead_time TEXT

        )

    """)

    conn.commit()

    conn.close()

# 抓取函数:根据关键词爬取页面并提取字段

def scrape_products(keyword):

    print(f"正在采集关键词: {keyword}")

    url = f"https://www.digikey.cn/zh/products/result?s=N&keywords={keyword}"

    try:

        response = requests.get(url, headers=headers, proxies=proxies, timeout=10)

        response.raise_for_status()

    except Exception as e:

        print(f"请求失败: {e}")

        return

    soup = BeautifulSoup(response.text, "html.parser")

    table = soup.find("table", class_="product-table")

    if not table:

        print("未获取到产品表格结构")

        return

    rows = table.find_all("tr", class_="product-table-row")

    crawl_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    conn = sqlite3.connect("digikey_products.db")

    c = conn.cursor()

    for row in rows:

        cols = row.find_all("td")

        if len(cols) < 6:

            continue

        try:

            product_number = cols[0].get_text(strip=True)

            manufacturer = cols[1].get_text(strip=True)

            mfr_product_number = cols[2].get_text(strip=True)

            description = cols[3].get_text(strip=True)

            lead_time = cols[4].get_text(strip=True)

            c.execute("""

                INSERT INTO products (

                    crawl_time, keyword, product_number, manufacturer,

                    mfr_product_number, description, lead_time

                ) VALUES (?, ?, ?, ?, ?, ?, ?)

            """, (

                crawl_time, keyword, product_number, manufacturer,

                mfr_product_number, description, lead_time

            ))

        except Exception as e:

            print(f"数据入库失败: {e}")

    conn.commit()

    conn.close()

    print(f"关键词'{keyword}'采集完毕。")

# 主流程入口

if __name__ == "__main__":

    init_db()

    keywords = ["STM32", "贴片电阻", "电容", "连接器"]

    for kw in keywords:

        scrape_products(kw)

        time.sleep(5)  # 避免访问频率过高被封锁

信息采集流程图

输入关键词或型号

      ↓

发起网页请求(带代理、伪装头)

      ↓

获取HTML响应 → 定位结果表格

      ↓

提取产品字段并写入数据库

      ↓

支持周期性采集与增量更新

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容