使用 Python 下载的 11 种姿势,一种比一种高级


使用 Python 下载的 11 种姿势,一种比一种高级文章插图
原文链接:
在本教程中 , 你将学习如何使用不同的Python模块从web下载文件 。 此外 , 你将下载常规文件、web页面、Amazon S3和其他资源 。
最后 , 你将学习如何克服可能遇到的各种挑战 , 例如下载重定向的文件、下载大型文件、完成一个多线程下载以及其他策略 。
1
使用requests
你可以使用requests模块从一个URL下载文件 。
考虑以下代码:
使用 Python 下载的 11 种姿势,一种比一种高级文章插图
你只需使用requests模块的get方法获取URL , 并将结果存储到一个名为“myfile”的变量中 。 然后 , 将这个变量的内容写入文件 。
2
使用wget
使用 Python 下载的 11 种姿势,一种比一种高级文章插图
你还可以使用Python的wget模块从一个URL下载文件 。 你可以使用pip按以下命令安装wget模块:
考虑以下代码 , 我们将使用它下载Python的logo图像 。
使用 Python 下载的 11 种姿势,一种比一种高级文章插图
在这段代码中 , URL和路径(图像将存储在其中)被传递给wget模块的download方法 。
3
下载重定向的文件
在本节中 , 你将学习如何使用requests从一个URL下载文件 , 该URL会被重定向到另一个带有一个.pdf文件的URL 。 该URL看起来如下:
使用 Python 下载的 11 种姿势,一种比一种高级文章插图
要下载这个pdf文件 , 请使用以下代码:
使用 Python 下载的 11 种姿势,一种比一种高级文章插图
在这段代码中 , 我们第一步指定的是URL 。 然后 , 我们使用request模块的get方法来获取该URL 。 在get方法中 , 我们将allow_redirects设置为True , 这将允许URL中的重定向 , 并且重定向后的内容将被分配给变量myfile 。
最后 , 我们打开一个文件来写入获取的内容 。
4
分块下载大文件
考虑下面的代码:
使用 Python 下载的 11 种姿势,一种比一种高级文章插图
首先 , 我们像以前一样使用requests模块的get方法 , 但是这一次 , 我们将把stream属性设置为True 。
接着 , 我们在当前工作目录中创建一个名为PythonBook.pdf的文件 , 并打开它进行写入 。
然后 , 我们指定每次要下载的块大小 。 我们已经将其设置为1024字节 , 接着遍历每个块 , 并在文件中写入这些块 , 直到块结束 。
不漂亮吗?不要担心 , 稍后我们将显示一个下载过程的进度条 。
5
下载多个文件(并行/批量下载)
要同时下载多个文件 , 请导入以下模块:
使用 Python 下载的 11 种姿势,一种比一种高级文章插图
我们导入了os和time模块来检查下载文件需要多少时间 。 ThreadPool模块允许你使用池运行多个线程或进程 。
让我们创建一个简单的函数 , 将响应分块发送到一个文件:
使用 Python 下载的 11 种姿势,一种比一种高级文章插图
这个URL是一个二维数组 , 它指定了你要下载的页面的路径和URL 。
使用 Python 下载的 11 种姿势,一种比一种高级文章插图
就像在前一节中所做的那样 , 我们将这个URL传递给requests.get 。 最后 , 我们打开文件(URL中指定的路径)并写入页面内容 。
现在 , 我们可以分别为每个URL调用这个函数 , 我们也可以同时为所有URL调用这个函数 。 让我们在for循环中分别为每个URL调用这个函数 , 注意计时器:
使用 Python 下载的 11 种姿势,一种比一种高级文章插图
现在 , 使用以下代码行替换for循环:
使用 Python 下载的 11 种姿势,一种比一种高级文章插图
运行该脚本 。
6
使用进度条进行下载
进度条是clint模块的一个UI组件 。 输入以下命令来安装clint模块:
使用 Python 下载的 11 种姿势,一种比一种高级文章插图
考虑以下代码:
使用 Python 下载的 11 种姿势,一种比一种高级文章插图
在这段代码中 , 我们首先导入了requests模块 , 然后 , 我们从clint.textui导入了进度组件 。 唯一的区别是在for循环中 。 在将内容写入文件时 , 我们使用了进度条模块的bar方法 。
7
使用urllib下载网页
在本节中 , 我们将使用urllib下载一个网页 。
urllib库是Python的标准库 , 因此你不需要安装它 。