使用python爬取图片API

Python是什么

Python是一种高级编程语言,因其简洁易读的语法和强大的功能而广受欢迎。它由Guido van Rossum于1991年首次发布,现已成为各种应用程序开发的主流语言之一。

Python的主要特点:

  1. 易于学习和使用:Python的语法清晰,适合初学者。

  2. 跨平台:可以在多种操作系统上运行,包括Windows、macOS和Linux。

  3. 丰富的库和框架:Python有大量的第三方库和框架,支持数据科学、机器学习、Web开发、自动化等多种应用。

  4. 动态类型:变量不需要事先声明类型,灵活性高。

  5. 支持多种编程范式:包括面向对象编程、函数式编程和命令式编程。

常见应用领域:

  • Web开发:使用框架如Django和Flask。

  • 数据科学和机器学习:使用库如NumPy、Pandas和TensorFlow。

  • 自动化脚本:用于任务自动化和系统管理。

  • 游戏开发:使用库如Pygame。

如何安装python

Windows

  1. 下载Python

    • 访问Python官方网站

    • 点击“Download Python”按钮,下载最新版本的安装程序。

  2. 运行安装程序

    • 双击下载的安装程序。

    • 在安装窗口中,确保选中“Add Python to PATH”选项,然后点击“Install Now”。

  3. 验证安装

    • 打开命令提示符(可以在开始菜单中搜索“cmd”)。

    • 输入 python --versionpython -V,如果显示版本号,则安装成功。

macOS

1.使用Homebrew(推荐)

  • 打开终端(Terminal)。

  • 如果没有安装Homebrew,请先安装它。在终端中输入:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  • 然后安装python

brew install pytho

2.验证安装

  • 在终端中输入 python3 --version,如果显示版本号,则安装成功。

Linux

  1. 使用包管理器

    • 对于基于Debian的系统(如Ubuntu),在终端中输入:

      sudo apt update
      sudo apt install python3
    • 对于基于Red Hat的系统(如Fedora),输入:

      sudo dnf install python3
  2. 验证安装

    • 在终端中输入 python3 --version,如果显示版本号,则安装成功。

注意事项

  • Python 3是推荐版本,尽量避免使用Python 2,因为Python 2已经停止支持。

  • 在某些系统上,可能需要使用 python3 而不是 python 来运行Python。

IDE是什么,为什么需要IDE

IDE是“集成开发环境”(Integrated Development Environment)的缩写,是一种用于软件开发的应用程序,提供了多种工具和功能,帮助开发人员编写、测试和调试代码。常见的IDE包括PyCharm、Visual Studio Code、Eclipse、IntelliJ IDEA等。

IDE的主要特点和功能:

1. 代码编辑器:提供语法高亮、自动补全、代码格式化等功能,使编写代码更加高效。

2. 调试工具:集成调试器,可以设置断点、查看变量值、单步执行等,帮助开发人员找到和修复程序中的错误。

3. 版本控制集成:支持与版本控制系统(如Git)的集成,方便代码管理和协作。

4. 构建和运行工具:简化了项目的构建和运行过程,通常只需点击按钮即可编译和运行代码。

5. 项目管理:提供项目结构视图,方便管理项目文件和资源。

6. 插件支持:许多IDE支持插件,可以扩展功能以满足特定需求。

为什么需要IDE:

1. 提高生产力:IDE提供的自动补全和语法高亮功能可以显著提高编码效率,减少错误。

2. 简化调试过程:集成的调试工具使得调试过程更加直观和方便,有助于快速定位问题。

3. 统一的工作环境:IDE将多个开发工具集成在一个界面中,减少了切换不同工具的时间,提高了工作效率。

4. 学习和掌握编程:对于初学者来说,IDE提供的提示和功能可以帮助他们更快地学习编程语言和开发技能。

5. 团队协作:许多IDE支持团队协作功能,帮助团队成员更好地协作开发。

总之,IDE是现代软件开发中不可或缺的工具,能够显著提高开发效率和代码质量。

python有哪些IDE

Python有多种IDE可供选择,适合不同需求和开发风格。以下是一些常用的Python IDE:

