京东整店商品图片视频批量下载技术:从商品列表到自动分类

引言

很多开发者在问:"能下载京东主图视频的软件推荐""支持京东主图视频下载的软件有吗?"

京东店铺的商品图片和视频是电商运营的重要素材。手动逐个商品下载效率极低,一个200个商品的店铺需要16-32小时。

本文将完整解析京东整店图片视频批量采集的技术架构,包括商品列表获取、图片提取(原图)、视频提取(mp4/m3u8)、自动分类等核心模块。

一、京东整店采集架构

text

复制代码
┌─────────────────────────────────────────────────────────────────────────────┐
│                    京东整店图片视频批量采集架构                              │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  店铺URL ──→ 获取商品列表 ──→ 解析分页 ──→ 商品URL队列                      │
│      │            │              │              │                           │
│      ▼            ▼              ▼              ▼                           │
│   链接验证     列表页解析     页码遍历     FIFO队列                         │
│                                                                              │
│  ─────────────────────────────────────────────────────────────────────────  │
│                                                                              │
│  商品URL ──→ 加载页面 ──→ 提取图片 ──→ 提取视频 ──→ 分类保存               │
│      │          │           │            │            │                     │
│      ▼          ▼           ▼            ▼            ▼                     │
│   队列消费   浏览器方案   主图/SKU/详情   mp4/m3u8   按商品分类              │
│                                                                              │
└─────────────────────────────────────────────────────────────────────────────┘

二、京东店铺商品列表获取

2.1 分页解析

python

复制代码
class JDShopParser:
    """京东店铺商品列表解析器"""
    
    def __init__(self):
        self.browser = BrowserEngine()
    
    def get_all_product_urls(self, shop_url: str) -> List[str]:
        """获取京东店铺所有商品链接"""
        urls = []
        page = 1
        
        while True:
            # 京东店铺分页URL格式
            page_url = f"{shop_url}/search-1-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-{page}.html"
            
            browser = self.browser.CreateBrowser(page_url)
            if not PageLoader.WaitForPageReady(browser, timeout=10):
                break
            
            # 提取当前页商品链接
            script = """
            Array.from(document.querySelectorAll('.gl-item .p-img a, .J_ItemPic a'))
                .map(a => a.href)
                .filter(href => href && href.includes('item.jd.com'));
            """
            new_urls = ExecuteJavaScript(browser, script)
            
            if not new_urls:
                break
            
            urls.extend(new_urls)
            print(f"第{page}页: 发现{len(new_urls)}个商品")
            page += 1
        
        return urls

三、京东商品图片提取

3.1 图片URL提取与转换

javascript

复制代码
// jd_image_extractor.js - 京东商品页图片提取
(function() {
    'use strict';
    
    class JDImageExtractor {
        constructor() {
            this.images = {
                main: [],    // 主图
                sku: [],     // SKU图(颜色/尺码)
                detail: []   // 详情图
            };
        }
        
        // 获取京东原图URL
        getOriginalUrl(url) {
            if (!url) return null;
            
            // 去除京东缩略图参数
            // 例如: xxx.jpg!q70.jpg -> xxx.jpg
            url = url.replace(/!q\d+\.jpg$/, '.jpg');
            url = url.replace(/\.n\.jpg/, '.jpg');
            url = url.split('?')[0];
            
            return url;
        }
        
        // 提取主图
        extractMainImages() {
            const mainSelectors = [
                '.spec-img',           // 京东主图
                '.J_zoomPic',          // 京东放大镜图
                '.preview-img img',    // 预览图
                '#spec-img'            // 规格图区
            ];
            
            for (const selector of mainSelectors) {
                const img = document.querySelector(selector);
                if (img) {
                    let url = img.src || img.getAttribute('data-lazy-img');
                    if (url) {
                        return [this.getOriginalUrl(url)];
                    }
                }
            }
            
            // 轮播图
            const carousel = document.querySelectorAll('.preview-thumb img, .J_thumImg');
            const urls = [];
            carousel.forEach(img => {
                let url = img.src || img.getAttribute('data-lazy-img');
                if (url) {
                    urls.push(this.getOriginalUrl(url));
                }
            });
            return urls.length ? urls : [];
        }
        
        // 提取SKU图(颜色/尺码图)
        extractSkuImages() {
            const skuImages = [];
            const skuContainer = document.querySelector('.sku-img-list, .J_skuImgList');
            
            if (skuContainer) {
                const imgs = skuContainer.querySelectorAll('img');
                imgs.forEach(img => {
                    let url = img.src || img.getAttribute('data-lazy-img');
                    if (url) {
                        // 提取SKU属性名称
                        let name = img.alt || img.title;
                        if (!name || name.length > 20) {
                            name = '属性图';
                        }
                        skuImages.push({
                            url: this.getOriginalUrl(url),
                            name: name
                        });
                    }
                });
            }
            
            return skuImages;
        }
        
        // 提取详情图
        extractDetailImages() {
            const detailImages = [];
            const detailContainer = document.querySelector('#detail, .detail-content, .J_detailContent');
            
            if (detailContainer) {
                const imgs = detailContainer.querySelectorAll('img');
                imgs.forEach(img => {
                    let url = img.src || img.getAttribute('data-lazy-img');
                    if (url) {
                        detailImages.push(this.getOriginalUrl(url));
                    }
                });
            }
            
            return detailImages;
        }
        
        // 主入口
        extract() {
            this.images.main = this.extractMainImages();
            this.images.sku = this.extractSkuImages();
            this.images.detail = this.extractDetailImages();
            return this.images;
        }
    }
    
    const extractor = new JDImageExtractor();
    return extractor.extract();
})();

