在当今的数字时代,以编程方式管理和处理图像可以为您节省大量的时间和精力。如果您希望自动化从网络下载图像的过程,那么您来对地方了。在本文中,我们将深入研究一个使用 pexels API(高质量库存照片的流行来源)来完成此操作的 Python 脚本。
概述
此处提供的 python 脚本允许您根据查询在 pexels 上搜索图像,如果满足特定条件则下载它们,并将它们保存到本地系统。该脚本使用了多个强大的库和 api,包括 requests、pillow 和 pexels api。
脚本的主要特点
api 集成:使用 api 从 pexels 获取图像。
动态过滤:根据尺寸和方向选择图像。
日期模拟:虽然 pexels api 不直接支持基于日期的过滤,但脚本通过生成随机日期来模拟这一点。
速率限制:避免因随机延迟而达到 api 速率限制。
理解代码
导入和配置
1
2
3
4
5
6
7
|
import os
import requests
from pil import image
from io import bytesio
import random
import time
from datetime import datetime, timedelta
|
脚本首先导入必要的库。这是一个快速概述:
- os 和 requests 分别用于与文件系统交互和发出 HTTP 请求。
- pil(pillow)用于处理图像操作。
- random、time 和 datetime 用于生成随机数、管理延迟和处理日期。
1
2
3
4
5
6
7
8
|
api_key = '...' # replace with your actual pexels api key
base_url = 'HTTPS://api.pexels.com/v1/search'
output_dir = 'output'
search_query = 'subaru forester'
min_width = 1080
min_height = 1920
num_images = 16
orientation = 'vertical'
|
设置您的 api 密钥、pexels 的基本 url,并指定其他参数,例如搜索查询、最小图像尺寸、要下载的图像数量和图像方向。
立即学习“Python免费学习笔记(深入)”;
点击下载“修复网络工具,一键解决电脑无法上网”;
确保输出目录存在
1
2
|
if not os.path.exists(output_dir):
os.makedirs(output_dir)
|
脚本检查输出目录是否存在,并在必要时创建它。
获取图像
1
2
3
4
5
6
7
8
9
|
def get_images(query, page=1, per_page=15):
params = {
'query' : query,
'page' : page,
'per_page' : per_page
}
response = requests.get(base_url, HEADers=headers, params=params)
response.raise_for_status()
return response.JSon()
|
此函数向 pexels api 发送请求,以根据搜索查询和其他参数获取图像。
下载和保存图像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
def download_and_save_image(url, filename):
response = requests.get(url)
response.raise_for_status()
img = image.open(bytesio(response.content))
if img.width >= min_width and img.height >= min_height:
if orientation == 'vertical' and (img.height / img.width > 1.4):
img.save(filename)
print (f 'saved {filename}' )
return 1
elif orientation == 'horizontal' and (img.width / img.height > 1.4):
img.save(filename)
print (f 'saved {filename}' )
return 1
return 0
|
此函数处理从 url 下载图像,检查其尺寸和方向,如果符合条件则保存它。
生成随机日期
1
2
3
4
5
|
def generate_random_date():
end_date = datetime.now()
start_date = end_date - timedelta(days=4*365)
random_date = start_date + timedelta(days=random.randint(0, 4*365))
return random_date
|
该函数生成过去四年内的随机日期。虽然 pexels api 不直接提供基于日期的过滤,但这个随机日期模拟了这样的过滤器。
主要功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
def main():
images_downloaded = 0
page = 1
seen_images = set()
target_date = generate_random_date()
print (f "Target date for filtering: {target_date.strftime('%Y-%m-%d')}" )
while images_downloaded = NUM_IMAGES:
break
image_url = photo[ 'src' ][ 'original' ]
photo_date = datetime. strptime (photo[ 'created_at' ], '%Y-%m-%dT%H:%M:%S%z' ) if 'created_at' in photo else datetime.now()
if photo_date > target_date and image_url not in seen_images:
filename = os.path.join(OUTPUT_DIR, f 'image_{images_downloaded + 1}.jpg' )
if download_and_save_image(image_url, filename):
images_downloaded += 1
seen_images.add(image_url)
page += 1
time.sleep(random.unifORM(1, 2)) # Sleep to avoid hitting API rate limits
|
main() 函数协调图像获取、下载和保存过程。它管理分页、检查重复图像并强制延迟以遵守 api 的速率限制。
运行脚本
要运行此脚本,请确保您已将 api_key 替换为实际的 pexels api 密钥,并根据需要调整其他参数。将脚本保存在 .py 文件中并使用 python 解释器执行它。符合指定条件的图像将保存在输出目录中。
结论
自动图像下载可以简化您的工作流程并确保您拥有高质量的图像。该 python 脚本为此类任务提供了坚实的基础,并且可以根据您的需求灵活地进行自定义。无论您是在处理个人项目还是将图像下载集成到更大的应用程序中,此脚本都展示了 python 在处理基于 Web 的任务方面的强大功能和多功能性。