IDE 特点 适用人群
PyCharm 功能强大,支持代码补全、调试、版本控制、测试等。提供社区版和专业版。 专业开发者和大型项目
Visual Studio Code 轻量级、可扩展,支持多种编程语言,通过插件增强对Python的支持。 各种开发者,尤其是多语言支持
Jupyter Notebook 基于浏览器的交互式环境,适合数据科学和机器学习,支持代码、文本和可视化。 数据科学家和研究人员
Spyder 专为科学计算和数据分析设计,集成强大的数据视图和调试工具。 科学计算和数据分析领域的开发者
Thonny 简单易用,适合初学者,内置调试器和变量查看器。 初学者和教育用途
Atom 开源、可定制,支持多种插件,通过插件增强对Python的支持。 喜欢自定义开发环境的开发者
Eclipse with PyDev Eclipse是通用IDE,PyDev是其Python插件,支持调试和代码补全。 熟悉Eclipse的开发者
IDLE Python自带的简单IDE,适合小项目和学习。 初学者和简单脚本开发
Wing IDE 专注于Python开发,提供强大的调试和代码分析工具。 专业Python开发者
Repl.it 在线IDE,支持多种编程语言,包括Python,适合快速原型开发和学习。 初学者和快速测试代码的开发者

安装IDE

IDE 操作系统 安装步骤
PyCharm Windows 1. 访问 JetBrains官网 下载适合的版本。
2. 双击安装文件,按指示完成安装。
3. 配置Python解释器。
macOS 1. 访问 JetBrains官网 下载.dmg文件。
2. 拖动到“Applications”文件夹中。
3. 配置Python解释器。
Linux 1. 访问 JetBrains官网 下载.tar.gz文件。
2. 解压并运行启动脚本。
3. 配置Python解释器。
Visual Studio Code Windows 1. 访问 VS Code官网 下载.exe文件。
2. 双击安装文件,按指示完成安装。
3. 安装Python扩展。
macOS 1. 访问 VS Code官网 下载.dmg文件。
2. 拖动到“Applications”文件夹中。
3. 安装Python扩展。
Linux 1. 访问 VS Code官网 下载合适的包(.deb.rpm)。
2. 使用相应命令安装。
3. 安装Python扩展。

配置python解释器

1. 在 PyCharm 中配置 Python 解释器

  1. 打开项目

    • 启动PyCharm并打开你的项目。

  2. 进入设置

    • 点击菜单栏中的 File,然后选择 Settings(在macOS上是 PyCharm -> Preferences)。

  3. 选择项目解释器

    • 在左侧菜单中,选择 Project: [Your Project Name] -> Python Interpreter

  4. 添加解释器

    • 点击右侧的齿轮图标,然后选择 Add...

    • 选择解释器类型(如 Virtualenv EnvironmentConda EnvironmentSystem Interpreter)。

    • 根据需要选择或创建新的虚拟环境,或者选择系统中的Python解释器路径。

  5. 确认设置

    • 点击 OK,然后应用更改。

  6. 完成

    • 你现在可以在PyCharm中使用配置好的Python解释器。


2. 在 Visual Studio Code 中配置 Python 解释器

  1. 打开项目

    • 启动VS Code并打开你的项目文件夹。

  2. 打开命令面板

    • Ctrl + Shift + P(Windows/Linux)或 Cmd + Shift + P(macOS)打开命令面板。

  3. 选择解释器

    • 输入并选择 Python: Select Interpreter

  4. 选择解释器

    • VS Code会列出可用的Python解释器。选择你想要使用的解释器。如果你没有看到想要的解释器,可以选择 Enter interpreter path...,手动输入解释器的路径。

  5. 确认设置

    • 选择后,VS Code会自动更新并使用你选择的解释器。

  6. 完成

    • 现在你可以在VS Code中使用配置好的Python解释器。

汉化IDE界面使其成为中文

汉化PyCharm和Visual Studio Code的界面可以通过安装语言包或插件来实现。以下是具体步骤:

1. 汉化 PyCharm 界面

