这段代码是一个简单的Python脚本,用于从特定网站上下载图片。代码使用了requests库来发送HTTP请求,使用BeautifulSoup库来解析HTML内容,并通过线程池来并发下载图片。
以下是代码的主要功能和流程:
- 导入所需的模块:
- requests:用于发送HTTP请求和获取网页内容。
- BeautifulSoup:用于解析HTML页面内容。
- os:用于操作文件和文件夹。
- urllib.parse:用于拼接URL。
- ThreadPoolExecutor和- as_completed:用于并发执行下载任务。
- Tk和- filedialog:用于选择保存路径的图形界面组件。
- download_image函数:
- 下载图片并保存到指定路径。
- 在下载之前,检查图片大小,如果太小则跳过下载。
- 将下载过的文件名记录在日志文件中。
- download_images函数:
- 根据给定的URL,解析网页内容,提取图片链接并下载图片。
- 使用线程池来并发下载图片。
- 通过 page计数来翻页下载图片。
- 主函数:
- 弹出文件夹选择对话框,选择保存路径。
- 如果选择了保存路径,则调用 download_images函数下载图片。
此脚本适用于下载网站上的图片,并使用线程池来提高下载效率。在运行之前,请确保已安装所需的库,如 requests、BeautifulSoup 和 ThreadPoolExecutor。另外,将代码中的url替换为你想要下载图片的网站链接。
需要注意的是,爬取网站内容时请遵循网站的使用条款和规定,不要对网站进行不正当的访问和下载。
import requests
from bs4 import BeautifulSoup
import os
import urllib.parse
from concurrent.futures import ThreadPoolExecutor, as_completed
from tkinter import Tk, filedialog
 
def download_image(img_info, log_file_path):
    img_url, image_path = img_info
    image_name = os.path.basename(image_path)
 
    # 追加写入log.txt
    with open(log_file_path, 'a') as log_file:
        log_file.write(f'{image_name},')
    if os.path.exists(image_path):
        print(f'Skipped image: {image_name}')
    else:
        # 获取文件大小
        response = requests.head(img_url)
        file_size = int(response.headers.get('Content-Length', 0))
         
        if file_size < 200 * 1024:  # 200KB
            print(f'Skipped image: {image_name} (File size too small)')
        else:
            image_data = requests.get(img_url).content
            with open(image_path, 'wb') as f:
                f.write(image_data)
            print(f'Downloaded image: {image_name}')
 
         
 
def download_images(url, save_path):
    # 创建保存图片的文件夹
    os.makedirs(save_path, exist_ok=True)
 
    page = 0
    log_file_path = os.path.join(save_path, 'log.txt')
 
    # 读取已下载的文件列表
    downloaded_files = []
    if os.path.exists(log_file_path):
        with open(log_file_path, 'r') as log_file:
            downloaded_files = log_file.read().split(',')
 
    with ThreadPoolExecutor(max_workers=2) as executor:
        while True:
            page_url = url + f'?page={page}&lang=en'
 
            response = requests.get(page_url)
            soup = BeautifulSoup(response.text, 'html.parser')
 
            img_tags = soup.find_all('img', class_='svelte-1ibbyvk')
 
            if not img_tags:
                break
 
            download_tasks = []
            for img_tag in img_tags:
                img_src = img_tag['src']
                img_path = img_src.split('previews/')[1].replace('_cp', '')
                img_url = urllib.parse.urljoin('https://images.anime-pictures.net/', img_path)
 
                image_name = os.path.basename(img_path)
                image_path = os.path.join(save_path, image_name)
 
                if image_name not in downloaded_files:
                    download_tasks.append((img_url, image_path))
 
            for future in as_completed(executor.submit(download_image, task, log_file_path) for task in download_tasks):
                try:
                    future.result()
                except Exception as e:
                    print(f'Error occurred: {str(e)}')
 
            page += 1
            print(f'当前下载第: {page}页')
 
# 使用文件夹选择对话框选择保存路径
root = Tk()
root.withdraw()
save_path = filedialog.askdirectory(title='选择保存路径')
 
if save_path:
    url = 'https://anime-pictures.net/posts'  # 替换为你的链接
    download_images(url, save_path) UUpython
UUpython
评论前必须登录!
注册