吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1160|回复: 6
收起左侧

[学习记录] python下载icon-icons.com

[复制链接]
xyz349925756 发表于 2023-3-4 10:32
本帖最后由 xyz349925756 于 2023-3-5 20:55 编辑

在做文件夹美化的时候发现一个icons 网站还不错,就试着下载了一些icon图标.如下图所示.

这个网站进去之后找到自己喜欢的点进去复制url.保存到icon.txt 文件夹即可
image-20230228165619889.png
彩色展示图片
image.png
我收藏的一些图标url在附件icon.txt文件
因官方规则改变更新版:
更新内容:
       1.添加彩色显示
            2.官网图标size 从a标签改为button所以去除部分重复代码.
[Python] 纯文本查看 复制代码
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[key] = 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[img_name] = (a, key)

    """
    上面字典是子链接,这里有规格,
    """
    a = 1
    floders = list(next_url.keys())
    for icon_name in floders:
        icon_url = next_url.get(icon_name)[0]
        top_floder = next_url.get(icon_name)[1]
        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')[0].rsplit('-')[1])

        # 创建目录,如果存在就跳过,不存在就创建
        icon_floder = re.split('_logo|_icon-icons.com', icon_name)[0]
        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 = [f for f in os.listdir(f'images/{top_floder}/{icon_floder}') if not f.startswith('.')]
            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[36m', '分割线'.center(100, '-'), '\033[0m')



像这样就是一个大类,下面随便点开一个图像就可以选择规格下载了.

image-20230228165735099.png
这里面有svg,png,ico,icns 四种图片,icns是app 图片这里就不下载了.




食用:
  • 需要安装requirements.txt里面的包.
  • python3 (Python 3.11.2)
  • 使用命令提示符,或者在pycharm中 直接运行即可.vscode 没有测试过,应该也是没问题的.

      
相关截图:
image.png
进入到py文件目录cmd中执行下面的命令,如果遇到网络问题会中断导致有一部分会下载失败.里面加入了查缺补漏方法.
image-20230304084409785.png
image-20230304005617838.png
下面就是查缺补漏原理
image-20230304004433741.png

image-20230304004549421.png

下载好的图片预览:直接在文件夹的搜索里面输入   :   * 规格.ico | png
例子:   *256.ico     *256.png    *.svg
image.png
image.png

当遇到错误的时候重新执行.既可
错误信息
[PowerShell] 纯文本查看 复制代码
 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)')))


image.png
重新执行就可以了.这些网址的图标大概有4.9万个左右可以选择自己喜欢的.不喜欢的就删除.
如果想要512,128规格的可以直接在代码中添加需要的规格,注意有些图标最大只有128px 的.
[Python] 纯文本查看 复制代码
 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')[0].rsplit('-')[1]
         if p == 'png':
             png_s.append(s)
         else:
             ico_s.append(s)


icon.txt

5.42 KB, 下载次数: 18, 下载积分: 吾爱币 -1 CB

requirements.txt

253 Bytes, 下载次数: 7, 下载积分: 吾爱币 -1 CB

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

dleo 发表于 2023-3-4 11:47
看看这个不完整是怎么判断的
 楼主| xyz349925756 发表于 2023-3-4 12:11
本帖最后由 xyz349925756 于 2023-3-4 12:14 编辑
dleo 发表于 2023-3-4 11:47
看看这个不完整是怎么判断的

[Python] 纯文本查看 复制代码
sum_picture = len(png_s) + len(ico_s) + 1
        # 判断文件
        if os.path.exists(f'images/{top_floder}/{icon_floder}'):
            files = [f for f in os.listdir(f'images/{top_floder}/{icon_floder}') if not f.startswith('.')]
            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
由于官网标签变动.上面代码已经更新.
Snipaste_2023-03-05_20-51-51.png
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 23:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表