Contents

将网页内容放入 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">
...

由于wgetcurl非常相似,让我们简要比较一下它们。

使用wget而不是curl有一些关键优势:

  • 它具有递归下载功能
  • 这是一个更成熟的项目
  • 默认情况下它遵循重定向链接,curl没有。

但是curlwget有一些优势:

  • curl还支持FTPS、Gopher、SCP、SFTP、TFTP、TELNET和许多其他协议。
  • 它有更多的 SSL 选项
  • 它稍微快一点,这在下载大页面时可能很重要。
  • SOCKS支持

更详细的比较可以在Linux 命令比较:curl vs wget 中找到。

4. lynx

curlwget只需从目标下载内容。与它们不同的是,lynx 是一个基于文本的完整网络浏览器。这意味着lynx默认以交互方式工作,以允许用户上网。但是通过适当的参数,我们可以禁用这种交互行为并在我们的脚本中使用它

在前面的示例中,curlwget只是下载属于给定网站的源文件;它们无法解析页面的源代码** 并生成我们通常在浏览器中看到的渲染页面。

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实际上是在将页面源代码保存到变量之前对其进行渲染