☰
不写爬虫也能批量提取商品ID和图片:本地HTML解析与9:16截图实战
2026/10/11 18:53:20 网站建设 项目流程

拼多多的商品链接和素材整理,做过的同学应该都有体会:手动打开一个页面、复制商品 ID、另存主图、再裁一张竖版封面,单个商品还好,一旦数量到几十上百,整个人都会麻。更麻烦的是,很多人第一反应是直接写 Python 爬虫去批量抓取,结果要么被平台风控拦下来,要么把网络请求频率拉满,协议和合规上都容易踩坑。

这篇文章我打算换一个更稳妥的思路:用“本地解析”代替“远程爬取”。具体来说,就是把商品页面通过浏览器正常访问并“另存为”到本地,再用 Python 脚本从本地 HTML 文件里批量提取商品 ID、图片地址,最后用 Pillow 或 Playwright 生成 9:16 精准截图。整个过程对目标服务器零压力,脚本只读本地文件,不主动发起大量请求,适合做选品素材整理、商品信息归档、内容创作配图等场景。

这套流程不需要你从零写复杂框架,只需要会基础的 Python 文件操作,跟着实操一步步就能跑通。下面我从概念边界、环境准备、核心代码到常见报错排查,完整拆解一遍。

1. 网页解析与爬虫的区别

1.1 为什么“本地解析”不等于“爬虫”

很多同学一听“批量提取商品 ID、批量提取图片”,下意识就认为这是爬虫。其实从技术实现和请求行为上看,二者有明显的区别。

典型的爬虫工作方式是:程序主动模拟浏览器向服务器发起 HTTP 请求,循环访问商品列表页、详情页或接口,然后从响应内容中提取数据。这个过程只要写好循环,确实可以短时间内拿到大量数据,但问题也很现实:高频请求会给对方服务器造成压力,也可能违反平台的服务条款,更别说遇到签名校验、字体反爬、IP 限制时,维护成本会直线上升。

而本文说的“本地解析”,核心特征是“先有本地文件,再解析本地文件”。操作步骤是:

  1. 在浏览器中正常打开商品页面。
  2. 页面内容完整加载后,使用浏览器的“另存为”功能保存到本地。
  3. 用 Python 脚本读取本地 HTML 文件,从 HTML 结构中提取商品 ID、标题、图片地址等信息。

脚本不主动请求目标站点,解析的只是用户自己访问过的页面副本。本质上,这个操作和用编辑器打开一份网页源码、用 Ctrl+F 查找字符没有区别,只是把查找动作自动化了。对平台方来说,除了用户正常访问那一次之外,没有额外的流量压力。

1.2 这套方案能做什么

把思路定成“本地解析”之后,整个工具链条就非常清晰了:

功能说明
批量提取商品 ID从多个本地 HTML 文件中自动识别商品 ID,并输出到表格
批量提取原图地址从页面源码的图片标签中提取 URL,并尝试还原高清原图链接
9:16 精准截图对本地商品图做 9:16 中心裁剪,或用浏览器内核按 9:16 视口截图
数据落盘商品 ID、标题、描述、图片地址统一输出为 CSV/Excel

适合的场景包括:

  • 做商品选品记录时,把收藏的爆款链接结构化整理成表格。
  • 做内容创作时,批量准备 9:16 竖版封面图。
  • 做商品素材归档时,把图片地址和商品 ID 一一对应保存。
  • 学习前端页面结构与数据提取时,在一个完全可控的本地环境里练习解析思路。

1.3 工具的边界与原则

这里要提前说清楚几条底线,避免后续操作跑偏:

  • 只处理自己有权限访问、合法获取的页面内容。
  • 保存页面和解析仅用于个人学习、自有素材整理、选品参考等合法用途。
  • 如果后续确实需要下载图片,建议手动或低频处理,并遵守目标平台的服务条款,不要批量高频请求。
  • 不尝试绕过平台限制、不破解验证码、不攻击接口。

明确边界之后,再进入技术实操部分。

2. 环境准备与项目结构

2.1 运行环境说明

本文示例以 Python 3.8+ 为基础,建议使用虚拟环境隔离依赖。操作系统上,Windows、macOS、Linux 都可以,代码没有依赖特定系统命令。版本不需要完全一致,重点是保证以下核心库能正常导入:

