首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 拆分与合并:如何快速地批量处理内容相似的Excel?
02|善用Python扩展库:如何批量合并多个文档?
03|图片转文字:如何提高识别准确率?
04 | 函数与字典:如何实现多次替换
05 | 图像处理库:如何实现长图拼接?
06 | jieba分词:如何基于感情色彩进行单词数量统计?
07|快速读写文件:如何实现跨文件的字数统计?
08|正则表达式:如何提高搜索内容的精确度?
09|扩展搜索:如何快速找到想要的文件?
10|按指定顺序给词语排序,提高查找效率
11 |通过程序并行计算,避免CPU资源浪费
12|文本处理函数:三招解决数据对齐问题
13|Excel插件:如何扩展Excel的基本功能?
14|VBA脚本编程:如何扩展Excel,实现文件的批量打印?
15|PowerShell脚本:如何实现文件批量处理的自动化?
16|循环与文件目录管理:如何实现文件的批量重命名?
17|不同操作系统下,如何通过网络同步文件?
18|http库:如何批量下载在线内容,解放鼠标(上)?
19|http库:如何批量下载在线内容,解放鼠标(下)?
20|不同文件混在一起,怎么快速分类?
21|SQLite文本数据库:如何进行数据管理(上)?
22|SQLite文本数据库:如何进行数据管理(下)?
23|怎么用数据透视表更直观地展示汇报成果?
24|条形、饼状、柱状图最适合用在什么场景下?
25|图表库:想要生成动态图表,用Echarts就够了
26|快速提取图片中的色块,模仿一张大师的照片
27|zipfile压缩库:如何给数据压缩&加密备份?
28|Celery库:让计算机定时执行任务,解放人力
29|网络和邮件库:定时收发邮件,减少手动操作
30|怎么快速把任意文件格式转成PDF,并批量加水印?
当前位置:
首页>>
技术小册>>
Python自动化办公实战
小册名称:Python自动化办公实战
### 19 | HTTP库:如何批量下载在线内容,解放鼠标(下) 在上一章节中,我们初步探索了利用Python中的HTTP库(如`requests`)来实现在线内容的下载,并简要介绍了如何通过编写简单的脚本来自动化这一过程,从而初步解放了我们的鼠标。本章节将在此基础上进一步深入,探讨更高级、更复杂的批量下载策略,包括但不限于多线程/异步下载、处理重定向、下载进度显示、错误处理及重试机制等,以期实现更高效、更稳定的在线内容批量下载解决方案。 #### 一、多线程/异步下载 在批量下载大量文件时,单线程模式往往会因为网络延迟或服务器限制而效率低下。采用多线程或异步IO技术可以显著提高下载速度,因为它们允许多个任务同时执行,充分利用了网络带宽和CPU资源。 ##### 1.1 多线程下载 Python的`threading`模块提供了创建多线程的基本框架。我们可以为每个下载任务分配一个线程,从而并行执行。 ```python import requests from threading import Thread import os def download_file(url, filename): response = requests.get(url, stream=True) if response.status_code == 200: with open(filename, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): if chunk: f.write(chunk) def download_multiple(urls, filenames): threads = [] for url, filename in zip(urls, filenames): t = Thread(target=download_file, args=(url, filename)) t.start() threads.append(t) for t in threads: t.join() # 示例使用 urls = ['http://example.com/file1.zip', 'http://example.com/file2.jpg'] filenames = ['file1.zip', 'file2.jpg'] download_multiple(urls, filenames) ``` ##### 1.2 异步下载(使用`asyncio`) Python 3.5及以上版本引入了`asyncio`库,支持编写单线程的并发代码。通过`aiohttp`库,我们可以实现异步的HTTP请求。 ```python import aiohttp import asyncio async def download_file(session, url, filename): async with session.get(url) as response: if response.status == 200: with open(filename, 'wb') as f: while chunk := await response.content.read(8192): f.write(chunk) async def download_multiple(urls, filenames): async with aiohttp.ClientSession() as session: tasks = [download_file(session, url, filename) for url, filename in zip(urls, filenames)] await asyncio.gather(*tasks) # 示例使用 urls = ['http://example.com/file1.zip', 'http://example.com/file2.jpg'] filenames = ['file1.zip', 'file2.jpg'] asyncio.run(download_multiple(urls, filenames)) ``` #### 二、处理重定向 在下载过程中,经常会遇到URL重定向的情况。`requests`库默认会处理HTTP重定向,但有时候我们可能需要自定义重定向的行为,比如限制重定向次数,或者在重定向发生时记录日志。 ```python import requests def download_with_redirects(url, max_redirects=5): try: response = requests.get(url, allow_redirects=True, max_redirects=max_redirects) response.raise_for_status() # 如果响应状态码不是200,将抛出HTTPError异常 # 后续处理... except requests.exceptions.TooManyRedirects: print(f"Too many redirects ({max_redirects}) for URL: {url}") except requests.exceptions.RequestException as e: print(f"Error downloading {url}: {e}") # 示例使用 download_with_redirects('http://example.com/redirected') ``` #### 三、下载进度显示 对于大型文件的下载,提供进度条反馈可以显著提升用户体验。`requests`库本身不直接支持进度显示,但我们可以通过监听下载过程中的数据块来实现。 ```python import requests from tqdm import tqdm def download_with_progress(url, filename): response = requests.get(url, stream=True) total_size_in_bytes = int(response.headers.get('content-length', 0)) block_size = 1024 # 1 Kilobyte progress_bar = tqdm(total=total_size_in_bytes, unit='iB', unit_scale=True) with open(filename, 'wb') as file: for data in response.iter_content(block_size): progress_bar.update(len(data)) if data: file.write(data) progress_bar.close() # 示例使用 download_with_progress('http://example.com/largefile.zip', 'largefile.zip') ``` #### 四、错误处理及重试机制 网络请求常因多种原因失败,如网络不稳定、服务器超时等。实现自动重试机制可以增强程序的健壮性。 ```python import requests from requests.adapters import HTTPAdapter from requests.packages.urllib3.util.retry import Retry def requests_retry_session( retries=3, backoff_factor=0.3, status_forcelist=(500, 502, 504), session=None, ): session = session or requests.Session() retry = Retry( total=retries, read=retries, connect=retries, backoff_factor=backoff_factor, status_forcelist=status_forcelist, ) adapter = HTTPAdapter(max_retries=retry) session.mount('http://', adapter) session.mount('https://', adapter) return session # 示例使用 session = requests_retry_session(retries=5, backoff_factor=0.5) response = session.get('http://example.com/file.zip') response.raise_for_status() # 后续处理... ``` #### 五、总结 通过本章节的学习,我们不仅掌握了如何利用Python的HTTP库进行批量下载的基本方法,还深入探讨了多线程/异步下载、处理重定向、显示下载进度以及实现错误处理和重试机制的高级技巧。这些技能将极大地提升我们处理在线内容下载任务的能力,使我们能够更高效地自动化办公流程,进一步解放双手,专注于更有价值的工作。在未来的实践中,建议结合具体场景和需求,灵活运用这些技术,不断优化和完善批量下载解决方案。
上一篇:
18|http库:如何批量下载在线内容,解放鼠标(上)?
下一篇:
20|不同文件混在一起,怎么快速分类?
该分类下的相关小册推荐:
Python合辑3-字符串用法深度总结
Python与办公-玩转Excel
Python合辑13-面向对象编程案例(上)
实战Python网络爬虫
Python与办公-玩转PPT
机器学习算法原理与实战
Python合辑10-函数
Python合辑1-Python语言基础
Python3网络爬虫开发实战(上)
Python编程轻松进阶(二)
Python合辑14-面向对象编程案例(下)
Python合辑5-格式化字符串