使用Python和Wget下载网页及文件
Python在许多领域,如自动化、数据科学、数据工程和应用开发中都是通用语言。其中,下载图片和网页是常见任务,而Python结合Wget是一种简单且强大的下载方法。
Wget是一个历史悠久的免费命令行程序,可以通过HTTP、HTTPS和FTP从网络中检索文件。结合Python,你可以轻松下载和搜集网络上的各种内容。
本文将通过简单的例子介绍使用Python和Wget的优势,并了解Wget的功能和替代方案。
为什么选择Wget?
Wget是一个方便且广泛支持的工具,可通过HTTP、HTTPS和FTP下载文件。它的流行有两个主要原因:递归性和稳健性。
- 递归性:Wget可作为网络爬虫,递归下载特定网页链接的文件,直到满足用户设定的递归深度或链接耗尽。下载的文件保存在类似于服务器目录结构的本地文件夹中,具有高度可配置性。
- 稳健性:Wget可从中断的传输中恢复,适用于不稳定或缓慢的网络环境。通过Range HTTP Header继续下载,无需用户干预。
值得一提的是,Wget2是其更新版本,保留了大部分功能,并重点关注并行下载以提高效率。
为什么选择Python的Wget?
Python是一种通用编程语言,在金融、学术界、数据工程、数据科学、网络开发和自动化领域广泛应用。它不仅被各种领域和行业广泛采用,而且拥有庞大的社区支持。Python是谷歌搜索中最受欢迎的编程语言之一,并且在职位空缺中名列前茅。
利用Wget,你可以将Python脚本转变为功能强大的网络抓取工具,适用于多种有趣的用例:
- 创建学术和商业数据集:通过Wget轻松获取一个或多个网站的内容,对机器学习研究至关重要,例如NLP模型所需的大量内容。
- 监测大型网站:自动化Wget检查网页和文件是否可以从全球不同网络和地点获取。
- 内容映射:通过设置Wget表现为不同角色,创建内容概览,了解哪些内容针对哪些用户。
尽管Python wget包与Wget命令行程序共享一些功能,但它是一个未完成的包,多年未更新,并且缺乏Wget的许多显著特征。
在Python中使用Wget
下面我们将通过Python中的subprocess包与操作系统的shell接口设置Wget来下载文件。这种方法高效且灵活,帮助你轻松完成下载任务。
标题:利用Python和Wget实现高效下载任务
首要条件:
在开始之前,请确保你的计算机上已安装Wget。安装方式因操作系统而异:
- Linux用户可能已经预装了Wget。
- Mac用户可以使用Homebrew来安装。
- Windows用户可以从指定网站下载Wget命令行工具的可执行文件,并确保将其添加到PATH变量中。
运行命令的子进程包
为了从Python脚本中运行Wget命令,我们将使用子进程包的Popen方法。每次调用popen(),它将在操作系统的命令处理器中执行你传递的命令,并可根据需要返回输出。下面是几个常用的命令片段:
下载一个文件:
首要条件:
首先,请确保你的机器上安装了Wget。这个过程因你的操作系统不同而不同。
如果你使用的是Linux,你可能已经预装了它。
如果你使用Mac,安装Wget的最简单方法是使用Homebrew。
Windows用户可以从这个网站下载Wget命令行工具的可执行文件。一旦下载完毕,确保它被添加到PATH变量中。
用子进程包运行命令:
为了从Python脚本中运行Wget命令,你将使用子进程包的Popen方法。每次你的脚本调用popen(),它将在操作系统的命令处理器的一个独立实例中执行你传递的命令。通过设置verbose参数为True,它还会返回命令的输出。请根据你的需要自由调整。
所有的代码片断都可以在这个文件中找到。
本节中你将使用的命令都是以同样的方式组织的。你将使用wget命令,给它一个URL,并提供特定的选项来实现某些目标。
在广泛的手册中检查你的选项。
下载一个文件:
要从服务器上下载一个文件,把wget命令和文件的URL传给你创建的自定义函数。将verbose设置为True。
runcmd(“wget https://www.scrapingbee.com/images/logo-small.png”, verbose=True)
从该命令的输出中,你可以观察到(1)URL被解析为服务器的IP地址,(2)发送了一个HTTP请求,(3)收到状态码200 OK。最后(4),Wget将文件存储在脚本运行的目录中,而不改变文件名。
下载一个文件到一个自定义文件夹:
要下载一个文件到一个特定的文件夹,可以传递给它–目录前缀或–P标志,然后是目标文件夹。有趣的是,当文件夹的路径不存在时,Wget会创建它。
runcmd(“wget –directory-prefix=download_folder https://www.scrapingbee.com/images/logo-small.png”, verbose=False)
runcmd(“wget -P download_folder https://www.scrapingbee.com/images/logo-small.png”, verbose=False)
将文件下载到一个特定的文件名:
你不仅可以改变一个文件的目标文件夹,而且可以指定其本地文件名。向它提供–输出文件或–O标志,然后是所需的文件名。
runcmd(“wget -O logo.png https://www.scrapingbee.com/images/logo-small.png”)
runcmd(“wget –output-document=logo.png https://www.scrapingbee.com/images/logo-small.png”)
下载一个文件的较新版本:
有时你只想下载一个文件,如果本地的拷贝比服务器的版本要老。你可以通过提供–时间戳选项来打开这个功能。
runcmd(“wget –timestamping https://www.scrapingbee.com/images/logo-small.png”, verbose=True)
如果你已经下载了ScrapingBee的标志,你很可能会看到,在这个例子中,服务器响应的状态代码是304未修改的。换句话说,服务器上的文件与你本地机器上的文件是同一个版本,所以不会有文件被下载。
完成未完成的下载:
Wget的默认行为是,如果中途失去连接,会重试下载一个文件。然而,如果你想继续获得部分下载的文件,你可以设置-c或-continue选项。
递归检索:
Wget最令人兴奋的功能是递归检索。Wget可以通过HTMLsrc和href属性或CSSurl()功能符号检索和解析给定URL上的页面以及初始文件所指向的文件。如果下一个文件也是文本/HTML,它将被解析并进一步跟踪,直到达到所需的深度。递归检索是广度优先的:它将下载深度1上的文件,然后是深度2,等等。
有很多选项你可以设置。
-r或–recursive选项将启用递归检索。
-l或–level选项允许你设置深度,即Wget可以追索的子目录的数量。为了防止抓取巨大的网站,Wget设置的默认深度为5/。把这个选项改为零(0)或”inf”,以获得无限的深度。如果你想确保所有必要的资源(图片、CSS、JavaScript)都被加载以正确显示一个页面,即使这些资源没有所需的最大深度,你可以设置-p或-page-requisites选项。
以下命令将递归地下载scrapingbee.com网站到一个www.scrapingbee.com,最大深度为3/。Wget还将转换所有链接,使这个副本在本地可用。
runcmd(‘wget –recursive –level=3 –convert-links https://www.scrapingbee.com’)
这个命令可能需要几分钟以上的时间才能完成,这取决于你的互联网连接速度。
什么时候不使用Wget:
如果你专注于从网络服务器递归下载文件,Wget是一个优秀的解决方案。然而,由于这种狭窄的关注点,它的使用情况是有限的,替代方案值得考虑。
- 要通过HTTP(S)或FTP(S)以外的协议下载文件。
- 如果你只需要刮取网页上的某些DOM元素而不把文件存储在本地,可以考虑与[Beautiful Soup]相结合的请求。
- Selenium是模拟网站上的点击和滚动行为的绝佳解决方案(例如,用于测试目的)。
总结
Wget是一个通过HTTP和FTP协议下载文件的便捷解决方案。它在递归下载多个文件方面与Python配合得很好,而且这个过程可以很容易地自动化,以节省你的时间。
Wget的重点可能有些局限,但它为你的下载和网络抓取需求提供了大量的选择。