使用python下载文件的方法有很多种;首先要有一个下载链接
downlaod_url = 'http://****/download.file.png'
- 第一种:使用requests
使用requests模块的get方法,请求url的结果写入文件;
def downlaod1():
import requests
open ('download_file_1.png','wb').write(requests.get(url=downlaod_url).content)
- 第二种: 使用wget模块
适合小文件,给wget模块的download方法传入两个URL和路径。
def download2():
import wget
wget.download(downlaod_url,'download_file_2.png')
- 第三种:使用线程池下载文件
使用muliprocessing中的ThreadPool模块,这个模块课允许你使用池运行多个线程或进程。
```python
def d3(path,url):
import requests
rc = requests.get(url,stream=True)
with open(path,'wb') as f:
for r in rc:
f.write(r)
def downlaod3():
from multiprocessing.pool import ThreadPool
ThreadPool(3).imap_unordered(d3,['1.png','2.png','3.png'][downlaod_url,downlaod_url,downlaod_url])
- 第四种:使用urllib3下载文件
使用urllib3的PoolManager ,跟踪必要的连接池,减少网络开销
使用client发送一个GET请求来获取响应写入文件
```python
def download4():
import urllib3
import shutil
client = urllib3.PoolManager()
with open('downlaod_file_4.png') as f, client.request('GET',downlaod_url) as res:
shutil.copyfileobj(res,f)
- 第五种:使用asyncio异步下载
asyncio模块主要用于处理系统事件。它围绕一个事件循环进行工作,该事件循环会等待事件发生,然后对该事件作出反应。这个反应可以是调用另一个函数。这个过程称为事件处理。
asyncio模块使用协同程序进行事件处理; 适合下载多个文件;
async def d5(url):
import requests
open ('path','wb').write(requests.get(url).content)
import asyncio
async def run_func(urls):
downlaod5 = [d5(url) for url in urls]
done,appending = await asyncio.wait(downlaod5)
for d in done:
print(d.result())
event_loog = asyncio.get_event_loop()
event_loog.run_until_complete(run_func([downlaod_url,downlaod_url,downlaod_url]))