经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
Python3使用requests模块实现显示下载进度的方法详解
来源:jb51  时间:2019/2/18 10:02:19  对本文有异议

本文实例讲述了Python3使用requests模块实现显示下载进度的方法。分享给大家供大家参考,具体如下:

一、配置request

1. 相关资料

请求关键参数:stream=True。默认情况下,当你进行网络请求后,响应体会立即被下载。你可以通过 stream 参数覆盖这个行为,推迟下载响应体直到访问 Response.content 属性。

  1. tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'
  2. r = requests.get(tarball_url, stream=True)
  3.  

此时仅有响应头被下载下来了,连接保持打开状态,因此允许我们根据条件获取内容:

  1. if int(r.headers['content-length']) < TOO_LONG:
  2. content = r.content
  3. ...
  4.  

进一步使用 Response.iter_contentResponse.iter_lines 方法来控制工作流,或者以 Response.raw 从底层urllib3的 urllib3.HTTPResponse

  1. from contextlib import closing
  2. with closing(requests.get('http://httpbin.org/get', stream=True)) as r:
  3. # Do things with the response here.
  4.  

保持活动状态(持久连接)

归功于urllib3,同一会话内的持久连接是完全自动处理的,同一会话内发出的任何请求都会自动复用恰当的连接!

注意:只有当响应体的所有数据被读取完毕时,连接才会被释放到连接池;所以确保将 stream 设置为 False 或读取 Response 对象的 content 属性。

2. 下载文件并显示进度条

  1. with closing(requests.get(self.url(), stream=True)) as response:
  2. chunk_size = 1024 # 单次请求最大值
  3. content_size = int(response.headers['content-length']) # 内容体总大小
  4. progress = ProgressBar(self.file_name(), total=content_size,
  5. unit="KB", chunk_size=chunk_size, run_status="正在下载", fin_status="下载完成")
  6. with open(file_name, "wb") as file:
  7. for data in response.iter_content(chunk_size=chunk_size):
  8. file.write(data)
  9. progress.refresh(count=len(data))
  10.  

二、进度条类的实现

在Python3中,print()方法的默认结束符(end='\n'),当调用完之后,光标自动切换到下一行,此时就不能更新原有输出。

将结束符改为“\r”,输出完成之后,光标会回到行首,并不换行。此时再次调用print()方法,就会更新这一行输出了。

结束符也可以使用“\d”,为退格符,光标回退一格,可以使用多个,按需求回退。

在结束这一行输出时,将结束符改回“\n”或者不指定使用默认

下面是一个格式化的进度条显示模块。代码如下:

  1. class ProgressBar(object):
  2. def __init__(self, title,
  3. count=0.0,
  4. run_status=None,
  5. fin_status=None,
  6. total=100.0,
  7. unit='', sep='/',
  8. chunk_size=1.0):
  9. super(ProgressBar, self).__init__()
  10. self.info = "【%s】%s %.2f %s %s %.2f %s"
  11. self.title = title
  12. self.total = total
  13. self.count = count
  14. self.chunk_size = chunk_size
  15. self.status = run_status or ""
  16. self.fin_status = fin_status or " " * len(self.status)
  17. self.unit = unit
  18. self.seq = sep
  19. def __get_info(self):
  20. # 【名称】状态 进度 单位 分割线 总数 单位
  21. _info = self.info % (self.title, self.status,
  22. self.count/self.chunk_size, self.unit, self.seq, self.total/self.chunk_size, self.unit)
  23. return _info
  24. def refresh(self, count=1, status=None):
  25. self.count += count
  26. # if status is not None:
  27. self.status = status or self.status
  28. end_str = "\r"
  29. if self.count >= self.total:
  30. end_str = '\n'
  31. self.status = status or self.fin_status
  32. print(self.__get_info(), end=end_str)
  33.  

三、参考资料

http://cn.python-requests.org/en/latest/user/advanced.html

更多关于Python相关内容感兴趣的读者可查看jb51专题:《Python函数使用技巧总结》、《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程

希望本文所述对大家Python程序设计有所帮助。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号