如何提取并存储requests请求获取的网页中的图片资源
实现方案
你当前的代码仅完成了随机生成prnt.sc链接、请求页面HTML的步骤,还需要补充HTML解析、图片提取、本地存储的逻辑,具体实现如下:
前置依赖安装
需要先安装HTML解析库:
pip install beautifulsoup4 lxml
完整可运行代码
import requests import string import random from bs4 import BeautifulSoup import os # 创建存储图片的文件夹 if not os.path.exists("prnt_sc_imgs"): os.mkdir("prnt_sc_imgs") # 必须添加请求头,否则会被prnt.sc反爬拦截 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" } def id_generator(size=6, chars=string.ascii_lowercase + string.digits): return ''.join(random.choice(chars) for _ in range(size)) for i in range(50): link_id = id_generator() page_url = f"https://prnt.sc/{link_id}" print(f"正在处理:{page_url}") try: # 请求页面HTML page_resp = requests.get(page_url, headers=HEADERS, timeout=10) page_resp.raise_for_status() # 状态码异常直接抛出错误跳过 # 解析HTML提取图片链接 soup = BeautifulSoup(page_resp.text, "lxml") img_tag = soup.find("img", id="screenshot-image") if not img_tag or not img_tag.get("src"): print(f"未找到有效图片,跳过:{page_url}") continue img_url = img_tag["src"] # 处理协议缺失的情况 if img_url.startswith("//"): img_url = f"https:{img_url}" # 请求图片资源 img_resp = requests.get(img_url, headers=HEADERS, timeout=10) img_resp.raise_for_status() # 保存到本地,用随机id做文件名,保留原后缀 img_suffix = img_url.split(".")[-1].split("?")[0].lower() if img_suffix not in ["jpg", "jpeg", "png", "gif", "webp"]: img_suffix = "png" # 无有效后缀默认存为png save_path = f"prnt_sc_imgs/{link_id}.{img_suffix}" with open(save_path, "wb") as f: f.write(img_resp.content) print(f"图片保存成功:{save_path}") except Exception as e: print(f"处理失败:{page_url},错误信息:{str(e)}") continue
关键逻辑说明
- 反爬处理:prnt.sc对无User-Agent的请求会直接拦截,所以所有请求都必须携带浏览器标识的请求头
- 图片提取:prnt.sc的页面结构中,实际截图固定存放在id为
screenshot-image的img标签的src属性中,不需要复杂的规则匹配 - 异常处理:随机生成的id大概率对应无效页面,加上网络波动的影响,添加异常捕获可以避免程序中途崩溃
- 路径处理:自动创建存储文件夹,避免本地路径不存在导致的写入错误
内容的提问来源于stack exchange,提问作者dddictionary
相关产品推荐
相关产品推荐

