在 Python 中下载带有“urllib.request.urlretrieve”的图像失败

Posted

技术标签:

【中文标题】在 Python 中下载带有“urllib.request.urlretrieve”的图像失败【英文标题】:failing at downloading an image with "urllib.request.urlretrieve" in Python 【发布时间】:2019-03-14 00:18:55 【问题描述】:

如果可能的话也指出解决方案

我的代码:

import random
import urllib.request

def download_web_image(url):
    name = random.randrange(1,1000)
    fullname = str(name) + ".jpg"
    urllib.request.urlretrieve(url, fullname)

download_web_image("https://upload.wikimedia.org/wikipedia/commons/b/b4/JPEG_example_JPG_RIP_100.jpg")

错误:

Traceback(最近一次调用最后一次): 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py”,第 1318 行,在 do_open encode_chunked=req.has_header('传输编码')) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py”,第 1239 行,在请求中 self._send_request(方法、url、正文、标头、encode_chunked) _send_request 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py”,第 1285 行 self.endheaders(正文,encode_chunked=encode_chunked) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py”,第 1234 行,在 endheaders self._send_output(message_body, encode_chunked=encode_chunked) _send_output 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py”,第 1026 行 自我发送(味精) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py”,第 964 行,在发送中 self.connect() 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py”,第 1400 行,在连接中 服务器主机名=服务器主机名) wrap_socket 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py”,第 407 行 _context=self,_session=会话) init 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py”,第 814 行 self.do_handshake() 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py”,第 1068 行,在 do_handshake self._sslobj.do_handshake() 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py”,第 689 行,在 do_handshake self._sslobj.do_handshake() ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:777)

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次): 文件“/Users/macintosh/PycharmProjects/Claculatorer/Bucky.py”,第 9 行,在 download_web_image("https://upload.wikimedia.org/wikipedia/commons/b/b4/JPEG_example_JPG_RIP_100.jpg") 文件“/Users/macintosh/PycharmProjects/Claculatorer/Bucky.py”,第 7 行,在 download_web_image urllib.request.urlretrieve(url, 全名) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py”,第 248 行,在 urlretrieve 使用 contextlib.closing(urlopen(url, data)) 作为 fp: 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py”,第 223 行,在 urlopen 返回 opener.open(url, 数据, 超时) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py”,第 526 行,打开 响应 = self._open(请求,数据) _open 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py”,第 544 行 '_open',请求) _call_chain 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py”,第 504 行 结果 = 函数(*args) https_open 中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py”,第 1361 行 上下文=self._context,check_hostname=self._check_hostname) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py”,第 1320 行,在 do_open 引发 URLError(err) urllib.error.URLError:

进程以退出代码 1 结束

【问题讨论】:

您是否尝试使用我回答中的代码? 我做了,但它没有工作它仍然给出了这个错误 这很奇怪......你是如何运行代码的? @MosheSlavin 与 PyCharm,我创建了一个 python 文件并点击运行,我认为这与 HTTPS 的网站有关,如果图像来自 HTTP 网页,它将被下载而不任何问题,我不明白为什么 SSL 会破坏它 我可以建议您改用 request... 这样您就可以添加 verify=False 我将添加到我的答案中 【参考方案1】:

试试这个对我有用:

import random
import urllib.request

def download_web_image(url):
    name = random.randrange(1,1000)
    fullname = str(name) + ".jpg"
    urllib.request.urlretrieve(url, fullname)

print(download_web_image("https://upload.wikimedia.org/wikipedia/commons/b/b4/JPEG_example_JPG_RIP_100.jpg"))

这输出:None 但没关系!

文件与脚本保存在同一目录中。

这是我运行脚本的方式:

【讨论】:

【参考方案2】:

你只需要使用命令:

 /Applications/Python\ 3.6/Install\ Certificates.command

【讨论】:

我认为一些上下文会对这个答案有所帮助。为什么这条命令能解决问题?

以上是关于在 Python 中下载带有“urllib.request.urlretrieve”的图像失败的主要内容,如果未能解决你的问题,请参考以下文章

urllib和requsts的简单使用

初学python 遇到的坑

在 Python 中下载带有“urllib.request.urlretrieve”的图像失败

使用Python编写的带有下载进度的某页面视频下载器

带有 python 入口点的 Google Cloud Build gsutil

如何使用 PlayWright (python) 下载嵌入式 PDF?