首页 > 编程语言 >Python实现批量下载文件的示例代码

Python实现批量下载文件的示例代码

时间:2024-04-22 16:55:56浏览次数:27  
标签:文件 批量 示例 Python chunk url urls requests 下载

前言

下载文件是我们在日常工作中常常要做的一件事情。当我们需要从互联网上批量下载大量文件时,手动一个一个去下载显然不够高效。为了解决这个问题,我们可以使用Python编写一个批量下载文件的脚本,让它自动帮我们下载文件。同时,为了避免下载过程中被网站禁止访问,我们也可以运用代理ip。

在本文中,我将会分为以下几个部分来介绍如何使用Python进行批量下载:

  • 准备工作
  • 批量下载文件
  • 添加代理ip
  • 处理异常

在本文中,我将使用requests库来进行文件下载和代理设置。我们将会介绍如何通过requests库来下载文件、如何设置代理ip来绕过网站的访问限制,以及如何处理下载过程中可能会出现的异常。

 

1. 准备工作

在进行批量下载之前,我们需要先确定要下载的文件的URL列表。可以将这些URL存储在一个文本文件中,每行一个URL,例如:

1 2 3 http://example.com/file1.zip http://example.com/file2.zip http://example.com/file3.zip

我们可以使用Python的open函数读取这个文本文件并获取URL列表:

1 2 with open('urls.txt', 'r') as f:     urls = f.read().splitlines()

这里我们使用了read函数将整个文本文件内容读入内存,然后使用splitlines函数将每一行的URL转换成一个列表。

 

2. 批量下载文件

批量下载文件的代码主要分为两个部分,一个是从远程服务器下载文件,另一个是将文件保存到本地。

我们可以使用Python的requests库来下载文件,并且可以通过设置stream=True参数来实现分块下载,有利于下载大文件时减少内存占用。

1 2 3 4 5 6 7 8 9 10 import requests   def download_file(url, output_path):     with requests.get(url, stream=True) as r:         r.raise_for_status()         with open(output_path, 'wb') as f:             for chunk in r.iter_content(chunk_size=8192):                 if chunk:                     f.write(chunk)                     f.flush()

这个函数接收两个参数,一个是远程服务器上的文件URL,另一个是本地文件路径。内部使用requests.get函数来下载文件,将响应对象以二进制流的方式写入本地文件中。

 

3. 添加代理ip

有些网站可能会对同一IP地址下载次数进行限制,导致我们无法下载。为了绕过这个限制,我们可以使用代理IP。

代理IP是一种通过转发来实现客户端与服务端间请求、响应的中间服务器。我们可以使用代理服务器来隐藏客户端的真实IP地址,从而绕过某些网站的下载限制。

下面的代码演示了如何设置代理IP:

1 2 3 4 5 6 7 8 9 import requests   proxies = {     'http': 'http://127.0.0.1:8080',     'https': 'https://127.0.0.1:8080' }   with requests.get(url, proxies=proxies) as r:     # 下载文件

这里我们定义了一个字典类型的proxies,其中key为协议类型,value为代理IP地址。然后在requests.get函数中设置proxies参数即可。

 

4. 处理异常

在实际使用中,我们可能会遇到诸如文件不存在、网络异常等问题,需要对这些异常进行处理,防止程序崩溃。

1 2 3 4 5 6 7 8 9 10 11 12 13 import requests   def download_file(url, output_path):     try:         with requests.get(url, stream=True) as r:             r.raise_for_status()             with open(output_path, 'wb') as f:                 for chunk in r.iter_content(chunk_size=8192):                     if chunk:                         f.write(chunk)                         f.flush()     except requests.exceptions.RequestException as e:         print(f'Error downloading {url}: {e}')

在代码中,我们使用try/except语句来捕获requests库可能抛出的异常,并使用print语句将异常信息输出到控制台。这样,即使下载文件失败,程序也不会因此停止运行。

 

完整代码

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import requests   def download_file(url, output_path):     try:         with requests.get(url, stream=True) as r:             r.raise_for_status()             with open(output_path, 'wb') as f:                 for chunk in r.iter_content(chunk_size=8192):                     if chunk:                         f.write(chunk)                         f.flush()     except requests.exceptions.RequestException as e:         print(f'Error downloading {url}: {e}')           with open('urls.txt', 'r') as f:     urls = f.read().splitlines()   for url in urls:     filename = url.split('/')[-1]     download_file(url, filename)

这是一个基本的批量下载代码,可以从urls.txt文件中读取文件URL列表,并自动下载到当前目录中。

