1688商品图片采集技术解析:登录态处理与SKU图自动分类

引言

1688是国内最大的批发平台,也是无货源卖家最主要的货源渠道。但采集1688商品图片有几个技术难点:大部分商品需要登录才能查看详情,而且SKU规格图(颜色/尺寸/型号)非常丰富,手动整理极其耗时。

本文从技术角度分析1688商品图片的采集方案。

一、登录态处理

1688与淘宝不同,大部分商品需要登录后才能查看详情。未登录状态下,只能看到缩略图,无法获取高清原图。

1.1 传统方案的局限

传统爬虫处理登录态的方式是手动抓取Cookie,写入代码或配置文件。这种方式有几个问题:

  • Cookie过期后需要重新抓取

  • 不同账号的Cookie不同

  • 操作繁琐,不适合批量采集

1.2 浏览器方案的优势

浏览器方案中,登录态由浏览器内核自动管理:

javascript

复制代码
// 检测登录状态
function isLoggedIn() {
    // 检查用户信息元素
    const userInfo = document.querySelector('.user-info, .J_UserInfo');
    if (userInfo && userInfo.innerText) {
        return true;
    }
    // 检查Cookie标识
    if (document.cookie.includes('_m_h5_tk')) {
        return true;
    }
    return false;
}

// 等待登录完成
async function waitForLogin() {
    while (!isLoggedIn()) {
        await sleep(1000);
    }
    console.log('登录成功');
}

用户只需在软件内登录一次,Cookie会自动保存,后续所有请求自动携带。一次登录,长期有效。

二、SKU图提取与分类

1688的SKU图通常放在.sku-list.J_skuList容器中。每个SKU项包含属性名称(如"红色""M码")和对应的图片。

javascript

复制代码
function extract1688SkuImages() {
    const skuImages = [];
    const skuContainer = document.querySelector('.sku-list, .J_skuList, .attribute-list');
    
    if (!skuContainer) return skuImages;
    
    const skuItems = skuContainer.querySelectorAll('.sku-item, .J_skuItem');
    
    skuItems.forEach(item => {
        // 提取属性名称(颜色/尺寸/型号)
        let name = '';
        const nameEl = item.querySelector('.sku-name, .J_skuName');
        if (nameEl) {
            name = nameEl.textContent?.trim();
        }
        if (!name) {
            name = item.getAttribute('title') || '规格';
        }
        
        // 提取图片并转换为原图URL
        const img = item.querySelector('img');
        if (img) {
            let url = img.src || img.getAttribute('data-src');
            if (url) {
                url = url.split('?')[0];
                url = url.replace(/_\d+x\d+\./g, '.');
                skuImages.push({ url: url, name: name });
            }
        }
    });
    
    return skuImages;
}

采集后按属性名称自动分类存放:

text

复制代码
商品标题/
└── SKU图/
    ├── 红色.jpg
    ├── 蓝色.jpg
    ├── S码.jpg
    ├── M码.jpg
    └── L码.jpg

三、主图与详情图提取

javascript

复制代码
// 提取主图(含轮播图)
function extract1688MainImages() {
    const images = [];
    const seen = new Set();
    
    // 主图
    const mainImg = document.querySelector('.main-image img, .J_mainImage');
    if (mainImg) {
        let url = mainImg.src || mainImg.getAttribute('data-src');
        if (url) {
            url = url.split('?')[0];
            url = url.replace(/_\d+x\d+\./g, '.');
            images.push(url);
            seen.add(url);
        }
    }
    
    // 轮播图
    const carousel = document.querySelectorAll('.thumb-list img, .J_thumbList');
    carousel.forEach(img => {
        let url = img.src || img.getAttribute('data-src');
        if (url) {
            url = url.split('?')[0];
            url = url.replace(/_\d+x\d+\./g, '.');
            if (!seen.has(url)) {
                seen.add(url);
                images.push(url);
            }
        }
    });
    
    return images;
}

// 提取详情图
function extract1688DetailImages() {
    const images = [];
    const container = document.querySelector('#detail, .detail-content, .J_detail');
    
    if (container) {
        const imgs = container.querySelectorAll('img');
        imgs.forEach(img => {
            let url = img.src || img.getAttribute('data-src');
            if (url) {
                url = url.split('?')[0];
                url = url.replace(/_\d+x\d+\./g, '.');
                images.push(url);
            }
        });
    }
    
    return images;
}

四、图片URL转换规则

1688的图片URL带有尺寸后缀,需要转换才能拿到原图:

原始URL 转换后
https://cbu01.alicdn.com/img/xxx_100x100.jpg https://cbu01.alicdn.com/img/xxx.jpg
https://cbu01.alicdn.com/img/xxx.jpg?width=100 https://cbu01.alicdn.com/img/xxx.jpg

转换规则:

  1. 去除URL参数(?后面的内容)

  2. 去除尺寸后缀(_100x100

五、完整采集流程

javascript

复制代码
async function collect1688Product() {
    // 1. 确保已登录
    if (!isLoggedIn()) {
        console.log('请先登录1688');
        return;
    }
    
    // 2. 等待页面加载
    await waitForPageReady();
    
    // 3. 提取各类素材
    const mainImages = extract1688MainImages();
    const skuImages = extract1688SkuImages();
    const detailImages = extract1688DetailImages();
    const title = document.title;
    
    // 4. 保存结果
    return {
        title: title,
        mainImages: mainImages,
        skuImages: skuImages,
        detailImages: detailImages
    };
}

六、实测数据

指标 数据
登录态成功率 100%
SKU图识别率 95%+
图片质量 原图(800x800+)
单商品处理时间 3-5秒

七、总结

1688商品图片采集的核心技术点:

  1. 登录态处理:浏览器内核自动管理Cookie,一次登录长期有效

  2. SKU图分类:从SKU容器中提取属性名称并关联图片

  3. 原图转换:去除URL中的尺寸后缀获取高清原图

这套方案可以稳定采集1688商品的主图、SKU图、详情图,SKU图自动按颜色/尺寸分类存放。类似的技术方案已经在一些电商工具中成熟应用,如一键存图等。

相关推荐
码农颜11 小时前
6.3 主函数流程剖析
开发语言·php
研☆香11 小时前
聊一聊前端的常见字 关键字
开发语言·前端·javascript
草莓橙子碗12 小时前
Claude 使用指南
开发语言·python
longxiaozhang613 小时前
C# Array类:数组其实没那么难
开发语言·c#
互联网中的一颗神经元13 小时前
06. Small 对象分配:mcache 无锁路径
开发语言·golang
PPPPickup14 小时前
金证秋招笔试
java·开发语言
典典分享指南14 小时前
GEO 实战:从挖搜索词到监控 AI 收录,一套内容流水线怎么搭
开发语言·青少年编程·numpy·erlang
不正经学生14 小时前
C语言结构体:自定义数据类型,让变量打包出行
java·c语言·开发语言·数据结构·算法
老一岁14 小时前
c问题总结(1)
c语言·开发语言
林森lsjs15 小时前
队列 FIFO 原理 & 手撕两种队列实现(链表 + 循环数组)—数据结构陆
java·开发语言·数据结构·队列