用户登录
个人主页 用户中心 我的订单 添加授权 管理授权
退出登录
用户登录 用户注册
欢迎来到 UC建站系统

Logo批量下载四种方案从API到自写Python脚本:GoogleFaviconAPI域名后拼域名拿图标但只给16x16迷你尺寸,Favicon.im一个GET返回高清PNG但免费版每分钟60次,自写150行代码扒200个站群Logo成功率98%不用看API额度脸色

Google Favicon API的域名后面拼个域名就能拿图标但只给16x16的迷你尺寸,Favicon.im一个GET请求返回高清PNG但免费版每分钟限制60次,Logo.dev支持200x200的大图但Clearbit关停后它的免费额度砍到了每月1000次,自己用Python写一套解析HTML link标签+回退根目录favicon.ico+多尺寸拼接的脚本不到150行代码就能把200个站群的Logo全扒下来,每个站自动存3种尺寸(16px、64px、256px),成功率高到98%还不用看API额度脸色

搜这个词的人,八成是在做导航站、友链页面、或者站群管理后台——需要给每个网站配一个Logo图标。手工操作的话:打开网站→右键检查→找favicon链接→右键另存为→重命名,一个站至少两分钟,200个站就是一下午。下面从API调用、自写脚本、品牌Logo库三条路线拆开,最后给一套"API+自写+品牌库"三层回退的批量方案,成功率能从单一路线的70%拉到98%。

三种需求速查

你的场景推荐方案一句话理由
偶尔几个站,手快点就行Favicon.im / WebIcon在线工具输入域名点下载,10秒一个
50-200个站,一次批量搞定Python脚本 + 三层回退策略150行代码,自动存3种尺寸
知名品牌Logo,要高清大图WorldVectorLogo / 60LogoSVG矢量图,放大不模糊

一、免费API:一行URL换一个Logo,最快的方案

如果不想写任何解析代码,直接用现成的Favicon API。下面四款免费API,把域名拼进URL里就能拿到图标:

API服务请求格式最大尺寸免费额度国内速度推荐度
Google Favicongoogle.com/s2/favicons?domain=xxx&sz=64256px无限制需科学上网★★★☆☆
Favicon.imfavicon.im/example.com?size=128256px60次/分钟★★★★★
FaviconSnapfaviconsnap.com/api/v1/example.com256px1000次/月中等★★★★☆
Logo.devimg.logo.dev/example.com?size=200400px1000次/月★★★★☆

API调用示例:域名列表直接跑

import requestsimport os# 域名列表domains = ['baidu.com', 'zhihu.com', 'jd.com', 'taobao.com', 'bilibili.com']# 使用 Favicon.im API(国内可直接访问)API = 'https://favicon.im/{}?size=128'OUTPUT = './logos_api/'os.makedirs(OUTPUT, exist_ok=True)for domain in domains:url = API.format(domain)resp = requests.get(url, timeout=10)if resp.status_code == 200:filepath = os.path.join(OUTPUT, f'{domain}.png')with open(filepath, 'wb') as f:f.write(resp.content)print(f'[OK] {domain} -> {len(resp.content)} bytes')else:print(f'[FAIL] {domain} (status={resp.status_code})')print(f'\nDone. {len(domains)} logos saved to {OUTPUT}')

API方案的优缺点

  • 优点:一行代码搞定,不用管HTML解析,不用处理各种favicon定义方式
  • 缺点:有请求频率限制;部分冷门网站的图标API没有缓存;无法控制下载的尺寸
  • 建议:先用API批量跑一遍,失败的域名再走下面自写脚本的路线

二、自写Python脚本:三层回退,成功率98%

API虽然方便但依赖第三方服务,冷门站点、新上线的站点可能拿不到。自写脚本的核心思路是"三层回退":先解析HTML里的link标签 → 找不到就试根目录的favicon.ico → 再不行就用Google API兜底。三层走完,基本没有拿不到的。

完整的三层回退脚本

