如何用Python的requests库下载网站当前显示的随机生成图片
解决Requests下载图片与网页描述不匹配的问题
问题场景
我正在把Selenium Python代码改成用Requests库优化操作,目标网站逻辑很简单,但每次加载页面会随机生成对应描述的图片(比如显示“这是一只可爱的狗”时,配套展示狗狗图片)。图片的HTML标签示例如下:
<span class = "animals"> <img id = "img" src = "classes / image.php? s = 2 & ts = 16669054016175" width = "350" height = "350"> </span>
之前用Selenium时,通过element.screenshot()能正常保存对应描述和图片,但换成Requests后,明明能从网页源码里拿到正确的“这是一只狗”描述,下载的却是猫咪图片。原Requests代码示例:
import requests # login on website with headers. #..search correct url to actual photo #... save that url from source to url variable url = "https://www.link.com/classes/image.php?s=2&ts=16669054016175" with open ('name.png', 'wb') as f: f.write (requests.get (url) .content)
现在想实现:无需Selenium和截图方法,用Requests下载当前网页显示的对应描述和图片。
解决方案
可以实现,核心是维持会话一致性和动态获取图片参数,具体步骤如下:
1. 使用Requests会话保持上下文
Requests默认每次get/post都是独立请求,服务器无法关联你的会话状态,会返回新的随机图片。必须用requests.Session()来维持和浏览器一致的会话,确保服务器返回对应你当前页面的图片。
2. 动态提取最新的图片URL
图片URL里的ts参数是动态生成的(可能是时间戳或会话标识),静态复用旧参数会导致请求到新的随机图片。每次请求页面后,要从页面源码里提取最新的src属性,拼接成有效URL。
3. 同步请求顺序
先请求页面拿到描述和图片URL,再用同一个会话请求图片,避免间隔太久导致服务器生成新的会话实例。
修改后的代码示例
import requests from bs4 import BeautifulSoup # 初始化会话,维持登录状态和会话上下文 session = requests.Session() # 执行登录逻辑(替换成你的实际登录代码) # login_data = {"username": "your_user", "password": "your_pwd"} # session.post("https://www.link.com/login", data=login_data, headers={"User-Agent": "Mozilla/5.0"}) # 请求目标页面,获取描述和图片URL page_url = "https://www.link.com/your-target-page" page_response = session.get(page_url, headers={"User-Agent": "Mozilla/5.0"}) # 解析页面,提取描述和图片src soup = BeautifulSoup(page_response.text, "html.parser") # 提取描述(根据实际页面结构调整选择器) description = soup.find("xxx").text # 替换成对应描述元素的选择器 # 提取图片src并处理无效空格 img_src = soup.find("img", id="img")["src"].replace(" ", "") # 拼接完整图片URL(如果src是相对路径) full_img_url = f"https://www.link.com{img_src}" # 用同一个会话下载匹配的图片 img_response = session.get(full_img_url) with open(f"{description.strip()}.png", "wb") as f: f.write(img_response.content)
关键说明
- 会话
session贯穿整个流程,确保服务器识别你的请求属于同一个会话,返回对应图片。 - 必须动态提取
ts参数,不能复用旧URL,因为每个页面实例的ts都是唯一绑定的。 - 原图片
src里的空格(比如classes / image.php)会导致URL无效,必须去掉。
内容的提问来源于stack exchange,提问作者Samarker
相关产品推荐
相关产品推荐