如果你需要使用代理ip下载文件,可以使用以下代码:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import requests   proxies = {     'http': 'http://127.0.0.1:8080',     'https': 'https://127.0.0.1:8080' }   def download_file(url, output_path):     try:         with requests.get(url, proxies=proxies, stream=True) as r:             r.raise_for_status()             with open(output_path, 'wb') as f:                 for chunk in r.iter_content(chunk_size=8192):                     if chunk:                         f.write(chunk)                         f.flush()     except requests.exceptions.RequestException as e:         print(f'Error downloading {url}: {e}')   with open('urls.txt', 'r') as f:     urls = f.read().splitlines()   for url in urls:     filename = url.split('/')[-1]     download_file(url, filename)

 

这个代码与前面的批量下载代码类似,只是在下载文件时设置了proxies参数。

 

总结

使用Python编写批量下载代码,可以提高工作效率。本文介绍了如何使用requests库来下载文件,如何设置代理IP来绕过某些网站的下载限制,并且展示了如何处理下载过程中可能会出现的异常。

标签:文件,批量,示例,Python,chunk,url,urls,requests,下载
From: https://www.cnblogs.com/yourcool/p/18150963

相关文章

  • Python数据容器
    1.容器定义:容纳多份数据的数据类型。Python的数据容器可以理解为C++中的数据结构,这些数据结构的方法多为“增删改查”。容器类型:列表、元组、字符串、2.列表list列表可理解为数组,下标从0开始。定义定义代码name_list=['zhangsan','lisi','wangwu']#字......
  • 接口自动化Python+requests踩坑记录
    问题描述同一个接口,传参相同,用postman,jmeter等接口工具都能正常访问,后台也能正常返回数据,但是用requests.post()调用就会返回400jmeter传参以及响应这是一个登录接口,如图所示的传参,是可以正常登录的  postman传参以及响应可以看到,两个工具的传参不一样,但是也是同样可以正......
  • DDD领域驱动设计总结和C#代码示例
    DDD(领域驱动设计)是一种软件设计方法,它强调以业务领域为核心来驱动软件的设计和开发。DDD的设计初衷是为了解决复杂业务领域的设计和开发问题,它提供了一套丰富的概念和模式,帮助开发者更好地理解和建模业务领域,从而提高软件的质量和可维护性。一、DDD主要组成DDD的主要模式包......
  • Node.js数电票、全电票查验接口示例、发票查验、票据OCR API
    何为数电票:数电票全称为全面数字化的电子发票,是一种全新的发票形式,与传统的纸质发票具有同等的法律效力,以数字形式存在,不依赖于纸质介质,而数电票的推行旨在提高发票管理效率,降低企业成本,推动税收征管的现代化进程。发票查验的自动化和智能化管理,可以显著减少人工核对发票......
  • ArcPy自动绘制大量地图并设置地图要素:Python
      本文介绍基于Python语言中ArcPy模块,实现ArcMap自动批量出图,并对地图要素进行自定义批量设置的方法。1任务需求  首先,我们来明确一下本文所需实现的需求。  现有通过Python基于Excel数据加以反距离加权空间插值并掩膜图层所绘制的北京市在2019年05月18日00时至23时(其中......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-38-如何截图-下篇
    1.简介这个系列的文章也讲解和分享了差不多三分之一吧,突然有小伙伴或者童鞋们问道playwright有没有截图的方法。答案当然是:肯定有的。宏哥回过头来看看确实这个非常基础的知识点还没有讲解和分享。那么在这个契机下就把它插队分享和讲解一下。Playwright提供了一个截屏的API:page.......
  • python使用scap构建镜像流量
    importpytestimportrequestsimporttimefromscapy.allimport*@pytest.mark.usefixtures("get_config_instance")deftest_76_vlan(get_config_instance):#DefineethernetandIP/TCPlayerseth=Ether()ip=IP(src='10.0.0.2&......
  • DDD-领域驱动设计示例
    一、DDD概述DDD,即领域驱动设计,核心是不断提炼通用语言并用于与领域专家等团队所有成员交流,并用代码来表达出一个与通用语言一致的领域模型。通用语言:通过团队交流达成共识的能够简单清晰准确传递业务规则的语言(可以是文字、图片等)领域:软件系统要解决的问题域,是有边界的......
  • Python pytorch 坐标系变换与维度转换
    前言深度学习中经常要用到张量坐标系变换与维度转换,因此记录一下,避免混淆坐标系变换坐标系变换(矩阵转置),主要是调换tensor/array的维度pytorchimporttorchdefinfo(tensor):print(f"tensor:{tensor}")print(f"tensorsize:{tensor.size()}")print(f"tenso......
  • python中列表、字典和字符串的互相转换
    我们在python使用中经常会用到需要把字符串转为list或者字典,及把list或字典转为字符串(写文件,f.write()只能写字符串,插入数据库时,也只能用字符串)具体使用方法总结了一下:1、字符串转lists='a,b,c'l=s.split(',')  #把字符串s以逗号分割,分割出的list给到l ......