使用插件

  1. 打开PyCharm
    启动PyCharm。

  2. 进入插件市场

    • 点击菜单栏中的 File,选择 Settings(在macOS上是 PyCharm -> Preferences)。

    • 在左侧菜单中选择 Plugins

  3. 搜索中文插件

    • 在插件市场中,搜索 Chinese汉化

    • 找到合适的中文语言包插件(如 Chinese (Simplified) Language Pack)。

  4. 安装插件

    • 点击插件旁边的 Install 按钮进行安装。

  5. 重启PyCharm

    • 安装完成后,重启PyCharm,界面将变为中文。

2. 汉化 Visual Studio Code 界面

使用语言包

  1. 打开VS Code
    启动Visual Studio Code。

  2. 进入扩展市场

    • 点击左侧的扩展图标(四个小方块的图标),或者按 Ctrl + Shift + X

  3. 搜索中文语言包

    • 在搜索框中输入 Chinese中文

    • 找到 Chinese (Simplified) Language Pack

  4. 安装语言包

    • 点击 Install 按钮进行安装。

  5. 重启VS Code

    • 安装完成后,重启VS Code,界面将变为中文。

  6. 设置默认语言(如有必要):

    • 如果界面没有自动切换,可以通过打开命令面板(Ctrl + Shift + P)并输入 Configure Display Language,选择 zh-CN

注意事项

  • 在某些情况下,插件或语言包可能不完全覆盖所有内容,部分文本可能仍然显示为英文。

  • 确保插件和IDE版本兼容,以避免出现问题。

正式爬取API图片

相信大家都知道API图片是什么这里就不过多赘述,那么我们如何用python爬取里面的图片并且不重复呢?

这里我已经写好了一个例子并且打包好,作为参考,大家可以在此基础上添加一个多线程下载

这段代码实现了一个简单的图形用户界面(GUI)应用程序,可以通过 API 下载图片,检测并删除重复图片,并显示下载进度

已打包exe下载链:

https://alist.qunqin.org

爬取的图片例子:

预览:

QQ_1722759596356.png

需要安装的库:

pip install requests
import tkinter as tk  # 导入 tkinter 库,用于创建图形用户界面
from tkinter import filedialog, messagebox, ttk  # 从 tkinter 导入文件对话框、消息框和主题小部件
import requests  # 导入 requests 库,用于发送 HTTP 请求
import os  # 导入 os 库,用于文件和目录操作
import time  # 导入 time 库,用于时间相关的操作
from threading import Thread  # 从 threading 导入 Thread 类,用于多线程操作
import hashlib  # 导入 hashlib 库,用于计算哈希值

# 全局变量用于控制下载线程的运行状态
stop_download_flag = False

def get_image_hash(image_path):
    """计算图片的哈希值"""
    hash_md5 = hashlib.md5()  # 创建一个 MD5 哈希对象
    with open(image_path, "rb") as f:  # 以二进制模式打开图片文件
        for chunk in iter(lambda: f.read(4096), b""):  # 每次读取 4096 字节
            hash_md5.update(chunk)  # 更新哈希对象
    return hash_md5.hexdigest()  # 返回哈希值的十六进制表示

def load_existing_hashes(folder_path):
    """加载已有文件夹中的所有图片哈希值"""
    existing_hashes = {}  # 创建一个字典来存储哈希值及其对应的文件路径
    for root, _, files in os.walk(folder_path):  # 遍历文件夹
        for file in files:  # 遍历文件
            if file.endswith(('jpg', 'jpeg', 'png', 'gif', 'bmp')):  # 检查文件扩展名
                file_path = os.path.join(root, file)  # 获取文件完整路径
                image_hash = get_image_hash(file_path)  # 计算图片哈希值
                if image_hash in existing_hashes:  # 如果哈希值已存在
                    existing_hashes[image_hash].append(file_path)  # 添加文件路径
                else:
                    existing_hashes[image_hash] = [file_path]  # 创建新条目
    return existing_hashes  # 返回所有哈希值及其对应的文件路径

def remove_duplicate_images(folder_path):
    """检测并删除文件夹中的重复图片"""
    existing_hashes = load_existing_hashes(folder_path)  # 加载已有图片哈希值
    duplicates = [files for files in existing_hashes.values() if len(files) > 1]  # 找到重复的文件

    for duplicate_files in duplicates:  # 遍历每组重复文件
        # 保留第一个文件,删除其余的重复文件
        for file_to_delete in duplicate_files[1:]:  # 从第二个文件开始删除
            os.remove(file_to_delete)  # 删除文件
            print(f"删除重复图片: {file_to_delete}")  # 输出删除信息

    messagebox.showinfo("信息", "重复图片检测和删除完成。")  # 显示完成消息

