xyz349925756 发表于 2023-3-4 10:32

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)

dleo 发表于 2023-3-4 11:47

看看这个不完整是怎么判断的

xyz349925756 发表于 2023-3-4 12:11

本帖最后由 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

原来是这样,用数量判断的,因为有可能一个图标文件只下载了一部分发生了中断,可能文件是不完整的,恰巧又是最后一个文件,不过这种情况比较极端一点吧

xyz349925756 发表于 2023-3-4 12:43

dleo 发表于 2023-3-4 12:38
原来是这样,用数量判断的,因为有可能一个图标文件只下载了一部分发生了中断,可能文件是不完整的,恰巧又是最 ...

是的我已经考虑到这点了.所以上面png 和 ico 的列表是分开的.

lengkeyu 发表于 2023-3-4 20:21

写的不错。学习了。

xyz349925756 发表于 2023-3-5 20:54

由于官网标签变动.上面代码已经更新.
页: [1]
查看完整版本: python下载icon-icons.com