Python使用Requests爬取图片无报错但未生成保存文件问题
批量下载图片无文件生成问题修复
你的代码无报错但不生成文件,是几个常见的爬取细节没处理到位,逐个对应修改即可:
- URL拼接错误:手动拼接图片地址时重复加了
content/路径前缀。目标站点img标签的src属性本身已经带了该前缀,重复拼接后请求的是不存在的地址,服务器返回404错误页数据,不是有效图片。 - 无校验逻辑:代码既没判断HTTP请求是否成功,也没检查DOM元素是否匹配到。如果目标页面元素ID变更、网络请求失败,代码会静默跳过,不会触发报错,看起来跑完全程其实根本没执行到写文件的步骤。
- 文件路径不明确:VS Code运行Python脚本时默认工作目录是当前打开的工作区根目录,不是脚本存放的文件夹,就算文件写入成功,你也可能找错位置以为没生成。
- UA版本过旧:你用的是十几年前的Edge12版本UA,部分站点会直接拦截这类异常请求,返回反爬页面。
修复后可直接运行的代码
import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin # 替换为新版本浏览器UA,避免被拦截 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"} # 固定保存路径为脚本所在文件夹,避免找不着文件 SAVE_PATH = os.path.dirname(os.path.abspath(__file__)) def get_page(link): resp = requests.get(url=link, headers=HEADERS, timeout=10) # 请求失败直接抛出异常,不会静默跑错 resp.raise_for_status() return BeautifulSoup(resp.content, "lxml") if __name__ == "__main__": target_url = "https://bisesargodha.edu.pk/content/ViewSeqImges.aspx?SubjectId=760&SeqNameAnsSubj=Sequence1" page_soup = get_page(target_url) img_table = page_soup.find('table', attrs={'id':'ContentPlaceHolder1_Table1'}) if not img_table: raise RuntimeError("未找到目标图片容器,检查页面结构是否变更") img_list = img_table.find_all('img') print(f"共检测到{len(img_list)}张图片,开始下载") for index, img_tag in enumerate(img_list, start=1): # 自动拼接完整图片地址,不用手动处理路径前缀 img_url = urljoin(target_url, img_tag['src']) img_resp = requests.get(img_url, headers=HEADERS, timeout=15) img_resp.raise_for_status() # 校验返回内容是否为图片,避免把错误页存成jpg if 'image' not in img_resp.headers.get('Content-Type', ''): print(f"第{index}张资源非图片,跳过,地址:{img_url}") continue img_save_full_path = os.path.join(SAVE_PATH, f"img-{index}.jpg") with open(img_save_full_path, "wb") as f: f.write(img_resp.content) print(f"已完成第{index}张图片下载,保存路径:{img_save_full_path}")
运行时控制台会打印每张图片的保存路径,直接按路径打开文件夹就能看到下载好的文件,不会出现找不到文件的问题。所有网络请求加了超时和状态校验,一旦请求失败会直接抛出明确错误,不会静默无响应。
内容的提问来源于stack exchange,提问作者Aly
相关产品推荐
相关产品推荐

