电商素材本地解析:提取商品ID、原图与9:16截图
做电商内容、商品运营或者选品分析的朋友大概率都遇到过这种场景想在拼多多上整理一批爆款商品的图文素材需要把商品链接对应的商品 ID 提出来把详情页里的原图一张张保存下来再按短视频或公众号封面需要的 9:16 比例重新截图。如果纯靠手动操作一个商品耗三五分钟几十个商品就要忙一下午而且右键保存的图片往往是压缩过的缩略图放大之后根本没法用。这个需求看起来小但实际很磨人。很多人第一反应是写爬虫结果一上来就遇到反爬、验证码、接口加密等一堆问题还可能踩到合规边界。其实这类需求还有一条更稳妥、更适合普通运营和技术新手的路径把商品详情页保存到本地用本地解析的方式提取数据。它不主动抓取平台接口也不高频请求服务器本质上是处理你已经能正常访问的页面文件。这篇文章就从这条路径出发完整走一遍“批量提取商品 ID 提取原图 9:16 精准截图”的实操流程并说清楚本地解析和爬虫的边界在哪里。读完这篇文章你能获得三样东西一套能直接跑通的本地解析脚本一套不需要写复杂爬虫框架的图片素材整理方法以及一个不会轻易触碰到合规风险的实操边界判断。1. 这篇工具真正要解决的问题先界定清楚使用场景否则容易被标题带偏。我所说的“多多爆款网页解析工具”不是一个需要在服务器上部署的分布式爬虫系统也不是采集千万级商品数据的重型方案。它面向的是小批量、高频率的商品素材整理需求典型场景有这么几类电商运营需要把自家或同行的爆款商品详情页图片存档用于做竞品分析。短视频/直播团队需要把商品主图、详情图整理成 9:16 的竖版素材方便在抖音、视频号、快手发布。选品人员需要批量提取商品 ID用来做比价、库存跟踪或后续对接第三方工具。开发人员想做一个内部小工具帮运营同事把“商品链接 → 商品 ID → 原图素材”这条链路自动化。这类需求有几个共同点商品数量不算巨大通常一次几十条链接不需要 7x24 小时持续采集处理对象是已经公开可见的商品详情页最后的产出是结构化数据或本地图片文件。传统做法是直接用 Python 写爬虫用 requests 请求商品详情页再用正则或 XPath 提取数据。这个方法对技术能力要求高而且会撞上平台的风控策略。换一个思路既然浏览器能正常打开商品详情页先把页面“另存为”到本地再对本地 HTML 文件做解析整个过程就绕开了大部分网络请求层面的风险。所以这个工具真正解决的问题是在降低技术门槛和合规风险的前提下把“网页内容 → 结构化字段 → 图片素材 → 指定比例截图”这条素材生产链路自动化。2. 本地解析不是爬虫先搞清楚边界标题里特意写了“本地解析非爬虫”这不是为了蹭热词而是这个工具的定位确实和传统爬虫有本质区别。传统爬虫的工作方式通过程序模拟浏览器或直接请求接口按一定频率去访问目标网站把服务器返回的 HTML、JSON 等内容批量解析、存储。这种方式一是对目标服务器产生持续请求压力二是可能触发平台的反爬机制三是数据获取的授权边界不容易说清楚。本地解析的工作方式先用浏览器或手机浏览器打开商品详情页通过“另存为/保存网页”把 HTML 文件保存到本地然后程序只读取本地文件提取商品 ID、图片链接等字段。程序全程不主动访问目标服务器不发送任何网络请求。两者最关键的区别在“请求”这一步。传统爬虫需要程序去请求网页本地解析程序处理的是用户已经合法打开的网页文件。从这个角度看本地解析更像是一个“网页数据整理工具”而不是“数据采集程序”。当然这里要明确一点本地解析并不能让所有行为都自动合规。如果你把别人平台的商品数据用于商业发布、批量搬运、甚至二次销售仍然可能涉及版权和平台规则问题。真正的安全边界在于使用者必须拥有对应的访问权限用途限于个人学习、自有店铺运营、合规的数据存档等正常业务场景不得规避平台的反爬措施也不得用于恶意采集。下表对比了传统爬虫和本地解析的差异对比项传统爬虫本地解析工具数据来源主动请求服务器接口/页面本地已保存的 HTML 文件请求频率高频、定时触发无请求触发风控概率较高极低技术门槛需要处理反爬、Cookie、代理等只需要会解析 HTML适用规模海量数据几十到几百个页面合规风险取决于授权和使用方式相对可控但仍需遵守规则3. 商品 ID、原图、9:16 截图分别是什么在进入实操之前先把三个核心概念讲透。3.1 商品 ID商品 ID 是电商平台上每个商品的唯一标识通常是一串数字。在商品详情页链接里就能看到有点像商品的“身份证号”。有了商品 ID你可以做大量后续操作在平台内搜索定位商品给第三方工具传参维护自己的商品数据库甚至用它来对账。所以批量提取商品 ID 是很多自动化流程的第一步。3.2 原图商品详情页里的图片分两种一种是缩略图体积小、尺寸小常用于列表页快速加载一种是原图分辨率高、体积大用于详情展示。手动操作时最容易保存到的是缩略图。因为网页缩略图链接和原图链接往往只有参数不同不细心的话很难发现。本地解析提取原图的关键就是找到图片链接里 URL 后缀、尺寸参数与缩略图不同的那个版本或者从页面源码里定位包含原图地址的字段。3.3 9:16 精准截图9:16 是目前短视频平台最常见的画面比例手机全屏竖屏就是 9:16。电商素材要发布到短视频平台通常需要把商品图转成 9:16 规格。这里说的“精准截图”不是把图片随便裁剪一下而是保证输出图片宽度与高度严格满足 9:16 比例商品主体在画面内不被裁切多张图批量转换时比例必须一致。常见做法有两种第一种是直接把图片裁剪成 1080x1920 像素第二种是在 9:16 画布上把原图等比缩放居中上下用背景色填充。后者不会损失画面内容更稳妥。文章后面会给出代码实现思路。4. 环境准备与前置条件实操部分需要准备的环境不复杂普通电脑即可。操作系统建议使用 Windows 10/11 或 macOSLinux 也可以但浏览器保存页面的步骤可能有差异以下步骤以 Windows Chrome 为例。需要准备的工具Chrome 或 Edge 浏览器用来打开商品详情页并“另存为”网页。Python 3.8 及以上版本建议 3.10 或 3.11。文本编辑器推荐 VS Code。需要安装的 Python 库beautifulsoup4解析 HTML 的常用库。lxmlBeautifulSoup 的解析引擎比默认的 html.parser 更健壮。Pillow处理图片用于 9:16 截图。playwright可选如果需要用脚本截图而不是手动用浏览器截图可以安装。安装命令如下pip install beautifulsoup4 lxml Pillow pip install playwright如果要使用 Playwright 的截图能力还需要安装浏览器内核python -m playwright install chromium这一步不是必须的。如果不想装 Playwright直接用 Chrome 的开发者工具手动截图也完全可以。版本号这里不写死以你安装时 pip 解析到的最新稳定版为准。5. 核心流程拆解从商品链接到 9:16 素材整个流程可以拆成六个步骤。下面逐步说明每一步做什么、为什么需要、关键点在哪里。5.1 获取商品详情页并保存到本地在浏览器中打开商品链接等页面图片加载完整后按Ctrl SWindows或Command SmacOS保存网页。保存类型选择“网页全部”或“Webpage, Complete”。保存后会生成两个文件一个.html文件这是页面主文件。一个同名文件夹里面存放 CSS、JS、图片等资源。这里的关键点是一定要保存商品详情页本身并且尽量等图片加载完成后再保存。这样后续解析时才能拿到完整的图片链接和商品信息。如果只有商品 ID 没有链接可以拼出详情页链接再访问。拼接规则一般是平台的标准详情页 URL 加上商品 ID具体以你实际看到的浏览器地址栏为准。5.2 确认 HTML 文件的字段用文本编辑器打开保存好的.html文件搜索goods_id、itemId、productId等关键词确认商品 ID 在页面源码中的存放位置。不同版本页面结构不一样有些商品 ID 直接出现在链接里有些出现在 JavaScript 变量里有些出现在 JSON 数据块里。这一步很重要。HTML 结构经常变化直接套网上旧的解析规则很可能失效。先手工确认一次后续批量解析就简单了。5.3 解析商品 ID确认字段位置后用 Python 解析本地 HTML 文件从源码中提取商品 ID。提取方式有两种如果商品 ID 在 URL 或标签属性里用正则表达式或 BeautifulSoup 的find_all方法提取。如果商品 ID 在 JavaScript 变量或 JSON 字符串里用正则匹配该变量后的数字串。商品 ID 通常是纯数字可以用一个正则表达式把连续数字串抓出来再根据所在上下文判断哪个是正确的 ID。更稳妥的做法是先定位包含goods_id等关键词的那一行代码再从那行代码里提取数字。5.4 解析原图链接商品详情页的图片链接通常有固定规律例如缩略图 URL 里带有thumb、width200之类的参数原图 URL 则是干净的图片地址尺寸参数更大或没有参数。解析思路是先用 BeautifulSoup 找到所有img标签取出src、># 文件路径parse_items.py import re import os import glob from bs4 import BeautifulSoup def extract_goods_id(html_path): 从本地 HTML 文件中提取商品 ID。 这里使用关键词定位方式不依赖固定页面结构。 with open(html_path, r, encodingutf-8, errorsignore) as f: content f.read() goods_id None # 方法1匹配 goods_id 这类关键词后面的数字 patterns [ rgoods_id\s*:\s*(\d), rgoods_id\s*:\s*(\d), rgoodsId\s*:\s*(\d), rgoodsId\s*:\s*(\d), ritemId\s*:\s*(\d), ] for pattern in patterns: m re.search(pattern, content) if m: goods_id m.group(1) break # 方法2如果上面没找到搜索 URL 形如 /goods_id. 的片段 if not goods_id: m re.search(r(?:goods_id|goodsId|itemId)[/](\d), content) if m: goods_id m.group(1) return goods_id def extract_image_urls(html_path): 提取本地 HTML 文件中的图片链接。 优先提取>python parse_items.py脚本会遍历pages下所有 HTML 文件提取商品 ID 和图片链接并把图片链接写入result_商品ID.txt。6.2 批量下载原图创建一个download_images.py文件内容如下# 文件路径download_images.py import os import time import urllib.request def download_images(txt_path, output_dir): 从文本文件读取图片链接并下载到本地目录。 每次请求之间加入间隔避免高频请求。 if not os.path.exists(output_dir): os.makedirs(output_dir) with open(txt_path, r, encodingutf-8) as f: urls [line.strip() for line in f if line.strip()] headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } for idx, url in enumerate(urls, start1): try: # 从 URL 推断文件后缀默认 jpg ext os.path.splitext(url.split(?)[0])[1] if ext.lower() not in (.jpg, .jpeg, .png, .webp, .gif): ext .jpg filename f{idx:03d}{ext} filepath os.path.join(output_dir, filename) req urllib.request.Request(url, headersheaders) with urllib.request.urlopen(req, timeout15) as resp: data resp.read() with open(filepath, wb) as f: f.write(data) print(f已下载{filename}来源{url}) except Exception as e: print(f下载失败{url}原因{e}) # 每下载一个文件间隔 1 秒避免请求过快 time.sleep(1) if __name__ __main__: # 示例把 result_商品ID.txt 中的图片下载到 images_商品ID 文件夹 download_images(result_123456789.txt, images_123456789)这个脚本会从result_商品ID.txt中逐行读取图片链接下载到images_商品ID文件夹。使用time.sleep(1)控制下载速度避免短时间内产生大量请求。6.3 9:16 图片转换脚本创建一个convert_to_9x16.py文件内容如下# 文件路径convert_to_9x16.py import os from PIL import Image def convert_to_9x16(input_path, output_path, bg_color(255, 255, 255), target_width1080): 把图片转换为 9:16 竖版。等比缩放后居中放置上下填充背景色。 参数 input_path输入图片路径 output_path输出图片路径 bg_color背景颜色默认白色 target_width目标宽度默认 1080 target_height int(target_width * 16 / 9) # 1080 * 16 / 9 1920 with Image.open(input_path) as img: # 转换成 RGB 模式避免 PNG 透明通道问题 if img.mode ! RGB: img img.convert(RGB) # 按宽度等比缩放同时保证高度不超过目标高度 ratio min(target_width / img.width, target_height / img.height) new_width int(img.width * ratio) new_height int(img.height * ratio) img img.resize((new_width, new_height), Image.LANCZOS) # 创建 9:16 画布 canvas Image.new(RGB, (target_width, target_height), bg_color) # 居中粘贴 offset_x (target_width - new_width) // 2 offset_y (target_height - new_height) // 2 canvas.paste(img, (offset_x, offset_y)) canvas.save(output_path, quality95) print(f已生成{output_path} ({target_width}x{target_height})) def batch_convert(input_dir, output_dir): if not os.path.exists(output_dir): os.makedirs(output_dir) for filename in os.listdir(input_dir): if filename.lower().endswith((.jpg, .jpeg, .png, .webp)): input_path os.path.join(input_dir, filename) output_path os.path.join(output_dir, os.path.splitext(filename)[0] _9x16.jpg) convert_to_9x16(input_path, output_path) if __name__ __main__: batch_convert(images_123456789, images_123456789_9x16)脚本会把images_123456789文件夹下的所有图片转换为 9:16 竖版输出到images_123456789_9x16文件夹。图片采用“等比缩放 白色背景填充 居中”的方式不会裁切画面主体。6.4 可选Playwright 页面截图脚本如果需要保留商品详情页的完整布局可以用 Playwright 打开本地 HTML 文件并按 9:16 截图。创建一个screenshot_page.py文件# 文件路径screenshot_page.py from playwright.sync_api import sync_playwright def screenshot_html(html_path, output_path): 用 Playwright 打开本地 HTML 文件按 9:16 视口截图。 注意只打开本地文件不主动请求远程接口。 with sync_playwright() as p: browser p.chromium.launch() page browser.new_page(viewport{width: 1080, height: 1920}) page.goto(ffile://{html_path}) page.wait_for_load_state(networkidle) page.screenshot(pathoutput_path, full_pageFalse) browser.close() print(f截图完成{output_path}) if __name__ __main__: # 示例对 pages 文件夹下的某个 HTML 截图 screenshot_html(pages/example.html, example_9x16.png)这个脚本适合“需要把商品详情页按手机竖屏比例整体截图”的场景比如截取包含价格、标题、主图的头图区域。7. 运行结果与效果验证脚本怎么算运行成功分几步验证。7.1 验证商品 ID 提取运行parse_items.py后终端会打印每个 HTML 文件对应的商品 ID。你可以打开浏览器在商品详情页的地址栏里确认 ID 是否一致。只要 ID 能和链接对应上说明提取逻辑正确。7.2 验证图片链接脚本会打印图片链接的前 5 条并写入result_商品ID.txt。打开这个文件随便复制一个链接到浏览器地址栏打开如果显示的是高清大图说明提取到的是原图或接近原图。如果打开后发现图片很小、很模糊说明提取到了缩略图需要检查图片 URL 中是否包含尺寸参数并调整过滤逻辑。7.3 验证下载结果运行download_images.py后检查images_商品ID文件夹里的图片数量与result_商品ID.txt中的链接数量是否一致。如果部分图片下载失败看终端输出的原因常见原因是链接过期或网络超时可以根据报错信息单独重试。7.4 验证 9:16 截图运行convert_to_9x16.py后任意打开一张输出图片右键查看属性确认宽高比是 1080x1920。同时把图片放大检查商品主体是否在画面中心有没有明显的畸变或裁切。如果发现图片被拉伸变形说明缩放逻辑有问题通常是ratio计算时同时限制了宽和高不会拉伸。如果出现黑边说明原图比例与 9:16 差异过大等比缩放后留边是正常的。8. 常见问题与排查思路实际操作中最常遇到的问题整理成一张表。问题现象可能原因排查方式解决方案提取不到商品 ID页面结构变化关键词不匹配在 HTML 源码中搜索goods_id、itemId等关键词根据实际源码更新正则表达式提取到的图片是缩略图图片 URL 带有尺寸压缩参数对比浏览器中打开原图时的 URL 与脚本提取的 URL过滤或替换 URL 中的尺寸参数如w200改为更大值HTML 里图片链接不完整浏览器保存时资源未同步完全确认保存时选择“网页全部”等图片加载完成再保存重新保存页面Python 解析报编码错误HTML 文件存在特殊编码检查文件头部的charset声明打开文件时使用errorsignore或指定正确编码下载图片超时网络不稳定或 CDN 限速检查单个图片 URL 是否能直接访问增加超时时间或重试下载输出图片比例不是严格 9:16目标宽度或高度计算错误打印输出图片尺寸确认target_width和target_height的换算关系商品 ID 提取到多个数字正则匹配到了其他数字查看匹配到的上下文增加正则前后缀约束或基于关键词定位后再提取最容易踩的坑有两个第一直接复制网上旧的解析规则。电商平台页面改版很频繁旧规则很可能在一周后就失效。最好的做法是先打开本地 HTML 文件搜索关键词确认字段位置再写提取逻辑。第二误把缩略图当原图。图片链接里通常有wxxx或hxxx这样的参数手动检查一下最稳妥。如果看到400x400这类明显超出实际需要的尺寸那通常就是原图参数如果是100x100就是缩略图。9. 合规边界与最佳实践代码能跑通只是第一步更重要的是知道这套工具可以用在哪里、不可以用在哪里。9.1 明确合规边界本地解析虽然不主动请求服务器但使用者仍然要遵守几条底线只处理自己有权访问的商品详情页不绕过登录权限、不破解接口。用途限于个人学习、自有店铺运营、素材存档、竞品公开信息整理。不在未经授权的情况下批量搬运他人商品图片用于商业发布。不规避平台已有的防爬、防盗链机制。下载图片时控制频率不把 CDN 当作免费图床。这里要特别提醒合规与否不取决于工具形态而是取决于使用目的和数据来源。即使代码里没有写爬虫逻辑如果用来做违规采集和恶意搬运也一样会出问题。9.2 文件命名与目录规范建议提前约定目录结构project/ │ ├── pages/ # 手动保存的 HTML 文件 │ ├── 1688888888.html │ └── 1688888889.html │ ├── result/ # 解析结果 │ ├── result_1688888888.txt │ └── result_1688888889.txt │ ├── images/ # 原始图片 │ ├── 1688888888/ │ └── 1688888889/ │ └── output/ # 9:16 成品图片 ├── 1688888888_9x16/ └── 1688888889_9x16/用商品 ID 作为目录名后续再处理时不容易混淆。如果商品数量多建议把解析结果统一写入一个 CSV 或 Excel 文件便于筛选和排序。9.3 脚本化与自动化如果每周都要处理几十个商品链接可以写一个批处理脚本把“读取链接 → 打开页面 → 保存 HTML → 解析 → 下载 → 转 9:16”串起来。但这里的自动化边界要把握好。手动保存 HTML 和本地解析是稳妥路径如果完全自动化的请求大量商品页面就回到了爬虫的范畴。建议保留“人工保存页面”这一步或者只在业务方明确授权的前提下做自动化。9.4 原图筛选策略的优化提取图片链接后不要盲目下载所有图片。商品详情页里经常包含大量无关图片比如商家头部、底部引导图、点赞图标这些没必要保存。推荐策略只保留img标签中宽度或高度超过 500 像素的图片。过滤掉 SVG 图标、GIF 动图、占位图。优先保留>
上一篇/下一篇内容由系统自动关联
返回资讯列表 →