【问题标题】:How to prevent downloading an empty pdf file while using get and requests in Python?在 Python 中使用 get 和 requests 时如何防止下载空的 pdf 文件?
【发布时间】:2020-07-11 07:57:03
【问题描述】:

我正在使用 Beautiful Soup 抓取一个可以从 link 访问的网站。我们的想法是使用get 模块下载所有包含字符串.pdfhref

以下代码演示了该过程并按预期工作:

filename = 'new_name.pdf'
url_to_download_pdf='https://bradscholars.brad.ac.uk/https://www.brad.ac.uk/library/additional-help/bradford-scholars-faqs/digital_preservation_policy.pdf'
with open(filename, 'wb') as f:
    f.write(requests.get(url_to_download_pdf).content)

但是,在某些情况下,上面给出的 URL(即变量 url_to_download_pdf)直接指向 Page not found 页面。结果,下载了一个无法使用且无法阅读的 pdf。

在 Windows 中使用 pdf 阅读器 打开文件会出现以下警告

我很好奇是否有任何方法可以避免访问和下载无效的pdf 文件?

【问题讨论】:

  • 你可以使用if response.status_code == 404,如果为真则通过

标签: python pdf get python-requests


【解决方案1】:

而不是直接访问文件的内容 f.write(requests.get(url_to_download_pdf).content)

可以先检查请求的状态,如果是有效请求,则只保存到文件。

filename = 'new_name.pdf'
url_to_download_pdf='https://bradscholars.brad.ac.uk/https://www.brad.ac.uk/library/additional-help/bradford-scholars-faqs/digital_preservation_policy.pdf'
response = requests.get(url_to_download_pdf)
if(response.status_code != 404):
    with open(filename, 'wb') as f:
        f.write(response.content)

【讨论】:

    【解决方案2】:

    您必须验证您请求的文件是否已经存在。如果文件存在,则请求的响应码将为200。所以这里有一个如何做到这一点的例子:

    filename = 'new_name.pdf'
    url_to_download_pdf='https://bradscholars.brad.ac.uk/https://www.brad.ac.uk/library/additional-help/bradford-scholars-faqs/digital_preservation_policy.pdf'
    with open(filename, 'wb') as f:
        response = requests.get(url_to_download_pdf)
        if response.status_code == 200:
            f.write(response.content)
        else:
            print("Error, the file doesn't exist")
    

    【讨论】:

      【解决方案3】:

      感谢用户的建议。

      根据@Nicolas,

      仅当响应返回 200 时才保存为 pdf

      if response.status_code == 200:
      

      在以前的版本中,无论响应如何,都会创建一个空文件,因为在检查 status_code 之前创建了以下with open(filename, 'wb') as f:

      为了缓解这种情况,只有在条件集符合预期时才应启动with open(filename, 'wb') as f:

      完整的代码如下:

      import requests
      filename = 'new_name.pdf'
      url_to_download_pdf='https://bradscholars.brad.ac.uk/https://www.brad.ac.uk/library/additional-help/bradford-scholars-faqs/digital_preservation_policy.pdf'
      my_req = requests.get(url_to_download_pdf)
      if my_req.status_code == 200:
          with open(filename, 'wb') as f:
              f.write(my_req.content)
      

      【讨论】:

        猜你喜欢
        • 2016-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-04
        • 2023-04-02
        • 1970-01-01
        • 2018-11-13
        • 1970-01-01
        相关资源
        最近更新 更多