def fetch_random_image(url, save_path, count, progress_bar, existing_hashes):
    global stop_download_flag  # 使用全局变量来控制下载状态
    downloaded_hashes = set(existing_hashes)  # 转换已有哈希值为集合以便快速查找
    i = 0  # 初始化下载计数器
    while i < count and not stop_download_flag:  # 循环直到下载数量达到或请求停止
        try:
            response = requests.get(url, stream=True)  # 发送 GET 请求
            if response.status_code == 200:  # 检查请求是否成功
                os.makedirs(os.path.dirname(save_path), exist_ok=True)  # 创建保存目录
                unique_filename = os.path.join(save_path, f"random_image_{int(time.time() * 1000)}_{i}.jpg")  # 生成唯一文件名
                with open(unique_filename, 'wb') as file:  # 以二进制写入模式打开文件
                    for chunk in response.iter_content(1024):  # 分块写入文件
                        if stop_download_flag:  # 检查是否需要停止下载
                            file.close()  # 关闭文件
                            os.remove(unique_filename)  # 删除未完成的文件
                            print(f"下载中止,删除图片: {unique_filename}")  # 输出删除信息
                            return
                        file.write(chunk)  # 写入文件

                image_hash = get_image_hash(unique_filename)  # 计算下载图片的哈希值
                if image_hash in downloaded_hashes:  # 检查是否为重复图片
                    print(f"图片 {i + 1} 是重复的,已删除。")  # 输出重复信息
                    os.remove(unique_filename)  # 删除重复图片
                else:
                    downloaded_hashes.add(image_hash)  # 添加新哈希值
                    print(f"图片 {i + 1} 成功保存到 {unique_filename}")  # 输出保存成功信息
                    i += 1  # 增加计数器
                    progress_bar['value'] += 1  # 更新进度条
                    progress_bar.update_idletasks()  # 刷新进度条
            else:
                print(f"获取图片 {i + 1} 失败。状态码: {response.status_code}")  # 输出错误信息
        except Exception as e:
            print(f"获取图片 {i + 1} 时发生错误: {e}")  # 捕获并输出异常信息

def start_download():
    global stop_download_flag  # 使用全局变量控制下载状态
    stop_download_flag = False  # 重置下载状态
    try:
        api_url = entry_api_url.get()  # 获取 API 接口 URL
        num_images = int(entry_num_images.get())  # 获取要下载的图片数量
        save_directory = entry_save_path.get()  # 获取保存目录
        existing_directory = entry_existing_path.get()  # 获取已有图片目录

        if not api_url:  # 检查 API 接口是否为空
            messagebox.showwarning("警告", "请输入API接口。")  # 提示用户输入
            return
        if not save_directory:  # 检查保存目录是否为空
            messagebox.showwarning("警告", "请选择保存目录。")  # 提示用户选择目录
            return

        existing_hashes = set()  # 初始化已有哈希值集合
        if existing_directory:  # 如果提供了已有图片目录
            existing_hashes = load_existing_hashes(existing_directory)  # 加载已有哈希值

        progress_bar['value'] = 0  # 重置进度条
        progress_bar['maximum'] = num_images  # 设置进度条最大值

        # 创建并启动下载线程
        download_thread = Thread(target=fetch_random_image,
                                 args=(api_url, save_directory, num_images, progress_bar, existing_hashes))
        download_thread.start()

        def check_thread():
            if download_thread.is_alive():  # 检查下载线程是否仍在运行
                root.after(100, check_thread)  # 每 100 毫秒检查一次
            else:
                progress_bar['value'] = num_images  # 更新进度条到最大值
                messagebox.showinfo("信息", f"成功下载了 {num_images} 张图片。")  # 显示成功消息
                progress_bar['value'] = 0  # 重置进度条
                entry_num_images.delete(0, tk.END)  # 清空输入框

        check_thread()  # 启动检查线程

    except ValueError:  # 捕获转换错误
        messagebox.showerror("错误", "请输入有效的图片数量。")  # 提示用户输入有效数量

