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图自动按颜色/尺寸分类存放。类似的技术方案已经在一些电商工具中成熟应用,如一键存图等。

相关推荐
chase_my_dream1 小时前
C++ + SLAM 高频面试问题整理
开发语言·c++·面试
Cloud_Shy6181 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
天佑木枫2 小时前
15天Python入门系列 · 序
开发语言·python
宋拾壹3 小时前
同时添加多个类目
android·开发语言·javascript
凡人叶枫3 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
小小龙学IT4 小时前
Go 语言后端开发:从并发模型到生产落地的工程实践
开发语言·后端·golang
ytttr8734 小时前
Qt 数字键盘实现
开发语言·qt
wearegogog1234 小时前
C# .NET 文件比较工具 WinForms
开发语言·c#·.net
再写一行代码就下班4 小时前
Cursor配置Java环境、创建Spring Boot项目的步骤
java·开发语言·spring boot