这段代码是一个简单的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)
评论前必须登录!
注册