【问题标题】:How do I download a file served behind an html page using python?如何使用 python 下载在 html 页面后面提供的文件?
【发布时间】:2015-07-13 12:53:36
【问题描述】:

我正在尝试使用 python 从 Internet 下载文件。 我试过这个代码:

import urllib.requests
URL = 'http://www.mediafire.com/download/raju14e8aq6azbo/Getting+Started+with+MediaFire.pdf'
filename = "file.pdf"
urllib.request.urlretrieve(URL,filename)

和:

from urllib.request import urlopen
from shutil import copyfileobj

URL = 'http://www.mediafire.com/download/raju14e8aq6azbo/Getting+Started+with+MediaFire.pdf'
filename = "file.pdf"
with urlopen(URL) as in_stream, open(filename, 'wb') as out_file:
    copyfileobj(in_stream, out_file)

(我在What command to use instead of urllib.request.urlretrieve?找到了最后一个代码)

问题是这段代码下载的是一个 html 文档,而不是我需要的名为“MediaFire.pdf 入门”的 .pdf 文件! 我正在寻找一种方法来下载在 html 页面后面提供的文件。

有什么建议吗?

【问题讨论】:

  • this 会有所帮助
  • 您的 url 以 .pdf 结尾并且您使用 file.pdf 的文件名有点奇怪
  • 请定义损坏!是空的吗?它是否包含其他一些信息?用十六进制或文本编辑器查看内容可能是个好主意,看看里面可能有一个 HTML 错误页面。
  • 那是因为文件不是pdf文件。这是一个html文档。您可以使用 chrome/firefox/其他浏览器打开。您需要找到正确的下载链接。尝试在浏览器中使用“另存为” - 如果可行,则 python 代码将起作用
  • 我回答 AJK:我尝试了正确的 URL:mediafire.com/download/raju14e8aq6azbo/…,但问题是一样的!

标签: python file download


【解决方案1】:

这是因为您尝试下载的链接不是 pdf 文件。这是一个html文档。可以用chrome/firefox/其他浏览器打开。

您需要找到正确的下载链接。尝试在浏览器中使用“另存为”-如果可行,则 python 代码将起作用

仅仅因为 URL 以“.pdf”结尾并不意味着它真的是 pdf。 对于您的示例,正​​确的链接是 - http://download834.mediafire.com/dsq8ih5dubng/raju14e8aq6azbo/Getting+Started+with+MediaFire.pdf,如果您使用 ctrl+s 或 wget 或 curl,它实际上会下载文件。

【讨论】:

  • 我尝试了正确的 URL:mediafire.com/download/raju14e8aq6azbo/…,但问题是一样的!
  • 你能解释一下:“尝试在浏览器上使用‘另存为’吗?”
  • @Vinciuz 仍然不是正确的 URL,你能检查一下我上面提到的那个吗?另外,按我的意思保存 - 按键盘上的 ctrl+s 或右键单击屏幕上的任意位置并选择“另存为”
  • 另外,没有办法找到隐藏在 html 页面后面的 pdf - 我能想到的唯一方法是解析 html 文档并找到它......但这不是完整的证明和这可能是最后一个带有 .pdf 的链接。基本上,一般都找不到html页面后面的pdf :(
  • 对不起 AJK,在之前的评论中我写错了 URL。我用过:mediafire.com/download/raju14e8aq6azbo/…
【解决方案2】:

对不起,有时我是世界上最傻的人! JDK是对的,我总是用错误的URL,即使JDK说我要改URL,我也改用了另一个错误的URL!

所以

我将 JDK 的答案标记为正确答案,并在下面发布了我最终使用的代码:

import urllib2,fpformat

url = "http://download1063.mediafire.com/qjhujh1ajzwg/raju14e8aq6azbo/Getting+Started+with+MediaFire.pdf"

file_name = url.split('/')[-1]
u = urllib2.urlopen(url)
f = open(file_name, 'wb')
meta = u.info()
file_size = int(meta.getheaders("Content-Length")[0])
print "Downloading: %s Bytes: %s" % (file_name, file_size)
print ""

file_size_dl = 0
block_sz = int(fpformat.fix(file_size/110,0))
print block_sz

while True:
    buffer = u.read(block_sz)
    if not buffer:
        break
    file_size_dl += len(buffer)
    f.write(buffer)
    status = ( file_size_dl * 100 ) /  file_size
    print status , ' %  - ',file_size_dl,' byte su ',file_size,' byte'
f.close()
print " complete ! "

这不是最有用的代码,我正在编写一个更快更正确的代码,我会在完成后立即将其发布在下面!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2010-09-20
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2015-09-12
    相关资源
    最近更新 更多