依赖库用途
beautifulsoup4解析 HTML 结构,提取标签属性
lxmlBeautifulSoup 的解析引擎,速度快
pandas数据清洗并输出 CSV/Excel
Pillow对图片做 9:16 裁剪处理
playwright使用 Chromium 内核按 9:16 视口截图

需要注意,playwright 负责驱动浏览器,首次使用还需要安装浏览器内核。如果只想做纯图片裁剪,Pillow 就够用,playwright 可以按需安装。

创建虚拟环境并安装依赖:

mkdir duoduo_parser cd duoduo_parser python -m venv venv # Windows venv\Scripts\activate # macOS / Linux source venv/bin/activate pip install beautifulsoup4 lxml pandas Pillow playwright

如果使用 Playwright 截图方案,还需要额外安装 Chromium:

playwright install chromium

2.2 项目目录结构

我建议把页面文件、脚本、输出目录分开管理,避免后面文件一多就乱。

duoduo_parser/ ├── pages/ │ ├── 商品A.html │ ├── 商品A_files/ │ ├── 商品B.html │ └── 商品B_files/ ├── output/ │ ├── goods_info.csv │ ├── goods_images.csv │ ├── images/ │ └── screenshots/ ├── parse_goods.py ├── extract_images.py └── make_screenshot.py

其中pages目录存放浏览器“另存为”得到的 HTML 文件和同名资源目录;output目录存放脚本生成的 CSV、裁剪图、截图;三个 Python 脚本分别负责“解析商品信息”“提取图片地址”“生成 9:16 截图”。

2.3 页面保存操作建议

在浏览器中打开商品页面后,不要立刻另存为。因为很多页面采用懒加载,图片和部分信息要滚动到可视区域才会加载出来。比较稳妥的做法是:

  1. 打开商品页后,按 F12 打开开发者工具,切换到 Network 面板并勾选 Disable cache。
  2. 从页面顶部慢慢向下滚动,确保商品图、详情图、相似推荐等区域都触发加载。
  3. 点击浏览器右上角菜单,选择“另存为”,保存类型选择“网页,全部”。
  4. 保存后会生成一个 HTML 文件和同名的资源文件夹。

这样保存下来的 HTML 内容更完整,后续解析时漏数据的概率会小很多。

3. 核心原理拆解:从本地 HTML 中找商品 ID

3.1 页面数据藏在哪里