四、京东商品视频提取

javascript

复制代码
// jd_video_extractor.js - 京东商品页视频提取
(function() {
    'use strict';
    
    class JDVideoExtractor {
        extract() {
            // 方法1:video标签
            const video = document.querySelector('.JDV-video video, .video-box video');
            if (video && video.src) {
                return { url: video.src, type: video.src.endsWith('.mp4') ? 'mp4' : 'm3u8' };
            }
            
            // 方法2:页面数据
            if (window.pageConfig && window.pageConfig.product) {
                const product = window.pageConfig.product;
                if (product.videoUrl) {
                    return { url: product.videoUrl, type: 'mp4' };
                }
            }
            
            // 方法3:商品JSON数据
            const scripts = document.querySelectorAll('script[type="application/ld+json"]');
            for (const script of scripts) {
                try {
                    const data = JSON.parse(script.textContent);
                    if (data.video && data.video.contentUrl) {
                        return { url: data.video.contentUrl, type: 'mp4' };
                    }
                } catch(e) {}
            }
            
            return null;
        }
    }
    
    const extractor = new JDVideoExtractor();
    return extractor.extract();
})();

五、m3u8视频下载器

python

复制代码
class M3U8Downloader:
    """m3u8视频下载器,支持并行下载和自动合并"""
    
    def __init__(self, max_workers=10):
        self.max_workers = max_workers
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
            'Referer': 'https://item.jd.com/'
        }
    
    def download(self, m3u8_url: str, output_path: str) -> bool:
        # 1. 解析m3u8获取ts片段列表
        playlist = m3u8.load(m3u8_url, headers=self.headers)
        segments = [seg.uri for seg in playlist.segments]
        
        # 2. 并行下载ts片段
        ts_files = []
        with ThreadPoolExecutor(max_workers=self.max_workers) as executor:
            futures = []
            for i, ts_url in enumerate(segments):
                ts_path = f'temp_{i:05d}.ts'
                futures.append(executor.submit(self._download_ts, ts_url, ts_path))
                ts_files.append(ts_path)
            
            for future in as_completed(futures):
                if not future.result():
                    return False
        
        # 3. 合并为mp4
        with open(output_path, 'wb') as outfile:
            for ts_file in ts_files:
                with open(ts_file, 'rb') as infile:
                    outfile.write(infile.read())
        
        # 4. 清理临时文件
        for ts_file in ts_files:
            os.remove(ts_file)
        
        return True
    
    def _download_ts(self, ts_url: str, ts_path: str, retry: int = 3) -> bool:
        for attempt in range(retry):
            try:
                resp = requests.get(ts_url, headers=self.headers, timeout=30)
                if resp.status_code == 200:
                    with open(ts_path, 'wb') as f:
                        f.write(resp.content)
                    return True
            except:
                time.sleep(1)
        return False

六、图片质量说明

重要: 一键存图下载的是京东的原图、原尺寸、原格式,无任何压缩、无水印、无MD5篡改。

七、完整采集流程

python

复制代码
class JDShopCollector:
    def collect_shop(self, shop_url: str, output_dir: str):
        # 1. 获取所有商品链接
        parser = JDShopParser()
        urls = parser.get_all_product_urls(shop_url)
        
        # 2. 批量采集
        for url in urls:
            self._collect_product(url, output_dir)
    
    def _collect_product(self, url: str, output_dir: str):
        browser = self.browser.CreateBrowser(url)
        PageLoader.WaitForPageReady(browser)
        
        # 提取图片
        images = ExecuteJavaScript(browser, JDImageExtractor.script)
        # 提取视频
        video = ExecuteJavaScript(browser, JDVideoExtractor.script)
        
        # 保存
        self._save_product(images, video, output_dir)

八、总结

京东整店图片视频批量采集的核心是:获取店铺商品列表 → 逐个加载 → 提取原图和视频 → 自动分类保存。

结论:如果你需要一款稳定、自动分类、支持全平台的电商图片下载工具,一键存图是目前最省心的选择。

百度搜索"一键存图"或"火蚁一键存图"即可找到。

相关推荐
Curvatureflight1 小时前
浏览器音频采集实践:麦克风权限、降噪、回声消除与 PCM 转换
前端·javascript·音视频·信息与通信·web·pcm
摇滚侠1 小时前
JavaWeb 全套教程 Filter 107-111
java·开发语言·servlet
聆风吟º1 小时前
【C标准库】深入理解C语言 atoi 函数:字符串转换为整数
c语言·开发语言·库函数·atoi
凤山老林1 小时前
81-Java Scanner 类
java·开发语言
j_xxx404_1 小时前
MySQL数据库基础硬核解析:从 C/S 网络服务到磁盘文件与存储引擎
linux·运维·服务器·开发语言·数据库·mysql·ai
艾莉丝努力练剑1 小时前
【QT】系统相关:QT文件
linux·服务器·开发语言·网络·qt·tcp/ip·计算机网络
糖果店的幽灵1 小时前
Spring AI 从入门到精通-ChatClient你与 AI 对话的终极武器
人工智能·python·spring
沐苏瑶1 小时前
深入浅出 Java 文件操作与 IO:从文件系统到数据流实战
java·开发语言
SPC的存折1 小时前
Redis完整学习手册(赵老师视频精华版)
redis·学习·音视频