PicThief

最近挺馋 某api网站 上的美图,想写个 python 爬虫把图片都爬下来

import requests
import os

# 设置保存图片的文件夹
save_dir = 'images'
os.makedirs(save_dir, exist_ok=True)

# 循环请求API,假设您要获取100张图片
for i in range(100):
    # 发送API请求
    response = requests.get('https://t.mwm.moe/pc/')

    if response.status_code == 200:
        # 解析API响应,提取图片数据
        image_data = response.content

        # 生成文件名,这里可以使用随机文件名或递增的文件名
        file_name = f'image_{i}.jpg'

        # 保存图片到本地存储
        with open(os.path.join(save_dir, file_name), 'wb') as file:
            file.write(image_data)
        print(f'Saved {file_name}')
    else:
        print(f'Failed to retrieve image {i}')

print('Done')

爬下来以后发现需要图片过大,电脑加载要卡半天(
所以加入了图片转webp功能,使用的是pillow库

import requests
from PIL import Image
import os
import io

# 设置保存图片的文件夹
save_dir = 'images'
os.makedirs(save_dir, exist_ok=True)

# 循环请求API,假设您要获取100张图片
for i in range(100):
    # 发送API请求
    response = requests.get('https://t.mwm.moe/pc/')

    if response.status_code == 200:
        # 解析API响应,提取图片数据
        image_data = response.content

        # 生成文件名,这里可以使用随机文件名或递增的文件名
        file_name = f'image_{i}.webp'  # 使用.webp扩展名保存为WebP格式

        # 打开JPEG图片并将其转换为WebP格式并保存
        jpeg_image = Image.open(io.BytesIO(image_data))
        jpeg_image.save(os.path.join(save_dir, file_name), 'webp')
        print(f'Converted and saved {file_name}')
    else:
        print(f'Failed to retrieve image {i}')

print('Done')

事实上,因为api返回的图片是从图库来的随机图,所以有可能重复,而我不希望我下下来的图一堆都是重复的,所以为了避免重复,使用Python的hashlib库来计算每个图片的哈希值,并将哈希值用于检查是否已经保存了相同的图片

import requests
from PIL import Image
import os
import io
import hashlib

# 设置保存图片的文件夹
save_dir = 'images'
os.makedirs(save_dir, exist_ok=True)

# 用集合(set)来跟踪已保存的哈希值
saved_hashes = set()

# 循环请求API,假设您要获取100张图片
for i in range(100):
    # 发送API请求
    response = requests.get('https://t.mwm.moe/pc/')

    if response.status_code == 200:
        # 解析API响应,提取图片数据
        image_data = response.content

        # 计算图片数据的哈希值
        image_hash = hashlib.sha256(image_data).hexdigest()

        # 如果哈希值不在已保存的哈希值集合中,保存图片
        if image_hash not in saved_hashes:
            saved_hashes.add(image_hash)

            # 生成文件名,这里可以使用随机文件名或递增的文件名
            file_name = f'image_{i}.webp'  # 使用.webp扩展名保存为WebP格式

            # 打开JPEG图片并将其转换为WebP格式并保存
            jpeg_image = Image.open(io.BytesIO(image_data))
            jpeg_image.save(os.path.join(save_dir, file_name), 'webp')
            print(f'Converted and saved {file_name}')
        else:
            print(f'Skipping duplicate image {i}')
    else:
        print(f'Failed to retrieve image {i}')

print('Done')

这就是终版辣

无标签
评论区
头像