怎么用脚本提取图标

wen 实用脚本 2

从零到精通的自动化提取指南(附Python/Shell实战代码)

目录导读

  1. 为什么需要脚本提取图标?(场景与痛点)
  2. 前置准备:图标格式与资源位置解析
  3. 核心方法一:Python + 正则表达式 + 请求库(提取网页favicon与CSS雪碧图)
  4. 核心方法二:Shell脚本批量提取(适用于本地目录与APP资源包)
  5. 进阶技巧:处理SVG、Base64内嵌图标与跨域限制
  6. 常见问题QA(附故障排查清单)
  7. 脚本化提取的三大原则

为什么需要脚本提取图标?

手动下载图标费时且易漏,无论是从网站抓取品牌Logo、从APK/APP安装包抽取应用图标,还是从设计稿(如Figma导出)批量收集素材,脚本都能实现批量、精准、可复用,尤其当图标以CSS背景、Base64字符串或字体文件(iconfont)形式存在时,手工几乎无法处理。

怎么用脚本提取图标

前置准备:图标格式与资源位置解析

  • 常见格式.ico.png.svg.webp,以及字体图标(.woff2 + 对应Unicode映射)。
  • 隐藏位置
    • 网页:<link rel="icon">、CSS background-image、JS动态加载。
    • 本地:Android的mipmap文件夹、iOS的AppIcon.appiconset、Windows的.exe资源段。
  • 识别工具curl + grep 快速定位,或使用浏览器开发者工具“网络”面板筛选图片类型。

核心方法一:Python脚本提取网页图标(含CSS解析)

场景:抓取某网站所有页面使用的图标并保存为本地文件。

脚本逻辑(伪代码 + 关键函数):

import requests
from bs4 import BeautifulSoup
import re, os, base64
def extract_favicon(url):
    html = requests.get(url).text
    soup = BeautifulSoup(html, 'html.parser')
    # 1. 提取<link rel="icon">的href
    icon_link = soup.find('link', rel=re.compile('icon'))
    if icon_link:
        return icon_link.get('href')
    # 2. 解析CSS中的background-image: url('...')
    css_urls = re.findall(r'background-image:\s*url\(["\']?(.*?)["\']?\)', html)
    return css_urls[0] if css_urls else None
# 下载并保存,处理相对路径与Base64
def download_icon(icon_url, base_url, save_path):
    if icon_url.startswith('data:image'):  # 内嵌Base64
        img_data = base64.b64decode(icon_url.split(',')[1])
        with open(save_path, 'wb') as f: f.write(img_data)
    else:
        full_url = urljoin(base_url, icon_url)
        with open(save_path, 'wb') as f: f.write(requests.get(full_url).content)

关键技巧:使用urljoin合并相对路径;对于CSS背景图,需解析<style>或外部.css文件;用re匹配单双引号与无引号三种情况。

核心方法二:Shell脚本批量提取本地图标

场景:从解压后的Android APK目录中提取所有尺寸的启动图标。

脚本示例(Bash):

#!/bin/bash
target_dir="/path/to/apk/res/mipmap-*"
output_dir="./extracted_icons"
mkdir -p "$output_dir"
# 找到所有png文件,排除非图标(如背景图)
find $target_dir -name "ic_launcher*.png" | while read file; do
    # 提取密度文件夹名(如xxhdpi)
    density=$(basename "$(dirname "$file")")
    cp "$file" "$output_dir/icon_${density}.png"
done
echo "提取完成,共 $(ls $output_dir | wc -l) 个图标"

增强版:用file命令检查是否为有效PNG;使用rsynctar归档。

进阶技巧:处理SVG、Base64与跨域

  • SVG提取:优先使用lxml解析XML,保留<svg>标签原始样式,而非转成PNG。
  • Base64内嵌:注意data:image/svg+xml;base64会包含与,用base64.b64decode前需先去除data:前缀。
  • 跨域限制:若目标网站有反爬,设置User-AgentReferer;对于字体图标,需额外下载.woff2文件,并用fonttools库解析映射表(glyph名称 → Unicode码点)才能将图标映射为PNG。

常见问题QA(问答)

Q1:提取的图标不完整,只下载了空白图片? A:可能是CSS语法多变(如url( "..." )带空格),建议用cssutils库解析CSS,而非纯正则;另外检查图片是否用了相对路径,需拼接域名。

Q2:脚本能提取网页中所有小图标(如分享按钮)吗? A:可以,但需定义筛选规则,用BeautifulSoup找出所有<img>width < 50px,或分析CSS类名(如.icon-*),再批量下载。

Q3:有没有Windows下可视化界面? A:可配合tkinter写个GUI,但更推荐用PortiaScrapy框架搭配Splash渲染JS,Windows下若遇权限问题,以管理员运行终端。

Q4:如何处理字体图标(iconfont)? A:下载.woff2后,用fonttoolsTTFont加载,遍历cmap表获取每个Unicode码点对应的字形形状,再用PILcairosvg栅格化为PNG。

脚本化提取的三大原则

  1. 先分析,后编码:用浏览器Network面板确认资源真实URL格式,避免盲目正则。
  2. 容错与重试:增加异常捕获(try...except)和下载重试机制(如requestsRetry适配器)。
  3. 输出结构化:保存为JSON清单(含来源URL、尺寸、格式),方便后续自动化流程调用。

脚本本身是手段,高效复用与稳定产出才是核心,如果目标网站有法律条款限制,请务必遵守robots.txt与版权许可。


(文章结束)

抱歉,评论功能暂时关闭!