def stop_download():
    global stop_download_flag  # 使用全局变量控制下载状态
    stop_download_flag = True  # 设置停止下载标志

def browse_directory(entry):
    directory = filedialog.askdirectory()  # 打开目录选择对话框
    if directory:  # 如果选择了目录
        entry.delete(0, tk.END)  # 清空输入框
        entry.insert(0, directory)  # 插入选择的目录

# 创建主窗口
root = tk.Tk()  # 初始化主窗口
root.title("图片API下载器")  # 设置窗口标题

# 创建各个输入框和标签
tk.Label(root, text="API接口:").grid(row=0, column=0, padx=10, pady=10)  # API 接口标签
entry_api_url = tk.Entry(root)  # API 接口输入框
entry_api_url.grid(row=0, column=1, padx=10, pady=10)  # 设置输入框位置

tk.Label(root, text="图片数量:").grid(row=1, column=0, padx=10, pady=10)  # 图片数量标签
entry_num_images = tk.Entry(root)  # 图片数量输入框
entry_num_images.grid(row=1, column=1, padx=10, pady=10)  # 设置输入框位置

tk.Label(root, text="保存目录:").grid(row=2, column=0, padx=10, pady=10)  # 保存目录标签
entry_save_path = tk.Entry(root)  # 保存目录输入框
entry_save_path.grid(row=2, column=1, padx=10, pady=10)  # 设置输入框位置
tk.Button(root, text="浏览", command=lambda: browse_directory(entry_save_path)).grid(row=2, column=2, padx=10, pady=10)  # 浏览按钮

tk.Label(root, text="已有图片目录:").grid(row=3, column=0, padx=10, pady=10)  # 已有图片目录标签
entry_existing_path = tk.Entry(root)  # 已有图片目录输入框
entry_existing_path.grid(row=3, column=1, padx=10, pady=10)  # 设置输入框位置
tk.Button(root, text="浏览", command=lambda: browse_directory(entry_existing_path)).grid(row=3, column=2, padx=10, pady=10)  # 浏览按钮

# 创建开始下载按钮
tk.Button(root, text="开始下载", command=start_download).grid(row=4, column=0, columnspan=3, pady=20)  # 开始下载按钮

# 创建停止下载按钮
tk.Button(root, text="停止下载", command=stop_download).grid(row=5, column=0, columnspan=3, pady=20)  # 停止下载按钮

# 创建检测并删除重复图片按钮
tk.Button(root, text="检测并删除重复图片", command=lambda: remove_duplicate_images(entry_existing_path.get())).grid(
    row=6, column=0, columnspan=3, pady=20)  # 检测并删除重复图片按钮

# 创建进度条
progress_bar = ttk.Progressbar(root, orient='horizontal', length=300, mode='determinate')  # 创建水平进度条
progress_bar.grid(row=7, column=0, columnspan=3, padx=10, pady=20)  # 设置进度条位置

root.mainloop()  # 启动主事件循环

如何打包成exe可执行文件

1. 安装 PyInstaller

首先,确保您已安装 PyInstaller。可以使用以下命令安装:

pip install pyinstaller

2. 打包脚本

在命令行中,导航到您的 Python 脚本所在的目录,然后运行以下命令:

pyinstaller --onefile --windowed your_script.py
  • --onefile: 生成单个可执行文件。

  • --windowed: 适用于 GUI 应用程序,避免显示命令行窗口。

3. 查找生成的 .exe 文件

打包完成后,您将在当前目录下看到一个 dist 文件夹,里面会有生成的 .exe 文件。

4. 运行 .exe 文件

您可以直接双击 .exe 文件来运行您的应用程序。

其他选项

  • 如果您需要添加图标,可以使用 --icon 选项:

    pyinstaller --onefile --windowed --icon=your_icon.ico your_script.py
  • 如果您的程序依赖其他资源文件(如图片、数据文件等),您可能需要使用 --add-data 选项来包含这些文件。

注意事项

  • 确保在打包之前测试您的脚本,确保其在您的开发环境中正常运行。

  • 打包后的可执行文件可能会比原始脚本大,因为它包含了 Python 解释器和所需的库。

消息盒子

# 暂无消息 #

只显示最新10条未读和已读信息