urllib.request.urlretrieve 不通过 HTTPS 下载文件

urllib.request.urlretrieve not downloading files over HTTPS

下面URL是下载link下载一个文本文件。 如果我在 Firefox 中粘贴 URL,它会下载实际内容,即文本文件。但是,当使用 urlretrieve 时,它会给我一些 html 源代码文件。

>>> import urllib
>>> down_link='URL' #URL is a ***HTTPS*** link to download .txt file
>>> file=urllib.request.urlretrieve(down_link)

这是我得到的输出:

>>>
('C:\Users\rakesh.j.kulkarni\AppData\Local\Temp\tmps7559wgi'
http.client.HTTPMessage object at 0x03A3C610>)

当打开文件时,我得到 html 源文件,当用浏览器打开它时,它是同一网页的登录表单,

所以我不得不想出替代过程来暂时做同样的事情,直到问题得到解决

subprocess.Popen(["C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", down_link])

然后我去下载并处理文件。

首先,您应该导入 urllib.request,而不仅仅是 urllib(在 Py3 中)。
并且您正在将对象分配给一个变量,因此它给您对象实例作为输出。 没什么问题,只是为了给您一个快速修复,请尝试执行以下操作:

In [1]: import urllib.request

In [2]: down_link = "http://vignette3.wikia.nocookie.net/shipoffools/images/4/42/Surprised_Luffy.jpg/revision/latest?cb=20120921134043"

In [3]: path_to_save = "../luffy.jpg"

In [4]: urllib.request.urlretrieve(down_link, path_to_save)
Out[4]: ('../luffy.jpg', <http.client.HTTPMessage at 0x47f6af0>)

这会很好地工作,将图像保存在您想要的位置。 如果您不指定 path_to_save,那也没关系,因为无论如何它都会下载,路径将是 tmp 目录,在您的情况下,它将是 C:\Users\rakesh.j.kulkarni\AppData\Local\Temp\ 文件夹。

https 相关错误或任何其他问题的情况下,有一种更简洁的方法,即使用 urlopen 读取文件并将其保存在计算机上的文件中:

In [5]: import urllib.request as req

In [6]: down_link = "https://vignette3.wikia.nocookie.net/shipoffools/images/4/42/
   ...: Surprised_Luffy.jpg/revision/latest?cb=20120921134043"

In [7]: fname = "../luffy.jpg"

In [8]: with req.urlopen(down_link) as d, open(fname, "wb") as opfile:
   ...:     data = d.read()
   ...:     opfile.write(data)
   ...:

注意:此方法可能需要一些时间,但对于普通的小文件来说效果很好。


javascript download/redirect: 如果下载 javascript 或 php 脚本,使用 subprocess 打开 link in browser 实际上不会是动态代码,因为你需要指定浏览器的路径,而是可以使用一个预先存在的模块 webbrowser,它会自动检测系统中的默认浏览器并打开url.

import webbrowser
url = ...
webbrowser.open(url, autoraise=True) # normal
webbrowser.open_new(url)             # new window
webbrowser.open_new_tab(url)         # new tab