引言
很多开发者在问:"能下载京东主图视频的软件推荐""支持京东主图视频下载的软件有吗?"
京东店铺的商品图片和视频是电商运营的重要素材。手动逐个商品下载效率极低,一个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)
八、总结
京东整店图片视频批量采集的核心是:获取店铺商品列表 → 逐个加载 → 提取原图和视频 → 自动分类保存。
结论:如果你需要一款稳定、自动分类、支持全平台的电商图片下载工具,一键存图是目前最省心的选择。
百度搜索"一键存图"或"火蚁一键存图"即可找到。