python下载icon-icons.com
本帖最后由 xyz349925756 于 2023-3-5 20:55 编辑在做文件夹美化的时候发现一个icons 网站还不错,就试着下载了一些icon图标.如下图所示.
这个网站进去之后找到自己喜欢的点进去复制url.保存到icon.txt 文件夹即可彩色展示图片
我收藏的一些图标url在附件icon.txt文件因官方规则改变更新版:更新内容: 1.添加彩色显示 2.官网图标size 从a标签改为button所以去除部分重复代码.import shutil
import requests
from bs4 import BeautifulSoup
import os
import re
# 格式化top Url,并存储在字典中.
top_url = {}
print('\033[32m>:正在读取文件...\033[0m')
with open('./icon.txt', 'r') as f:
content = f.readlines()
for url in content:
key = url.split('/')[-1].strip()
value = url.strip()
top_url = value
header = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.50'
}
# 存放下一级url到一个大字典中.
print('\033[32m>:正在提取下一级链接地址\033[0m')
for key, value in top_url.items():
"""
提取下一级单个图标的下载地址和名称
k是top_url中的ID 后面分类文件夹使用.
"""
# print(key, value) #3685=key value=https://icon-icons.com/en/pack/Social-Media/3685
r1 = requests.get(url=value, headers=header)
soup1 = BeautifulSoup(r1.text, 'lxml')
div = soup1.find_all(class_='icon-preview')
print(f'\033[32m正在计算: >>>{value}下的图标数量 ... <<<\033[0m')
num = len(div)
next_url = {}
for i in range(num):
s = soup1.find(id=i)
a = 'https://icon-icons.com/' + s.find('a').get('href')
img_name = re.split('/|.png', s.find('img').get('data-original'))[-2]
next_url = (a, key)
"""
上面字典是子链接,这里有规格,
"""
a = 1
floders = list(next_url.keys())
for icon_name in floders:
icon_url = next_url.get(icon_name)
top_floder = next_url.get(icon_name)
icon_id = icon_name.rsplit('_')[-1]
#
r2 = requests.get(url=icon_url, headers=header)
soup2 = BeautifulSoup(r2.text, 'lxml')
div2 = soup2.find(id='png')
size = []
for s in div2.find_all('button'):
if 'size-selector' in s.get('class'):
size.append(s.get('class').rsplit('-'))
# 创建目录,如果存在就跳过,不存在就创建
icon_floder = re.split('_logo|_icon-icons.com', icon_name)
sum_picture = len(size) * 2 + 1
# 判断文件
if os.path.exists(f'images/{top_floder}/{icon_floder}'):
print(f'\033[34m合计: {num} \033[1m ,正在检查: {a} ,剩余:{num - a} \033[0m')
a += 1
files =
if len(files) != sum_picture:
print(f'\033[31m {icon_floder}文件不完整,需要重新下载!\033[0m')
shutil.rmtree(f'images/{top_floder}/{icon_floder}')
floders.append(icon_name)
# print(floders)
continue
else:
print(f'\033[33m {icon_floder} 已经存在 \033[0m')
continue
else:
os.makedirs(f'images/{top_floder}/{icon_floder}')
if (num - a) >= 0:
print(f'\033[34m合计:{num} \033[1m ,正在下载:{a},剩余:{num - a}\033[0m')
a += 1
else:
print('\033[41;30m >>>查缺补漏<<<\033[0m')
print(f'\033[35m 创建 {icon_floder} Floder\033[0m')
for pic in ['svg', 'png', 'ico']:
if pic == 'svg':
pic_url = 'https://icon-icons.com/downloadimage.php?id=' + icon_id + '&root=' + top_floder + '/SVG/&file=' + icon_name + '.svg'
p_res = requests.get(pic_url)
with open(f'./images/{top_floder}/{icon_floder}/{icon_id}.svg', 'wb') as f:
print(f"\033[32m>>>:正在下载\033[1m {icon_id}.svg<下载地址:{pic_url} \033[0m")
for line in p_res.iter_content():
f.write(line)
else:
for s in size:
pic_url = 'https://icon-icons.com/downloadimage.php?id=' + icon_id + '&root=' + top_floder + '/'+ pic.upper()+'/' + s + '/&file=' + icon_name + '.' + pic
p_res = requests.get(pic_url)
with open(f'./images/{top_floder}/{icon_floder}/{icon_name}_{s}.{pic}', 'wb') as f:
print(f"\033[36m>>>:正在下载\033[1m {icon_name}_{s}.{pic}<< 下载地址:{pic_url} \033[0m")
for line in p_res.iter_content():
f.write(line)
print(f'\033[32m {key}:{value} \033[3m下载完成! \033[0m')
print('\033
像这样就是一个大类,下面随便点开一个图像就可以选择规格下载了.
这里面有svg,png,ico,icns 四种图片,icns是app 图片这里就不下载了.
食用:
[*] 需要安装requirements.txt里面的包.
[*]python3 (Python 3.11.2)
[*]使用命令提示符,或者在pycharm中 直接运行即可.vscode 没有测试过,应该也是没问题的.
相关截图:
进入到py文件目录cmd中执行下面的命令,如果遇到网络问题会中断导致有一部分会下载失败.里面加入了查缺补漏方法.
下面就是查缺补漏原理
下载好的图片预览:直接在文件夹的搜索里面输入 : * 规格.ico | png
例子: *256.ico *256.png *.svg
当遇到错误的时候重新执行.既可
错误信息
raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='icon-icons.com', port=443): Max retries exceeded with url: /downloadimage.php?id=208183&root=3284/PNG/256/&file=shop_ecommerce_shopping_cart_icon_208183.png (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:992)')))
重新执行就可以了.这些网址的图标大概有4.9万个左右可以选择自己喜欢的.不喜欢的就删除.
如果想要512,128规格的可以直接在代码中添加需要的规格,注意有些图标最大只有128px 的.
png_s = [] 512,256,128,96,72,64,48,32任选其一或多个,
ico_s = []
上面如果手动指定了规格注释下面这段代码既可以.程序速度又会加快很多倍.
for p in ['png', 'ico']:# 防止出现png ico 规格不一样的情况.
div = soup2.find(id=p)
for i in div.find_all('a'):
s = i.get('class').rsplit('-')
if p == 'png':
png_s.append(s)
else:
ico_s.append(s)
看看这个不完整是怎么判断的 本帖最后由 xyz349925756 于 2023-3-4 12:14 编辑
dleo 发表于 2023-3-4 11:47
看看这个不完整是怎么判断的
sum_picture = len(png_s) + len(ico_s) + 1
# 判断文件
if os.path.exists(f'images/{top_floder}/{icon_floder}'):
files =
if len(files) != sum_picture:
print(f'{icon_floder} 文件不完整,需要重新下载!')
shutil.rmtree(f'images/{top_floder}/{icon_floder}')
floders.append(icon_name)
# print(floders)
continue
else:
print(f'{icon_floder} 已经存在')
continue
else:
os.makedirs(f'images/{top_floder}/{icon_floder}')
print(f'创建 {icon_floder} Floder')
这里是根据提取到的png ico svg 规格数量之和 与 当前文件数量对比,如果不对直接删除该文件夹,之后加入查缺补漏阶段. 原来是这样,用数量判断的,因为有可能一个图标文件只下载了一部分发生了中断,可能文件是不完整的,恰巧又是最后一个文件,不过这种情况比较极端一点吧
dleo 发表于 2023-3-4 12:38
原来是这样,用数量判断的,因为有可能一个图标文件只下载了一部分发生了中断,可能文件是不完整的,恰巧又是最 ...
是的我已经考虑到这点了.所以上面png 和 ico 的列表是分开的. 写的不错。学习了。 由于官网标签变动.上面代码已经更新.
页:
[1]