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
下面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