You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于BeautifulSoup爬取页面结果:解决图片重复存储异常问题

解决BeautifulSoup爬取图片时重复下载到嵌套子文件夹的问题

我正在用BeautifulSoup爬取页面上的小猫图片,目前代码能爬取图片,但存储有异常:先下载40余张图片到kittens文件夹,之后会在这个文件夹里生成同名的kittens子文件夹,然后重复下载相同的图片。请问该怎么修改代码?

问题分析

这种情况大概率是文件夹创建逻辑重复执行,或者文件路径拼接出错导致的——比如你在遍历图片的循环里重复创建文件夹,或者切换目录后没处理好路径,导致每次下载都往新生成的子文件夹里存。

具体修改方案

  1. 将文件夹创建逻辑移到循环外
    只在爬取开始前创建一次目标文件夹,避免循环里重复执行创建操作:

    import os
    
    # 定义保存文件夹
    save_dir = "kittens"
    # 仅在文件夹不存在时创建,只执行一次
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    
  2. 用os.path.join拼接正确的文件路径
    手动拼接字符串很容易出错,用os.path.join可以自动处理路径分隔符,确保图片直接存到目标文件夹根目录:

    # 假设img_name是你提取的图片文件名
    img_path = os.path.join(save_dir, img_name)
    # 保存图片
    with open(img_path, 'wb') as f:
        f.write(requests.get(img_url).content)
    
  3. 移除循环内的目录切换操作
    如果你的代码里有os.chdir(save_dir)这类切换目录的代码,别放在循环里——要么只执行一次,要么直接用绝对路径保存文件,避免不断进入嵌套子文件夹。

完整示例代码片段

import os
import requests
from bs4 import BeautifulSoup

# 目标页面URL
target_url = "你的目标页面链接"
save_dir = "kittens"

# 提前创建文件夹
if not os.path.isdir(save_dir):
    os.makedirs(save_dir)

# 爬取页面内容
response = requests.get(target_url)
soup = BeautifulSoup(response.text, 'html.parser')

# 提取所有图片标签
img_tags = soup.find_all('img')

for idx, img_tag in enumerate(img_tags):
    img_url = img_tag.get('src')
    # 处理相对链接的情况
    if not img_url.startswith(('http://', 'https://')):
        img_url = f"{target_url.rstrip('/')}/{img_url.lstrip('/')}"
    
    # 生成唯一文件名,避免重复覆盖
    img_name = f"kitten_{idx}.jpg"
    # 拼接正确的保存路径
    img_save_path = os.path.join(save_dir, img_name)
    
    # 下载并保存图片
    try:
        img_content = requests.get(img_url).content
        with open(img_save_path, 'wb') as f:
            f.write(img_content)
        print(f"成功保存: {img_save_path}")
    except Exception as e:
        print(f"下载失败 {img_url}: {str(e)}")

这样调整后,所有图片都会直接保存到根目录的kittens文件夹中,不会生成嵌套子文件夹,也不会重复下载相同图片了。

内容的提问来源于stack exchange,提问作者piotrulu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:01:47