如何解决Python/Beautiful Soup爬取图片时出现的MissingSchema报错
报错原因
requests.exceptions.MissingSchema报错的直接原因是你获取到的href属性值是相对路径URL,没有携带https协议头和必应域名前缀,requests无法直接请求这类地址。
另外你当前的逻辑还有两个隐藏问题:
- 该
href指向的是必应图片的详情页,不是原始图片的直链,就算补全域名请求也拿不到图片资源 - 计数器
i的初始化放在了循环内部,每次循环都会重置为0,最终只会保留最后一张爬取的图片,前面的都会被覆盖
修复步骤
- 解析必应页面
iusc类a标签的m属性(JSON格式),直接获取原始图片的完整直链murl,无需手动拼接路径 - 把计数器
i的初始化移到循环外部 - 新增目录存在性校验、异常捕获逻辑,避免脚本异常中断
- 补充请求头避免被必应反爬策略拦截
修复后的完整代码
from bs4 import BeautifulSoup import requests from PIL import Image from io import BytesIO import json import os # 提前创建保存图片的目录 save_dir = "./scraped_images/" if not os.path.exists(save_dir): os.makedirs(save_dir) search = input("Enter: ") params = {"q": search} url = "https://www.bing.com/images/search" # 加请求头避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } r = requests.get(url, params=params, headers=headers) soup = BeautifulSoup(r.text, "html.parser") links = soup.findAll("a", {"class": "iusc"}) # 计数器放在循环外部 i = 0 for item in links: try: # 解析m属性获取原始图片地址 m_data = json.loads(item.attrs["m"]) img_url = m_data["murl"] # 请求原始图片 img_obs = requests.get(img_url, headers=headers, timeout=10) img = Image.open(BytesIO(img_obs.content)) # 保存图片,补充后缀名更规范 img.save(f"{save_dir}{str(i)}.{img.format.lower()}", img.format) i += 1 except Exception as e: print(f"第{i}张图片爬取失败:{str(e)}") continue
内容的提问来源于stack exchange,提问作者Utkarsh A
相关产品推荐
相关产品推荐

