ホームページ  >  に質問  >  本文

download - python requests 下载大文件不完整

目前我有一个脚本, 从帝联的 CDN 外链获取一下文件作为备份.
使用的是

Python 2.7.10
requests 2.8.1 

目前碰到一个情况, 使用 requests 下载大文件的时候会出现下载文件不完整的情况, 出现的概率非常大, 应该不会是网络原因导致的. 相关代码概括如下:

requests.adapters.DEFAULT_RETRIES = 5
response = requests.get(url, stream=True)
status = response.status_code
if status == 200:
    total_size = int(response.headers['Content-Length'])
    with open('xxx', 'wb') as of:
        for chunk in response.iter_content(chunk_size=102400):
            if chunk:
                of.write(chunk)
    

下载完毕后我会使用如下方式和上面的 total_size 进行对比

with open('xxx', 'r') as f:
    if isinstance(f, file):
        length = os.fstat(f.fileno()).st_size
        
if total_size == length:
    True
else:
    False
    

代码逻辑如上. 但是对于 100M 以上的文件, 几乎都是保存在本地的文件和获取的响应头里面的 content-length 不一致.
是我 requests 的用法不对吗? 还是有其他更好的办法可以保证文件能完整的下载呢?

阿神阿神2742日前910

全員に返信(3)返信します

  • P粉451270645

    P粉4512706452022-04-12 16:57:52

    リクエストの不完全なダウンロードの問題を解決できる記事を見つけました: https://www.jianshu.com/p/f92704c42b49

    主にresponse.raw.tell()とresponse .headersを使用します.get('コンテンツの長さ')

    返事
    0
  • 黄舟

    黄舟2017-04-17 17:10:56

    ネットワークは本質的に不安定です。大きなファイルをダウンロードするときにネットワークが中断されるのは正常です。これは、ネットワークに問題がある可能性があります。

    解決策は、ダウンロード後にサイズを比較し、不完全な場合はダウンロードを再開することです。参考:Pythonでブレークポイントレジュームダウンロードソフトウェアを書く

    もう 1 つの方法は、ダウンロードの再開をサポートするcurl などのダウンロード ツールを呼び出すことです。

    返事
    0
  • 黄舟

    黄舟2017-04-17 17:10:56

    投稿者はこの問題を解決しましたか? 私も同じ問題に遭遇しましたが、エラーは報告されず、いくつかの M ファイルが完全にダウンロードされませんでした。

    返事
    0
  • キャンセル返事