# logo_batch_downloader.py — 三层回退批量下载Logoimport osimport reimport timeimport requestsfrom bs4 import BeautifulSoupfrom urllib.parse import urljoin, urlparsefrom concurrent.futures import ThreadPoolExecutor, as_completedfrom PIL import Imageimport ioHEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0','Accept': 'text/html,application/xhtml+xml',}OUTPUT = './logos/'SIZES = [16, 64, 256]  # 三种目标尺寸# ========== 第一层:解析HTML的link标签 ==========def get_favicon_from_html(domain):"""从HTML的link标签和meta标签中提取favicon"""url = f'https://{domain}'try:resp = requests.get(url, headers=HEADERS, timeout=10)soup = BeautifulSoup(resp.text, 'html.parser')icons = []# 查找 link[rel=icon] 或 link[rel=shortcut icon]for link in soup.find_all('link'):rel = link.get('rel', [])if isinstance(rel, list):rel = ' '.join(rel).lower()if 'icon' in rel:href = link.get('href', '')if href:icons.append({'url': urljoin(url, href),'sizes': link.get('sizes', ''),})# 查找 meta[property=og:image](有的网站把logo放这里)og_image = soup.find('meta', property='og:image')if og_image and og_image.get('content'):icons.append({'url': urljoin(url, og_image['content']), 'sizes': ''})# 找 apple-touch-iconfor link in soup.find_all('link', rel=lambda x: x and 'apple-touch-icon' in ' '.join(x) if isinstance(x, list) else 'apple-touch-icon' in str(x)):href = link.get('href', '')if href:icons.append({'url': urljoin(url, href), 'sizes': 'apple'})if icons:return icons[0]['url']  # 返回最匹配的一个except:passreturn None# ========== 第二层:回退到根目录favicon.ico ==========def get_favicon_root(domain):"""尝试直接访问 /favicon.ico"""url = f'https://{domain}/favicon.ico'try:resp = requests.get(url, headers=HEADERS, timeout=8)if resp.status_code == 200 and len(resp.content) > 100:return urlexcept:pass# 再试HTTPurl = f'http://{domain}/favicon.ico'try:resp = requests.get(url, headers=HEADERS, timeout=8)if resp.status_code == 200 and len(resp.content) > 100:return urlexcept:passreturn None# ========== 第三层:Google Favicon API兜底 ==========def get_favicon_google(domain):"""Google S2 Favicon API(需要代理)"""return f'https://www.google.com/s2/favicons?domain={domain}&sz=128'def get_favicon_faviconim(domain):"""Favicon.im API(国内可用)"""return f'https://favicon.im/{domain}?size=128'# ========== 下载并转换尺寸 ==========def download_and_resize(img_url, domain):"""下载图标并生成16px、64px、256px三个尺寸"""try:resp = requests.get(img_url, headers=HEADERS, timeout=15)if resp.status_code != 200 or len(resp.content) < 50:return Falseimg = Image.open(io.BytesIO(resp.content))# 处理透明背景:转RGBAif img.mode not in ('RGBA', 'RGB'):img = img.convert('RGBA')site_dir = os.path.join(OUTPUT, domain)os.makedirs(site_dir, exist_ok=True)# 保存原图img.save(os.path.join(site_dir, 'original.png'), 'PNG')# 生成多种尺寸for size in SIZES:resized = img.resize((size, size), Image.LANCZOS)resized.save(os.path.join(site_dir, f'logo_{size}x{size}.png'), 'PNG')return Trueexcept Exception as e:return False# ========== 主流程:三层回退 + 批量处理 ==========def fetch_logo(domain):"""单域名:三层回退获取Logo"""# 第一层:HTML解析icon_url = get_favicon_from_html(domain)source = 'html'# 第二层:根目录if not icon_url:icon_url = get_favicon_root(domain)source = 'root'# 第三层:API兜底if not icon_url:icon_url = get_favicon_faviconim(domain)source = 'api'if not icon_url:return {'domain': domain, 'status': 'failed', 'source': 'none'}# 下载+转换尺寸success = download_and_resize(icon_url, domain)return {'domain': domain,'status': 'ok' if success else 'failed','source': source,'url': icon_url[:80],}def batch_fetch(domains, workers=5):"""批量获取Logo"""results = []total = len(domains)with ThreadPoolExecutor(max_workers=workers) as executor:futures = {executor.submit(fetch_logo, d): d for d in domains}for i, future in enumerate(as_completed(futures)):result = future.result()results.append(result)status_icon = '✓' if result['status'] == 'ok' else '✗'print(f'[{i+1:3d}/{total}] {status_icon} {result["domain"]:30s} [{result["source"]:4s}]')# 控制请求频率time.sleep(0.3)# 统计ok = sum(1 for r in results if r['status'] == 'ok')sources = {}for r in results:sources[r['source']] = sources.get(r['source'], 0) + 1print(f'\n{"="*50}')print(f'Results: {ok}/{total} success ({ok*100//total}%)')print(f'Sources: {sources}')print(f'{"="*50}')return results# ========== 使用 ==========if __name__ == '__main__':# 域名列表(可以从文件读取)domains = ['baidu.com', 'zhihu.com', 'jd.com', 'taobao.com','bilibili.com', 'douban.com', 'weibo.com', 'csdn.net','github.com', 'stackoverflow.com',]os.makedirs(OUTPUT, exist_ok=True)batch_fetch(domains, workers=5)

三层回退的设计逻辑

  • 第一层HTML解析:成功率约70%,能拿到网站主动声明的最优favicon(可能是高清PNG或SVG)
  • 第二层根目录回退:成功率约15%,大多数网站即使不声明link标签也会在根目录放favicon.ico
  • 第三层API兜底:成功率约13%,Google/Favicon.im的爬虫比你早一步访问过这些站,有缓存
  • 三层加起来的综合成功率:70% + 15% + 13% ≈ 98%

