使用python爬取图片API
Python是什么
Python是一种高级编程语言,因其简洁易读的语法和强大的功能而广受欢迎。它由Guido van Rossum于1991年首次发布,现已成为各种应用程序开发的主流语言之一。
Python的主要特点:
易于学习和使用:Python的语法清晰,适合初学者。
跨平台:可以在多种操作系统上运行,包括Windows、macOS和Linux。
丰富的库和框架:Python有大量的第三方库和框架,支持数据科学、机器学习、Web开发、自动化等多种应用。
动态类型:变量不需要事先声明类型,灵活性高。
支持多种编程范式:包括面向对象编程、函数式编程和命令式编程。
常见应用领域:
Web开发:使用框架如Django和Flask。
数据科学和机器学习:使用库如NumPy、Pandas和TensorFlow。
自动化脚本:用于任务自动化和系统管理。
游戏开发:使用库如Pygame。
如何安装python
Windows
下载Python:
访问Python官方网站。
点击“Download Python”按钮,下载最新版本的安装程序。
运行安装程序:
双击下载的安装程序。
在安装窗口中,确保选中“Add Python to PATH”选项,然后点击“Install Now”。
验证安装:
打开命令提示符(可以在开始菜单中搜索“cmd”)。
输入
python --version
或python -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
使用包管理器:
对于基于Debian的系统(如Ubuntu),在终端中输入:
sudo apt update sudo apt install python3
对于基于Red Hat的系统(如Fedora),输入:
sudo dnf install python3
验证安装:
在终端中输入
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 解释器
打开项目:
启动PyCharm并打开你的项目。
进入设置:
点击菜单栏中的
File
,然后选择Settings
(在macOS上是PyCharm
->Preferences
)。
选择项目解释器:
在左侧菜单中,选择
Project: [Your Project Name]
->Python Interpreter
。
添加解释器:
点击右侧的齿轮图标,然后选择
Add...
。选择解释器类型(如
Virtualenv Environment
、Conda Environment
或System Interpreter
)。根据需要选择或创建新的虚拟环境,或者选择系统中的Python解释器路径。
确认设置:
点击
OK
,然后应用更改。
完成:
你现在可以在PyCharm中使用配置好的Python解释器。
2. 在 Visual Studio Code 中配置 Python 解释器
打开项目:
启动VS Code并打开你的项目文件夹。
打开命令面板:
按
Ctrl + Shift + P
(Windows/Linux)或Cmd + Shift + P
(macOS)打开命令面板。
选择解释器:
输入并选择
Python: Select Interpreter
。
选择解释器:
VS Code会列出可用的Python解释器。选择你想要使用的解释器。如果你没有看到想要的解释器,可以选择
Enter interpreter path...
,手动输入解释器的路径。
确认设置:
选择后,VS Code会自动更新并使用你选择的解释器。
完成:
现在你可以在VS Code中使用配置好的Python解释器。
汉化IDE界面使其成为中文
汉化PyCharm和Visual Studio Code的界面可以通过安装语言包或插件来实现。以下是具体步骤:
1. 汉化 PyCharm 界面
使用插件
打开PyCharm:
启动PyCharm。进入插件市场:
点击菜单栏中的
File
,选择Settings
(在macOS上是PyCharm
->Preferences
)。在左侧菜单中选择
Plugins
。
搜索中文插件:
在插件市场中,搜索
Chinese
或汉化
。找到合适的中文语言包插件(如
Chinese (Simplified) Language Pack
)。
安装插件:
点击插件旁边的
Install
按钮进行安装。
重启PyCharm:
安装完成后,重启PyCharm,界面将变为中文。
2. 汉化 Visual Studio Code 界面
使用语言包
打开VS Code:
启动Visual Studio Code。进入扩展市场:
点击左侧的扩展图标(四个小方块的图标),或者按
Ctrl + Shift + X
。
搜索中文语言包:
在搜索框中输入
Chinese
或中文
。找到
Chinese (Simplified) Language Pack
。
安装语言包:
点击
Install
按钮进行安装。
重启VS Code:
安装完成后,重启VS Code,界面将变为中文。
设置默认语言(如有必要):
如果界面没有自动切换,可以通过打开命令面板(
Ctrl + Shift + P
)并输入Configure Display Language
,选择zh-CN
。
注意事项
在某些情况下,插件或语言包可能不完全覆盖所有内容,部分文本可能仍然显示为英文。
确保插件和IDE版本兼容,以避免出现问题。
正式爬取API图片
相信大家都知道API图片是什么这里就不过多赘述,那么我们如何用python爬取里面的图片并且不重复呢?
这里我已经写好了一个例子并且打包好,作为参考,大家可以在此基础上添加一个多线程下载
这段代码实现了一个简单的图形用户界面(GUI)应用程序,可以通过 API 下载图片,检测并删除重复图片,并显示下载进度
已打包exe下载链:
爬取的图片例子:
预览:
需要安装的库:
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 解释器和所需的库。