Python下载⽂件的11种⽅式
译者:天天向上    英⽂原⽂:
在本教程中,你将学习如何使⽤不同的Python模块从web下载⽂件。此外,你将下载常规⽂件、web页⾯、Amazon S3和其他资源。
最后,你将学习如何克服可能遇到的各种挑战,例如下载重定向的⽂件、下载⼤型⽂件、完成⼀个多线程下载以及其他策略。
使⽤Requests
你可以使⽤requests模块从⼀个URL下载⽂件。
考虑以下代码:
你只需使⽤requests模块的get⽅法获取URL,并将结果存储到⼀个名为“myfile”的变量中。然后,将这个变量的内容写⼊⽂件。
使⽤wget
你还可以使⽤Python的wget模块从⼀个URL下载⽂件。你可以使⽤pip按以下命令安装wget模块:
考虑以下代码,我们将使⽤它下载Python的logo图像。
在这段代码中,URL和路径(图像将存储在其中)被传递给wget模块的download⽅法。
下载重定向的⽂件
在本节中,你将学习如何使⽤requests从⼀个URL下载⽂件,该URL会被重定向到另⼀个带有⼀个.pdf⽂件的URL。该URL看起来如下:
要下载这个pdf⽂件,请使⽤以下代码:
在这段代码中,我们第⼀步指定的是URL。然后,我们使⽤request模块的get⽅法来获取该URL。在get⽅法中,我们将allow_redirects 设置为True,这将允许URL中的重定向,并且重定向后的内容将被分配给变量myfile。
最后,我们打开⼀个⽂件来写⼊获取的内容。
分块下载⼤⽂件
考虑下⾯的代码:
⾸先,我们像以前⼀样使⽤requests模块的get⽅法,但是这⼀次,我们将把stream属性设置为True。
接着,我们在当前⼯作⽬录中创建⼀个名为PythonBook.pdf的⽂件,并打开它进⾏写⼊。
然后,我们指定每次要下载的块⼤⼩。我们已经将其设置为1024字节,接着遍历每个块,并在⽂件中写⼊这些块,直到块结束。
不漂亮吗?不要担⼼,稍后我们将显⽰⼀个下载过程的进度条。
下载多个⽂件(并⾏/批量下载)
要同时下载多个⽂件,请导⼊以下模块:
我们导⼊了os和time模块来检查下载⽂件需要多少时间。ThreadPool模块允许你使⽤池运⾏多个线程或进程。
让我们创建⼀个简单的函数,将响应分块发送到⼀个⽂件:
这个URL是⼀个⼆维数组,它指定了你要下载的页⾯的路径和URL。
就像在前⼀节中所做的那样,我们将这个URL传递给。最后,我们打开⽂件(URL中指定的路径)并写⼊页⾯内容。
现在,我们可以分别为每个URL调⽤这个函数,我们也可以同时为所有URL调⽤这个函数。让我们在for循环中分别为每个URL调⽤这个函数,注意计时器:
现在,使⽤以下代码⾏替换for循环:
运⾏该脚本。
使⽤进度条进⾏下载
进度条是clint模块的⼀个UI组件。输⼊以下命令来安装clint模块:
考虑以下代码:
在这段代码中,我们⾸先导⼊了requests模块,然后,我们从ui导⼊了进度组件。唯⼀的区别是在for循环中。在将内容写⼊⽂件时,我们使⽤了进度条模块的bar⽅法。
使⽤urllib下载⽹页
在本节中,我们将使⽤urllib下载⼀个⽹页。
urllib库是Python的标准库,因此你不需要安装它。
以下代码⾏可以轻松地下载⼀个⽹页:
在这⾥指定你想将⽂件保存为什么以及你想将它存储在哪⾥的URL,
在这段代码中,我们使⽤了urlretrieve⽅法并传递了⽂件的URL,以及保存⽂件的路径。⽂件扩展名将是.html。
通过代理下载
如果你需要使⽤代理下载你的⽂件,你可以使⽤urllib模块的ProxyHandler。请看以下代码:
在这段代码中,我们创建了代理对象,并通过调⽤urllib的build_opener⽅法来打开该代理,并传⼊该代理对象。然后,我们创建请求来获取页⾯。
此外,你还可以按照官⽅⽂档的介绍来使⽤requests模块:
你只需要导⼊requests模块并创建你的代理对象。然后,你就可以获取⽂件了。
使⽤urllib3
urllib3是urllib模块的改进版本。你可以使⽤pip下载并安装它:
我们将通过使⽤urllib3来获取⼀个⽹页并将它存储在⼀个⽂本⽂件中。
导⼊以下模块:
在处理⽂件时,我们使⽤了shutil模块。
现在,我们像这样来初始化URL字符串变量:
然后,我们使⽤了urllib3的PoolManager ,它会跟踪必要的连接池。
创建⼀个⽂件:
最后,我们发送⼀个GET请求来获取该URL并打开⼀个⽂件,接着将响应写⼊该⽂件:
使⽤Boto3从S3下载⽂件
要从Amazon S3下载⽂件,你可以使⽤Python boto3模块。
在开始之前,你需要使⽤pip安装awscli模块:
对于AWS配置,请运⾏以下命令:
现在,按以下命令输⼊你的详细信息:
要从Amazon S3下载⽂件,你需要导⼊boto3和botocore。Boto3是⼀个Amazon SDK,它允许Python访问Amazon web服务(如
S3)。Botocore提供了与Amazon web服务进⾏交互的命令⾏服务。
Botocore⾃带了awscli。要安oto3,请运⾏以下命令:
现在,导⼊这两个模块:
在从Amazon下载⽂件时,我们需要三个参数:
1.  Bucket名称
2. 你需要下载的⽂件名称web下载官方下载
3. ⽂件下载之后的名称
初始化变量:
现在,我们初始化⼀个变量来使⽤会话的资源。为此,我们将调⽤boto3的resource()⽅法并传⼊服务,即s3:
最后,使⽤download_file⽅法下载⽂件并传⼊变量:
使⽤asyncio
asyncio模块主要⽤于处理系统事件。它围绕⼀个事件循环进⾏⼯作,该事件循环会等待事件发⽣,然后对该事件作出反应。这个反应可以是调⽤另⼀个函数。这个过程称为事件处理。asyncio模块使⽤协同程序进⾏事件处理。
要使⽤asyncio事件处理和协同功能,我们将导⼊asyncio模块:
现在,像这样定义asyncio协同⽅法:
关键字async表⽰这是⼀个原⽣asyncio协同程序。在协同程序的内部,我们有⼀个await关键字,它会返回⼀个特定的值。我们也可以使⽤return关键字。
现在,让我们使⽤协同创建⼀段代码来从⽹站下载⼀个⽂件:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。