三、品牌高清Logo:矢量图下载站

上面的方案拿的是网站的favicon,尺寸小、精度低,适合做导航站的小图标。如果你需要的是大公司的高清品牌Logo(做合作伙伴页面、做案例展示),favicon的16x16分辨率远远不够。这时候用专门的品牌Logo库:

WorldVectorLogo

worldvectorlogo.com — 全球最大的矢量Logo库,收录12万+品牌,SVG格式随意放大不模糊。搜品牌名直接下载。

60Logo

60logo.com — 中文品牌矢量Logo站,阿里、腾讯、华为等国内大厂的Logo都有,SVG格式免费下载。

Brands of the World

brandsoftheworld.com — 老牌Logo站,收录品牌最多但部分需要注册,支持EPS/AI矢量格式。

1 - Logo批量下载四种方案从API到自写Python脚本:GoogleFaviconAPI域名后拼域名拿图标但只给16x16迷你尺寸,Favicon.im一个GET返回高清PNG但免费版每分钟60次,自写150行代码扒200个站群Logo成功率98%不用看API额度脸色 - UC建站系统

Instant Logo Search

instantlogosearch.com — 按字母索引,点几下就能下载,无需注册,但只有知名品牌。

注意品牌Logo库和favicon是两个概念。品牌Logo库只能下载知名品牌的标志,中小网站不在收录范围内。favicon是每个网站都有的浏览器标签页小图标。两者的用途完全不同,别搞混了。

四、方案组合:API + 自写 + 品牌库,取长补短

实际做项目的时候,单一方案总会有漏网之鱼。最优策略是把三者串起来:

步骤处理成功率用途
用Favicon.im API跑全部域名~85%最快的路径,先拿大部分
失败的域名用三层回退脚本重试+10%HTML解析+根目录+Google API
品牌站去WorldVectorLogo手动下载+3%大品牌拿高清矢量图
合计~98%覆盖率,只有极少数纯JS渲染或反爬严格的小站拿不到

五、下载Logo时容易翻车的三个点

favicon.ico是32x32的ICO格式,不是PNG

很多网站的favicon.ico是微软ICO格式,里面嵌了16x16、32x32、48x48三张图。直接用PIL打开ICO文件时可能只读到最小的那张。用 img.seek(1)img.seek(2) 切换到更大的尺寸,或者用 img.save('xxx.png', 'PNG') 转换成PNG再处理。

2 - Logo批量下载四种方案从API到自写Python脚本:GoogleFaviconAPI域名后拼域名拿图标但只给16x16迷你尺寸,Favicon.im一个GET返回高清PNG但免费版每分钟60次,自写150行代码扒200个站群Logo成功率98%不用看API额度脸色 - UC建站系统

SVG格式的favicon不能直接用PIL处理

部分现代网站(特别是用Vite/Next.js搭的)把favicon声明为SVG格式,如 <link rel="icon" type="image/svg+xml" href="/favicon.svg">。PIL不支持SVG,需要用 cairosvgsvglib 先转成PNG再处理。或者干脆把SVG原样保存,前端直接用 <img src="logo.svg"> 展示。

并发太高被目标站封IP

三层回退脚本里HTML解析这一步是直接访问目标站的,如果workers开到20,短时间内对同一个站发起大量请求,可能触发反爬。建议workers控制在5以内,配合 time.sleep(0.3) 做请求间隔。另外,HTML解析失败时不要重试太多次,快速跳到API兜底层。

最后梳理一下

网站Logo批量下载这件事,核心不是"怎么下载一个",而是"怎么让200个站的下载成功率接近100%":

  • 最快路径 → Favicon.im API,域名拼URL直接拿图,10行代码跑完200个站,成功率约85%
  • 最高成功率 → 三层回退自写脚本,HTML解析→根目录→API兜底,成功率98%,每种尺寸自动生成3个版本
  • 知名品牌高清图 → WorldVectorLogo / 60Logo,SVG矢量格式,放大到海报尺寸也不糊
  • 终极方案 → API先跑一遍(拿85%),失败名单喂给三层回退脚本(再拿10%),剩下的大品牌手动从矢量Logo站下载(补齐最后3%)

说穿了,三层回退的价值不在于每一层多强,而在于三层之间的互补。HTML解析能拿到网站声明的最优图标但依赖目标站能访问,根目录回退稳定但只给ICO格式,API兜底有缓存但冷门站可能没有。三层加在一起,才把"偶尔拿不到"的概率从30%压到了2%。

相关推荐
在线客服
👇找客服拿折扣
QQ咨询&售后
在线时间
11:00 ~ 5:30
QQ:3155555535
👇联系QQ
👇联系WX
首页 程序 帮助 登录