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

VS Code中使用Requests与Beautiful Soup爬虫下载图片无法找到文件

排查图片爬取后找不到的问题

从这几个核心点逐一排查:

1. 确认目标目录是否真实创建

指定目录后,若没处理目录不存在则创建的逻辑,会导致下载失败且无报错提示:

  • 用os.makedirs()时添加exist_ok=True,避免目录已存在抛出异常:
import os

save_dir = "./mike_tyson_images"
# 递归创建目录,已存在时不报错
os.makedirs(save_dir, exist_ok=True)
  • 打印目录的绝对路径,手动去文件系统验证位置:
print(os.path.abspath(save_dir))

有时脚本的工作目录和你预期的位置不一致(比如跑到Python解释器的默认目录),直接看绝对路径能快速定位。

2. 检查图片请求是否成功

爬取的图片URL可能因为反爬拦截、相对路径未拼接等原因,导致请求失败(返回403/404),根本没拿到图片内容:

  • 给Requests请求添加浏览器模拟头,避免被反爬拦截:
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
img_response = requests.get(img_url, headers=headers)
# 校验响应状态码,200才代表请求成功
if img_response.status_code != 200:
    print(f"请求图片失败:{img_url},状态码:{img_response.status_code}")
    continue
  • 若图片URL是相对路径(比如/images/xxx.jpg),必须和网页域名拼接成完整URL:
base_url = "https://example.com"
img_relative_url = soup.find("img")["src"]
img_url = base_url + img_relative_url

3. 排查文件名合法性

Windows系统文件名不能包含/ \ : * ? " < > |等非法字符,爬取的图片URL中可能带有这些字符,导致保存失败:

  • 处理文件名,替换非法字符:
import re

# 从URL提取文件名,替换非法字符为下划线
img_name = re.sub(r'[\\/*?:"<>|]', '_', os.path.basename(img_url))
save_path = os.path.join(save_dir, img_name)

4. 检查代码逻辑漏洞

比如循环未遍历到图片元素、判断条件错误导致跳过下载步骤:

  • 打印找到的图片URL列表,确认是否获取到内容:
img_urls = [img["src"] for img in soup.find_all("img")]
print(f"找到{len(img_urls)}张图片")

如果数量为0,说明你定位图片元素的代码有误,需检查find_all的参数(比如class、标签名)是否匹配目标网站的结构。

完整修正示例代码

整合上述排查点的代码参考:

import requests
from bs4 import BeautifulSoup
import os
import re

def crawl_images(keyword):
    save_dir = f"./{keyword.replace(' ', '_')}_images"
    os.makedirs(save_dir, exist_ok=True)
    print(f"图片将保存到:{os.path.abspath(save_dir)}")

    # 示例使用百度图片搜索,可替换为目标网站
    search_url = f"https://image.baidu.com/search/index?tn=baiduimage&word={keyword}"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
    }

    response = requests.get(search_url, headers=headers)
    soup = BeautifulSoup(response.text, "html.parser")

    # 定位图片元素,注意不同网站的标签结构不同
    img_elements = soup.find_all("img", class_="main_img")
    print(f"找到{len(img_elements)}张图片")

    for idx, img in enumerate(img_elements):
        img_url = img.get("src")
        if not img_url:
            continue
        # 处理相对路径
        if not img_url.startswith("http"):
            img_url = "https:" + img_url

        try:
            img_response = requests.get(img_url, headers=headers, timeout=10)
            if img_response.status_code != 200:
                print(f"跳过:{img_url} 状态码{img_response.status_code}")
                continue

            # 处理文件名,避免非法字符
            img_name = re.sub(r'[\\/*?:"<>|]', '_', f"{idx}_{os.path.basename(img_url)}")
            save_path = os.path.join(save_dir, img_name)

            with open(save_path, "wb") as f:
                f.write(img_response.content)
            print(f"已保存:{save_path}")
        except Exception as e:
            print(f"下载失败:{img_url},错误:{str(e)}")

if __name__ == "__main__":
    keyword = input("请输入关键词:")
    crawl_images(keyword)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 01:03:29