一个商品页面的 HTML 里,商品 ID 可能出现在多个位置。常见的包括:

  • 浏览器地址栏 URL 参数,例如goods_id=12345678901234567。
  • 页面源码里的 JS 变量,例如window.__goods_id = "12345678901234567"。
  • 某些节点属性的标识,例如按钮、收藏按钮、加入购物车按钮上的># -*- coding: utf-8 -*- import re with open("pages/商品A.html", "r", encoding="utf-8", errors="ignore") as f: html = f.read() # 搜索常见的 ID 字段关键词 for keyword in ["goods_id", "goodsId", "goods_id_str", "goodsID"]: matches = re.findall(rf"{keyword}[\"']?\s*[:=]\s*[\"']?(\d{{8,20}})", html) if matches: print(keyword, matches[:5])

    这段代码会帮你快速定位页面中出现了哪些 ID 字段,以及 ID 的格式。确认之后,再针对性地写批量解析规则。

    3.2 正则提取 vs DOM 提取

    提取商品 ID 主要有两种方式:

    第一种是正则表达式,适合匹配带明显规律的字符串。例如商品 ID 是连续的数字,且前面带有固定字段名,正则写起来很直接。优点是不依赖 HTML 结构,缺点是如果页面里的无关内容也出现类似数字,容易误匹配。

    第二种是 BeautifulSoup 解析 DOM,适合目标信息位于某个标签的># -*- coding: utf-8 -*- # 文件路径:parse_goods.py import re import glob import pandas as pd from bs4 import BeautifulSoup TARGET_DIR = "pages" OUTPUT_CSV = "output/goods_info.csv" # 收集常见的商品 ID 写法,按优先级顺序匹配 ID_PATTERNS = [ re.compile(r"goods_id[=:]\"?(\d{8,20})\"?"), re.compile(r"goodsId[=:]\"?(\d{8,20})\"?"), re.compile(r"goods_id_str[\"']?\s*[:=]\s*[\"'](\d{8,20})[\"']"), re.compile(r"data-goods-id[\"']?\s*=\s*[\"'](\d{8,20})[\"']"), ] def extract_goods_info(html_path): with open(html_path, "r", encoding="utf-8", errors="ignore") as f: html = f.read() result = {"file": html_path} # 提取标题 title_tag = re.search(r"<title[^>]*>(.*?)</title>", html, re.S) result["title"] = title_tag.group(1).strip() if title_tag else "" # 提取商品 ID goods_id = "" for pattern in ID_PATTERNS: m = pattern.search(html) if m: goods_id = m.group(1) break result["goods_id"] = goods_id # 提取 meta 描述 soup = BeautifulSoup(html, "lxml") meta = soup.find("meta", attrs={"name": "description"}) result["description"] = meta.get("content", "") if meta else "" return result def main(): rows = [] for html_path in glob.glob(f"{TARGET_DIR}/*.html"): rows.append(extract_goods_info(html_path)) if not rows: print(f"在 {TARGET_DIR} 目录下没有找到 HTML 文件") return df = pd.DataFrame(rows) df.to_csv(OUTPUT_CSV, index=False, encoding="utf-8-sig") print(df) if __name__ == "__main__": main()

    运行方式:

    python parse_goods.py

    预期输出是控制台打印一个表格,同时在output/goods_info.csv生成 UTF-8 编码的 CSV 文件。这里用utf-8-sig编码,是为了让 Excel 直接打开时中文不乱码。

    需要注意,ID_PATTERNS里的规则只是通用思路,具体页面中可能字段名完全不同。如果你的页面里商品 ID 出现在 URL 参数中,可以单独把 URL 存下来,再用urlparse解析参数,思路是一样的。

    4. 批量提取商品 ID 与数据落盘

    4.1 从文件名到数据的映射

    在批量场景中,往往需要把“某个页面”和“某个商品 ID”对应起来。最简单的方式是在解析结果中额外保存文件名,但更好的做法是直接把商品 ID 作为后续处理的主键。商品 ID 稳定、唯一,便于和图片记录、截图记录做关联。

    运行上面的parse_goods.py之后,output/goods_info.csv里已经包含了商品 ID。接下来做数据清洗时,需要注意几个细节:

    • 如果页面是动态渲染的文章详情页,<title>可能带有网站后缀,比如“商品标题_平台名称”,需要统一去掉。
    • 有些页面会在 URL 参数里带goods_id,在 JS 变量里带另一套goodsId,两者可能一致,也可能一个是推广 ID,一个才是真实商品 ID。建议以更完整的 JSON 变量或页面内部字段为准。
    • description 为空时,不用强行补数据,保留空字符串即可。

    4.2 清洗和扩展字段

    我们可以把解析脚本稍微扩展一下,增加一个清洗函数。

    def clean_title(title, suffix_list=None): if not title: return "" suffix_list = suffix_list or ["_拼多多", "-拼多多", "_手机版", "_移动端"] for suffix in suffix_list: if title.endswith(suffix): title = title[: -len(suffix)] return title.strip()

    实际使用中,你只需要把自己页面里出现的后缀加进列表即可。这里想表达的核心思想是:解析脚本是一个“提取器”,而清洗逻辑是一个独立的“过滤器”,两者分开写,后续页面结构变化时维护成本更低。

    4.3 避免重复解析

    如果pages目录下已经解析过一次,再次运行会产生重复记录。一种简单策略是记录已处理文件的mtime,或者直接让脚本生成一个有去重逻辑的结果表。为了不过度设计,这里用 pandas 在读取已有 CSV 后做一次drop_duplicates:

    def merge_output(new_df, csv_path): try: old_df = pd.read_csv(csv_path, dtype={"goods_id": str}) merged = pd.concat([old_df, new_df], ignore_index=True) merged = merged.drop_duplicates(subset=["goods_id"]) except FileNotFoundError: merged = new_df merged.to_csv(csv_path, index=False, encoding="utf-8-sig")

    这样即使重复运行脚本,也不会堆积重复的商品记录。

    5. 批量提取原图

    5.1 图片 URL 与缩略图参数

    商品图片的 URL 一般保存在<img>标签的src属性中。不过很多平台为了加速展示,会优先使用压缩过的缩略图地址。缩略图 URL 和原图 URL 之间通常只差几个尺寸参数,常见规律有:

    缩略图 URL 示例特征
    https://example.com/img/abc.jpg!400x400.jpgURL 尾部带!宽度x高度
    https://example.com/img/abc_400x400.jpg文件名后插入_400x400
    https://example.com/img/abc-300x300.jpg文件名后插入-300x300
    https://example.com/img/abc.jpg?imageMogr2/thumbnail/!300x300用查询参数控制尺寸

    不同平台的规则不同,甚至同一平台不同批次的图片 URL 也不完全一致。所以正确的做法是:先保存一两个页面,把图片 URL 粘贴出来对比,找出其中的规律,再写还原函数。

    5.2 图片地址提取与还原

    下面这个脚本会从本地 HTML 中提取图片地址,并尝试去掉常见的缩略图参数,还原成高清原图链接。

    # -*- coding: utf-8 -*- # 文件路径:extract_images.py import re import glob import os import pandas as pd from bs4 import BeautifulSoup from parse_goods import extract_goods_info TARGET_DIR = "pages" OUTPUT_CSV = "output/goods_images.csv" # 根据自己保存页面的实际情况调整 NORMALIZE_RULES = [ (r"!(\d+)x(\d+)(\.(jpg|jpeg|png|webp))$", r"\3"), (r"_(\d+)x(\d+)(\.(jpg|jpeg|png|webp))$", r"\3"), (r"-(\d+)x(\d+)(\.(jpg|jpeg|png|webp))$", r"\3"), ] def normalize_big_image(url): for pattern, repl in NORMALIZE_RULES: url = re.sub(pattern, repl, url) return url def extract_image_urls(html_path): with open(html_path, "r", encoding="utf-8", errors="ignore") as f: html = f.read() soup = BeautifulSoup(html, "lxml") urls = set() for img in soup.find_all("img"): src = img.get("src") or img.get("data-src") or "" if src: urls.add(src) for tag in soup.find_all(attrs={"background": True}): bg = tag.get("background") if bg: urls.add(bg) return [normalize_big_image(u) for u in urls] def main(): rows = [] for html_path in glob.glob(f"{TARGET_DIR}/*.html"): info = extract_goods_info(html_path) goods_id = info.get("goods_id") for url in extract_image_urls(html_path): rows.append({"goods_id": goods_id, "image_url": url}) if not rows: print("没有提取到图片地址") return df = pd.DataFrame(rows) df.to_csv(OUTPUT_CSV, index=False, encoding="utf-8-sig") print(f"共提取 {len(df)} 张图片地址,已保存到 {OUTPUT_CSV}") if __name__ == "__main__": main()

    运行:

    python extract_images.py

    生成的结果里,每一行代表一个商品的一张图片地址,并通过goods_id与商品信息表关联。这里要注意去重时使用了set(),同一个页面中重复出现的图片地址不会计入多次。

    5.3 懒加载属性补充

    很多商品详情页会使用懒加载图片,src属性可能是空白占位图,真正的图片地址放在>for img in soup.find_all("img"): src = (img.get("data-src") or img.get("data-original") or img.get("data-lazy-src") or img.get("src")) if src: urls.add(src)

    哪个属性里存了真实图片,以你保存的 HTML 实际结构为准,上面列的是最常碰到的几个属性名。

    6. 9:16 精准截图实战

    6.1 什么是 9:16 精准截图

    9:16 是竖版比例,宽高比约等于 0.5625,常见于手机端主图、短视频封面、图文笔记配图。所谓“精准截图”,是指最终输出的图片严格满足这个比例,而不是随手把浏览器窗口拉一下直接截图。

    实现方式有两条路:

    1. 如果已经有商品图,使用 Pillow 对图片做中心裁剪,得到严格 9:16 比例的图片。
    2. 如果需要对本地 HTML 页面进行视口截图,使用 Playwright 设置 540x960 或 1080x1920 的浏览器视口,截取视口内容。

    下面分别给出完整代码。

    6.2 Pillow 中心裁剪方案

    中心裁剪的思路是:先判断原图比例与目标比例的关系,再决定以宽度还是高度为基准来裁。如果原图偏宽,就以高度为基准,裁掉左右两边多余的宽度;如果原图偏高,就以宽度为基准,裁掉上下两边多余的高度。

    # -*- coding: utf-8 -*- # 文件路径:make_screenshot.py import os from PIL import Image INPUT_DIR = "output/images" OUTPUT_DIR = "output/screenshots" TARGET_RATIO = 9 / 16 # 0.5625 def crop_to_9_16(image_path, output_path): img = Image.open(image_path) w, h = img.size current_ratio = w / h if current_ratio > TARGET_RATIO: # 图片偏宽,按高度裁剪宽度 new_w = int(h * TARGET_RATIO) left = (w - new_w) // 2 box = (left, 0, left + new_w, h) elif current_ratio < TARGET_RATIO: # 图片偏高,按宽度裁剪高度 new_h = int(w / TARGET_RATIO) top = (h - new_h) // 2 box = (0, top, w, top + new_h) else: box = (0, 0, w, h) cropped = img.crop(box) cropped.save(output_path, quality=95) print(f"已生成: {output_path} 尺寸: {cropped.size}") def main(): if not os.path.exists(INPUT_DIR): print(f"目录不存在: {INPUT_DIR}") return os.makedirs(OUTPUT_DIR, exist_ok=True) for name in os.listdir(INPUT_DIR): if name.lower().endswith((".jpg", ".jpeg", ".png", ".webp")): src = os.path.join(INPUT_DIR, name) base = os.path.splitext(name)[0] dst = os.path.join(OUTPUT_DIR, base + "_9x16.jpg") try: crop_to_9_16(src, dst) except Exception as e: print(f"处理失败: {src}, 错误: {e}") if __name__ == "__main__": main()

    这段代码会把output/images下的所有图片逐一处理,生成output/screenshots下的 9:16 版本。需要注意几点:

    • Pillow 对 WebP 的支持取决于安装时的构建选项,如果提示不能打开 WebP 图片,可以先转成 PNG 再处理。
    • 中心裁剪会损失边缘内容。如果商品主体不在中心,建议裁剪前先用看图工具确认构图。
    • 如果希望“保留完整图片 + 背景填充”而不是裁剪,可以改成ImageOps.pad,将多余部分用白色或模糊背景填充。

    6.3 Playwright 视口截图方案

    如果你需要把本地 HTML 页面整体截成 9:16 的图,可以用 Playwright 启动 Chromium 浏览器,把视口设置为 540x960,然后加载本地 HTML 文件并截图。

    # -*- coding: utf-8 -*- # 文件路径:make_screenshot_browser.py import asyncio import glob import os from pathlib import Path from playwright.async_api import async_playwright TARGET_DIR = "pages" OUTPUT_DIR = "output/screenshots" VIEWPORT_WIDTH = 540 VIEWPORT_HEIGHT = 960 async def screenshot_html(html_path, output_path): async with async_playwright() as p: browser = await p.chromium.launch() page = await browser.new_page( viewport={"width": VIEWPORT_WIDTH, "height": VIEWPORT_HEIGHT} ) url = Path(html_path).resolve().as_uri() await page.goto(url, wait_until="networkidle") await page.wait_for_timeout(1000) await page.screenshot(path=output_path, full_page=False) await browser.close() print(f"已生成: {output_path}") async def main(): os.makedirs(OUTPUT_DIR, exist_ok=True) html_files = glob.glob(f"{TARGET_DIR}/*.html") if not html_files: print(f"在 {TARGET_DIR} 目录下没有找到 HTML 文件") return for html_path in html_files: base = os.path.splitext(os.path.basename(html_path))[0] out = os.path.join(OUTPUT_DIR, base + "_9x16.png") await screenshot_html(html_path, out) if __name__ == "__main__": asyncio.run(main())

    这里关键点是full_page=False。Playwright 截图的默认行为是截取当前视口区域,配合 9:16 的 viewport,得到的就是严格 9:16 的页面截图。如果设置full_page=True,会截取整个可滚动页面的高度,比例就不再是 9:16。

    运行前先确认 Chromium 已安装:

    playwright install chromium

    然后执行:

    python make_screenshot_browser.py

    如果页面加载很慢,可以把wait_until改为"load",并把wait_for_timeout调大一些。如果页面有懒加载内容,也可以在截图前用page.mouse.wheel模拟滚动。

    6.4 两种方案如何选择

    场景推荐方案
    已有商品图片,想快速生成统一比例的封面图Pillow 中心裁剪
    想保留页面原始排版,按手机屏幕尺寸截图Playwright 视口截图
    需要批量处理几百张本地图片Pillow 更快,不需要浏览器
    需要模拟移动端浏览效果Playwright,可额外设置user_agent和device_scale_factor

    如果你的目标是把截图做成一个个正方形或 9:16 封面,Pillow 方案更轻量;如果你的目标是还原真实浏览器的展示效果,Playwright 方案更贴近。

    7. 常见问题与排查思路

    7.1 解析结果为空

    可能原因很多,最常见的是保存的 HTML 不完整,动态内容没有加载出来。排查时可以先用文本编辑器打开 HTML 文件,按 Ctrl+F 搜索你期望出现的关键词,比如goods_id。如果在源码里都搜不到,说明你要的数据不在静态 HTML 中,需要回到浏览器中把页面滚动到对应位置后再重新另存为。

    如果 HTML 源码里确实有数据,但脚本仍然提取为空,可能是字段名不同,比如页面里用的是itemId而不是goodsId。解决办法是把正则规则补充完整,或者先跑一遍关键词搜索脚本,确认实际字段名。

    问题现象常见原因解决思路
    goods_id 为空保存时页面未加载完整滚动加载后重新另存为
    goods_id 为空字段名与正则不匹配用搜索脚本确认页面实际字段名
    图片地址全是占位图src 是懒加载占位地址读取>img = Image.open(src) print(img.format, img.size)

    如果确实是 WebP 但 Pillow 无法识别,可以尝试先安装pillow最新版,或者用ffmpeg把 WebP 批量转成 PNG 再做裁剪。还有一类问题是大图内存占用高,裁剪前可以考虑先img.thumbnail((2000, 4000))缩小处理范围。

    7.4 Playwright 截图白屏

    白屏常见原因有三个:

    1. 本地 HTML 引用的 CSS、JS 是绝对路径或 CDN 地址,离线加载时部分样式丢失。
    2. wait_until="networkidle"等待时间过长或过早,页面还没有渲染完成。
    3. 页面在启动时检测到非正常环境,跳出阻断逻辑。

    解决思路是打印更多运行时信息,先确认页面是否正常打开:

    title = await page.title() content = await page.content() print(title, len(content))

    如果页面整体空白,可以增加page.wait_for_selector("img, .content, body")等待关键元素出现。对于引用 CDN 的页面,如果只是想截内容区域,可以只截图中部区域,不要求完整样式。

    8. 最佳实践与合规建议

    8.1 工程化组织脚本

    三个脚本如果直接在命令行里单独执行,也能完成工作。但为了让流程更顺,建议把公共函数抽成一个common.py,比如extract_goods_info、normalize_big_image都放进去,各脚本统一 import。以后页面结构变化,只需要改一个地方。

    脚本文件命名尽量按照职责划分:parse_goods.py只做商品信息解析,extract_images.py只做图片地址提取,make_screenshot.py只做截图。这样即使项目变大,也不会出现一个文件里堆了所有逻辑的情况。

    8.2 数据管理经验

    输出到 CSV 时,建议统一用dtype={"goods_id": str}读回,避免长数字被 Excel 当成科学计数法。CSV 文件用utf-8-sig编码保存,兼容 Excel。如果数据量继续变大,再考虑迁移到 SQLite:

    import sqlite3 conn = sqlite3.connect("goods.db") df.to_sql("goods_info", conn, if_exists="replace", index=False) conn.close()

    SQLite 单文件、免安装,适合本地小工具存储结构化结果。

    8.3 合规红线再强调

    本地解析只是个数据处理方式,真正需要注意的反而是后续动作:

    • 不要把解析出的数据用于商业用途,除非你获得了明确的授权。
    • 不要批量下载原图到本地重新发布,版权归属需要尊重。
    • 不要编写自动遍历商品 ID 的脚本去“扫”全站商品。
    • 不要绕过平台的接口签名、验证码等机制。
    • 如果只是个人选品、学习前端解析、管理自己的素材,这套本地方案是稳妥且够用的。

    8.4 扩展方向

    懂一点前端开发的同学,可以把这套流程做成一个带界面的小工具:用 Flask 或 FastAPI 做本地 Web 服务,上传 HTML 文件后自动解析,前端展示商品 ID、图片列表和 9:16 预览图。后续还能加“批量导出压缩包”“复制 Markdown 格式商品文档”之类的功能,本质上都是在本文这套解析和截图逻辑之上做封装。

    把上面三个脚本串成一个总的main.py入口,整个“多多爆款网页解析工具”的闭环就基本成型了。临时处理几十个商品,手动执行三个脚本完全够用;如果处理量更大,再考虑加界面、加数据库、加自动化流程。这里最有价值的不是某一个脚本,而是“本地保存页面 + 离线解析 + 批量出图”这套思路——它让你在不需要高频请求目标服务器的情况下,也能完成大量素材整理工作,合规压力小,维护起来也轻松。

    需要专业的网站建设服务?

    联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

    立即咨询