Urllib缓存异常:重复下载Unsplash随机图片问题求助
解决Unsplash随机图片重复下载的问题
嘿,我来帮你搞定这个问题!你猜的方向有点偏差——问题不是urllib的本地缓存,而是Unsplash的source.unsplash.com/random接口会对重复的无参数请求返回相同内容(这是服务器端的缓存策略导致的)。哪怕你调用urllib.urlcleanup(),也没法绕过服务器端的缓存逻辑。
快速解决:给请求URL加唯一参数
最简单的办法就是每次请求时在URL后面加一个唯一的标识(比如时间戳、随机数),让服务器认为这是全新的请求,从而返回不同的随机图片。
修改后的代码如下:
import urllib import time # 引入时间模块生成唯一时间戳 num = 4 for i in range(1, num + 1): print("Downloading image #" + str(i) + "...") # 给URL添加时间戳参数,确保每次请求的URL唯一 unique_url = "https://source.unsplash.com/random?ts=" + str(time.time()) urllib.urlretrieve(unique_url, "image" + str(i) + ".jpg")
为什么原来的代码会重复下载?
当你反复请求https://source.unsplash.com/random这个一模一样的URL时,Unsplash的服务器会基于缓存策略返回之前的图片,目的是减少重复请求的服务器负载。而urllib.urlcleanup()只是清理urllib在本地生成的临时缓存文件,对服务器端的缓存完全起不到作用。
其他可选方案
如果你不想用时间戳,也可以用random模块生成随机数来做唯一标识:
import urllib import random num = 4 for i in range(1, num + 1): print("Downloading image #" + str(i) + "...") # 用随机数作为唯一参数 unique_url = f"https://source.unsplash.com/random?rand={random.randint(1, 1000000)}" urllib.urlretrieve(unique_url, f"image{i}.jpg")
另外,如果你的Python版本是3.x,更推荐使用urllib.request模块(因为旧的urllib在3.x中是拆分后的子模块),不过核心解决逻辑还是给URL添加唯一参数。
内容的提问来源于stack exchange,提问作者kognise
相关产品推荐
相关产品推荐

