欢迎光临UUpython
最大、最新、最全的Python代码收集站

anime-pictures好看壁纸爬虫

这段代码是一个简单的Python脚本,用于从特定网站上下载图片。代码使用了requests库来发送HTTP请求,使用BeautifulSoup库来解析HTML内容,并通过线程池来并发下载图片。

以下是代码的主要功能和流程:

  1. 导入所需的模块:
  • requests:用于发送HTTP请求和获取网页内容。
  • BeautifulSoup:用于解析HTML页面内容。
  • os:用于操作文件和文件夹。
  • urllib.parse:用于拼接URL。
  • ThreadPoolExecutoras_completed:用于并发执行下载任务。
  • Tkfiledialog:用于选择保存路径的图形界面组件。
  1. download_image 函数:
  • 下载图片并保存到指定路径。
  • 在下载之前,检查图片大小,如果太小则跳过下载。
  • 将下载过的文件名记录在日志文件中。
  1. download_images 函数:
  • 根据给定的URL,解析网页内容,提取图片链接并下载图片。
  • 使用线程池来并发下载图片。
  • 通过 page 计数来翻页下载图片。
  1. 主函数:
  • 弹出文件夹选择对话框,选择保存路径。
  • 如果选择了保存路径,则调用 download_images 函数下载图片。

此脚本适用于下载网站上的图片,并使用线程池来提高下载效率。在运行之前,请确保已安装所需的库,如 requestsBeautifulSoupThreadPoolExecutor。另外,将代码中的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)
赞(0) 打赏
未经允许不得转载:UUpython » anime-pictures好看壁纸爬虫
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!