基于BeautifulSoup爬取页面结果:解决图片重复存储异常问题
解决BeautifulSoup爬取图片时重复下载到嵌套子文件夹的问题
我正在用BeautifulSoup爬取页面上的小猫图片,目前代码能爬取图片,但存储有异常:先下载40余张图片到
kittens文件夹,之后会在这个文件夹里生成同名的kittens子文件夹,然后重复下载相同的图片。请问该怎么修改代码?
问题分析
这种情况大概率是文件夹创建逻辑重复执行,或者文件路径拼接出错导致的——比如你在遍历图片的循环里重复创建文件夹,或者切换目录后没处理好路径,导致每次下载都往新生成的子文件夹里存。
具体修改方案
将文件夹创建逻辑移到循环外
只在爬取开始前创建一次目标文件夹,避免循环里重复执行创建操作:import os # 定义保存文件夹 save_dir = "kittens" # 仅在文件夹不存在时创建,只执行一次 if not os.path.exists(save_dir): os.makedirs(save_dir)用
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)移除循环内的目录切换操作
如果你的代码里有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
相关产品推荐
相关产品推荐

