Python3使用urllib.request与random实现图片下载的代码问题求助
代码问题排查
- 传递给
urlretrieve的第一个URL参数没有加引号包裹,Python中字符串必须使用单/双引号标识,直接写链接会触发语法错误 - 自定义的
image_url末尾多拼接了多余的.jpg后缀,原链接的查询参数部分不需要额外加后缀,错误的URL会导致请求404 image_url定义行和后面的下载代码没有换行/分号分隔,属于语法错误- 导入random模块时多写了括号,导入模块语法为
import 模块名,不需要加括号 - 没有实现从响应头提取正确图片后缀的逻辑,固定后缀不符合需求
- 多余的文本模式打开图片操作:图片是二进制文件,就算要读取也需要用
rb模式,本场景下载后不需要额外打开文件 - 最后
print(4)是硬编码输出,不符合输出随机文件名的需求
正确实现代码
代码同时支持两种需求:自动生成1-1000随机文件名+匹配正确后缀,也可切换为固定保存为4.jpg的模式:
import urllib.request import random # 测试用图片链接 image_url = "https://images.theconversation.com/files/377569/original/file-20210107-17-q20ja9.jpg?ixlib=rb-1.1.0&rect=278%2C340%2C4644%2C3098&q=45&auto=format&w=926&fit=clip" # 方法1:生成随机文件名+自动匹配后缀实现 # 先获取响应头提取图片格式 _, headers = urllib.request.urlretrieve(image_url) content_type = headers.get("Content-Type") # 从content-type中提取后缀,比如image/jpeg对应jpg,image/png对应png suffix = content_type.split("/")[-1] # 兼容部分特殊格式,比如jpeg统一改为常用的jpg if suffix == "jpeg": suffix = "jpg" # 生成1-1000的随机文件名 file_name = f"{random.randint(1, 1000)}.{suffix}" # 下载保存 urllib.request.urlretrieve(image_url, filename=file_name) print(f"图片下载完成,保存为:{file_name}") # 方法2:指定固定保存为4.jpg,注释掉方法1打开下面代码即可 # urllib.request.urlretrieve(image_url, filename="4.jpg") # print("图片下载完成,保存为:4.jpg")
运行后图片会保存在当前脚本的同级目录下,确保网络正常即可正常运行。
内容的提问来源于stack exchange,提问作者EGL codes
相关产品推荐
相关产品推荐

