将网页内容放入 shell 变量
1. 概述
Linux 与所有基于 Unix 的操作系统一样,带有可编程shell。使用这些 shell,我们可以创建脚本和小程序来自动化我们的日常任务。
在本教程中,我们将看到将网页内容放入 shell 变量的不同方法。
2. curl
curl 是一个用于使用 URL 传输数据的工具。curl默认直接将网页输出到控制台,没有任何额外的信息,因此非常适合脚本使用。下载网页不需要任何参数。然而,一些站点返回一个带有地址链接的HTTP代码 30X,表明应该重定向到这个新地址。为了让curl跟随这些重定向链接,我们需要添加*-L*参数:
$ CONTENT=$(curl -L blogdemo.com)
$ echo $CONTENT
<!doctype html>
<html lang="en-US" class="no-js">
<head><meta charset="utf-8">
...
使用 curl有以下优点:
- 可以并行下载
- 使用http_proxy变量中的代理配置,允许curl使用代理下载信息
3. wget
GNU wget 是一个免费软件包,用于使用 HTTP、HTTPS、FTP 和 FTPS 协议检索文件。它是一种非交互式工具,因此也非常适合脚本使用。
默认情况下,wget生成与下载过程相关的输出并将结果 a 保存到文件:
$ wget blogdemo.com
--2020-09-13 14:50:19-- http://blogdemo.com/
Resolving blogdemo.com (blogdemo.com)... 104.28.25.246, 104.28.24.246, 172.67.160.67, ...
Connecting to blogdemo.com (blogdemo.com)|104.28.25.246|:80... connected
...
...
Saving to: ‘index.html’
要修改此行为,我们可以使用:
- -q ( -quiet ) 参数隐藏下载状态输出
- -O参数改变wget的输出,“ - ”表示stdout
通过使用这些参数,我们可以将输出直接保存到变量中:
$ CONTENT=$(wget blogdemo.com -q -O -)
$ echo $CONTENT
<!doctype html>
<html lang="en-US" class="no-js">
<head><meta charset="utf-8">
...
由于wget与curl非常相似,让我们简要比较一下它们。
使用wget而不是curl有一些关键优势:
- 它具有递归下载功能
- 这是一个更成熟的项目
- 默认情况下它遵循重定向链接,curl没有。
但是curl比wget有一些优势:
- curl还支持FTPS、Gopher、SCP、SFTP、TFTP、TELNET和许多其他协议。
- 它有更多的 SSL 选项
- 它稍微快一点,这在下载大页面时可能很重要。
- 有SOCKS支持
更详细的比较可以在Linux 命令比较:curl vs wget 中找到。
4. lynx
curl和wget只需从目标下载内容。与它们不同的是,lynx 是一个基于文本的完整网络浏览器。这意味着lynx默认以交互方式工作,以允许用户上网。但是通过适当的参数,我们可以禁用这种交互行为并在我们的脚本中使用它。
在前面的示例中,curl和wget只是下载属于给定网站的源文件;它们无法解析页面的源代码** 并生成我们通常在浏览器中看到的渲染页面。
Lynx作为一个完整的网络浏览器,可以解析这些文件并生成我们在浏览器中看到的大部分网站。但我们不能忘记lynx仍然是基于文本的浏览器,而不是像 Firefox 或 Chrome 这样的完整浏览器,因此它有很多限制。在处理严重依赖图像和/或脚本的页面时,这一点尤其重要。
现在让我们看看curl下载的 Blogdemo 主页的第一部分:
$ CONTENT=$(curl -L blogdemo.com | head)
$ echo $CONTENT
<!doctype html>
<html lang="en-US" class="no-js">
<head><meta charset="utf-8">
...
...
与lynx下载和解析的部分相同:
$ CONTENT=$(lynx -dump blogdemo.com | head)
$ echo $CONTENT
#[1]alternate [2]alternate [3]alternate
[tr?id=512471148948613&ev=PageView&noscript=1]
[4]The Blogdemo logo
*
* [5][logo.svg]
* [6]Start Here
* [7]Courses ▼▲
正如我们所见, curl只是下载网站生成的页面源。lynx实际上是在将页面源代码保存到变量之前对其进行渲染。