dengdengda 发表于 2021-8-3 10:23

python 下载读取content-length问题

    def download(name,interval=0.5):
      def MB(byte):
         return byte / 1024 / 1024
      print(name)
      res = requests.get(link_sec,params=params,headers=headers,stream=True,allow_redirects=True)

      file_size = int(res.headers['Content-Length'])
      print(file_size)# 文件大小 Byte
      f = open(name, 'wb')
      down_size = 0# 已下载字节数
      old_down_size = 0# 上一次已下载字节数
      time_ = time.time()
      for chunk in res.iter_content(chunk_size=512):
            if chunk:
                f.write(chunk)
                down_size += len(chunk)
                if time.time() - time_ > interval:
                # rate = down_size / file_size * 100# 进度0.01%
                  speed = (down_size - old_down_size) / interval# 速率 0.01B/s
               
                  old_down_size = down_size
                  time_ = time.time()
                  
                  print_params =
                  print('\r{:.1f}MB/s - {:.1f}MB,共 {:.1f}MB,还剩 {:.0f} 秒   '.format(*print_params), end='')
               
      f.close()
      print('\r下载成功'+' '*50)
   
    download('qq.zip')
   


用这个函数下载文件,有的文件会因为读不到content-length,报错
file_size = int(res.headers['Content-Length'])
File "F:\ProgramData\Anaconda3\lib\site-packages\requests\structures.py", line 54, in __getitem__
return self._store

KeyError: 'content-length'

但文件是存在并可以下载的
有没有办法解决如果读取失败仍然下载并且能够显示下载进度或者速度随便一项,不然黑乎乎的等的心理很焦急的感觉

谢谢各位大神

ciker_li 发表于 2021-8-3 10:29

file_size = int(res.headers['Content-Length'])
在这里用try试试

细水流长 发表于 2021-8-3 10:29

dengdengda 发表于 2021-8-3 10:38

ciker_li 发表于 2021-8-3 10:29
file_size = int(res.headers['Content-Length'])
在这里用try试试

try 的话后面有引用file_size,还是不合适呢

7593454 发表于 2021-8-3 10:44

添加 headers 参数:“Accept-Encoding”: “identity”

dengdengda 发表于 2021-8-3 10:58

链接失效很快,需要带header提交,header还在上一步post的返回里面...

dengdengda 发表于 2021-8-3 10:59

细水流长 发表于 2021-8-3 10:29
给个下载测试链接

链接失效很快,需要带header提交,header还在上一步post的返回里面...

dengdengda 发表于 2021-8-3 11:10

7593454 发表于 2021-8-3 10:44
添加 headers 参数:“Accept-Encoding”: “identity”

亲,还是不行呢

subney 发表于 2021-8-3 12:03

特意百度stream参数的用法

nonosky11 发表于 2021-8-3 12:08

谢谢分享
页: [1] 2
查看完整版本: python 下载读取content-length问题