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
相关产品推荐
相关产品推荐

