基于Python的Image Scraper爬取Bing图片时未下载图片、退出码为0,如何修复?
代码问题定位
- 选择器完全失配:当前Bing图片搜索的DOM结构经过多轮迭代,原代码匹配的
<a class="thumb">标签早已不存在,soup.findAll()返回的是空列表,后续循环逻辑完全不会执行。程序走完所有已定义的逻辑后自然退出,既不会报错,也不会产生任何下载动作。 - 图片直链获取逻辑错误:即使匹配到对应a标签,其
href属性存储的是Bing站内中转跳转链接,并非图片资源直链,直接请求会拿到目标网页的HTML内容,而非图片二进制流。 - 本地存储逻辑缺失:代码直接向
./scraped_images/路径写入文件,但没有提前判断、创建该目录,一旦抓取逻辑生效,保存阶段会触发目录不存在的报错。 - 基础反爬规避缺失:请求未携带合法的浏览器User-Agent,会被Bing的反爬机制拦截,返回无有效搜索结果的拦截页面,即使修正选择器也拿不到真实图片列表。
- 协议不匹配:原代码使用
http协议请求Bing接口,当前Bing已强制全站跳转https,虽然requests会默认跟进跳转,但额外的重定向流程会增加被反爬拦截的概率。
对应修复方案
- 替换为匹配Bing最新DOM结构的选择器:当前图片元信息存放在
class="iusc"的a标签的m属性中,该属性为JSON格式字符串,解析后可直接获取真实图片直链、图片名称。 - 请求时携带标准浏览器请求头,绕过基础反爬拦截。
- 启动时自动创建本地存储目录,避免保存时报错。
- 增加简单的异常捕获与超时设置,避免单张图片请求失败、或网络无响应导致整个程序崩溃。
修复后可运行的参考代码
from bs4 import BeautifulSoup import requests from PIL import Image from io import BytesIO import os import json # 配置本地存储目录,自动创建不存在的目录 SAVE_DIR = "./scraped_images" os.makedirs(SAVE_DIR, exist_ok=True) # 配置浏览器请求头,规避基础反爬 REQUEST_HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } search = input("Search for: ") request_params = {"q": search} response = requests.get( "https://www.bing.com/images/search", params=request_params, headers=REQUEST_HEADERS ) soup = BeautifulSoup(response.text, "html.parser") # 匹配最新页面结构下的图片信息标签 img_info_tags = soup.findAll("a", {"class": "iusc"}) for tag in img_info_tags: try: # 解析JSON格式的图片元信息,获取真实图片直链 img_metadata = json.loads(tag.attrs["m"]) img_direct_url = img_metadata["murl"] # 从URL中提取安全的图片文件名 img_file_name = img_direct_url.split("/")[-1].split("?")[0] # 请求图片资源,设置超时避免程序卡死 img_response = requests.get(img_direct_url, headers=REQUEST_HEADERS, timeout=10) # 打开图片流并保存到本地 img = Image.open(BytesIO(img_response.content)) save_path = os.path.join(SAVE_DIR, img_file_name) img.save(save_path, img.format) except Exception: # 单张图片请求/解析失败直接跳过,不中断整体流程 continue
内容的提问来源于stack exchange,提问作者OOF
相关产品推荐
相关产品推荐

