【问题标题】:urllib.request.urlretrieve not downloading files over HTTPSurllib.request.urlretrieve 不通过 HTTPS 下载文件
【发布时间】:2016-10-02 13:49:25
【问题描述】:

以下 URL 是下载文本文件的下载链接。 如果我将 URL 粘贴到 Firefox 中,它会下载实际内容,即文本文件。但是,当使用 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])

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

【问题讨论】:

    标签: python python-3.x urllib


    【解决方案1】:

    首先,您应该导入 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 下载/重定向: 如果是 javascript 或 php 脚本下载,使用subprocess 在浏览器中打开链接实际上不是动态代码,因为您需要指定浏览器的路径,相反,您可以使用预先存在的模块webbrowser,它会自动检测系统中的默认浏览器并打开网址。
    import webbrowser
    url = ...
    webbrowser.open(url, autoraise=True) # normal
    webbrowser.open_new(url)             # new window
    webbrowser.open_new_tab(url)         # new tab
    

    【讨论】:

    • 我忘了提到这是一个“https”请求,我尝试了你的方法,但我仍然得到相同的文件,其中包含 html 源代码,而不是实际的文本文件
    • 我不明白为什么它不起作用,当我得到 html 源代码时,我试图在网络浏览器上打开它,它给了我网站登录页面,所以我想出了不同的相反,subprocess.Popen(["C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", down_link]) 现在它会下载文本文件并将其保存在下载中,然后我会处理该文件。
    • 你的两种方法我都遇到了同样的问题,当我将 URL 粘贴到浏览器中时,它正在下载它没有任何问题,我怀疑这是某种 cookie 问题。
    • 如果您能提供您尝试下载的文件类型或链接将会很有帮助,这可能有助于获得更好的答案。
    • 它不是 cookie 的东西,这可能是出于某种安全目的的 javascript 或 php 代码,你是对的 urlretrieveurlopen 在这种情况下不会工作,因为它会给你原始的来自该特定网页的数据。使用子进程可能不是一个好主意,因为它不能在其他系统上正常工作。(路径或浏览器可能不同),你可以阅读源代码做一些regex 以使用urllib 下载文件,但如果它为你工作那很好。但是,如果您需要 regexurllib 版本,那么只需评论可能会有很大帮助的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多