📜  在 Linux 中抓取加密货币价格的 Shell 脚本

📅  最后修改于: 2022-05-13 01:57:33.052000             🧑  作者: Mango

在 Linux 中抓取加密货币价格的 Shell 脚本

加密货币是如此的炒作,以至于每个人都想成为其中的一部分。即使是书呆子和程序员也想潜入这个惊人的领域,因为它在各个方面都非常通用且有趣。那么如何使用 shell 脚本和 coingecko.com 取消加密货币硬币的价格,例如比特币、以太坊、狗狗币和大量其他硬币。

有大量网站展示了各种加密货币的碎片,但其中许多网站都有机器人和安全系统,以避免递归访问网站。因此,这里最安全的选择是使用 coingecko,这是一个用于分析加密货币和其他方面的强大而庞大的平台。

检查站点

这是网页抓取的最关键部分,用于检查和分析网站的各个方面。这使我们能够熟悉网站的结构和组成部分。如果您使用的是 chrome,开发人员有很多开发工具可供选择,例如检查网页并查看与之相关的标签和元素。

查找目标元素或标签

现在转到实际网站的内容并找到我们的目标,在这种情况下是加密货币的当前价格。我们可以使用检查/开发人员窗口左上角的“从页面中选择要检查的元素”选项。这使我们可以通过单击或悬停在元素/标签上来查看它们。这将确保我们从网页来源中选择正确的标签。此外,因为我们可以直观地看到元素,所以很容易找到我们的目标元素。



我们发现价格存储在带有“no-wrap”类的 span 标签中,并且有一个波动的 data-price-btc 值,这将是我们将尝试从该网站提取的标签。 span 标签中的其他东西每秒都在波动,因为它是存储在属性中的硬币的价值。所以到目前为止我们只需要 span 标签,我们将在接下来的部分中看到如何使用 grep 和 sed 提取它。

使用 cURL 访问网站并将其存储在文件中

现在我们继续从终端进行实际的抓取和访问网站页面。 cURL 命令是一个很好的选择,因为它在许多 Linux/Unix 系统中默认可用。我们还有一个名为 wget 的替代 cURL,但在许多系统中并未广泛使用。我们可以使用以下命令访问网站 URL。

curl 'https://www.coingecko.com/en/'

您将有一个显示整个网页源的输出。输出是巨大的,因此我们需要修剪和剥离许多标签和组件以从中提取数据,但为此,我们需要将网页源存储在某处。我们将它存储在一个文件中。我们可以将参数传递给 curl 命令以将输出保存在提供的文件中。

curl -o price.txt 'https://www.coingecko.com/en/'

-o 参数允许我们将输出存储在文件中。在这种情况下,我们将其存储在名为“price.txt”的文本文件中。但正如您所见,它是网站的主页,我们需要特定硬币的页面。我们需要修改 URL 并可能将其存储在一个变量中,因为 URL 将根据用户输入的硬币动态生成。如果您看到各种硬币并注意到 URL,则有一个模式生成了 URL ' https://www.coingecko.com/en/coins/bitcoin' 和 'https://www.coingecko.com/en/ coins/ethereum' 只是有他们名字的单词/代码作为区别。那么我们怎样才能做到这一点呢?我们可以在 URL 中使用变量,例如:

coin='bitcoin'
url='https://www.coingecko.com/en/coins/'$coin''
output=price.txt
curl -o $output $url

我们绝对可以从用户输入并将其存储在 coin 变量中,但在这里我们可以将其硬编码以仅用于测试命令。我们还为输出文件创建了一个变量。稍后我们将需要该文件用于模式查找和过滤掉不需要的标签。我们使用引号内的嵌套引号使 bash 将硬币理解为变量,并使用$符号来访问变量的内容。

使用grep和sed抓取网页文件

我们现在有了需要加密货币价格的网页来源。我们将首先使用 grep 勾选带有类 no wrap 和 data-price-BTC 的 span 标签,其值每次都会发生变化,因此我们将在此处进行检查。如果我们对值进行硬编码,我们将无法废弃内容,它可能每秒都在变化,所以只需将其保留到那里即可。

我们将使用带有 -o 和 -P 参数的 grep,这将允许我们分别返回匹配的 case 和 Perl 正则表达式。我们将获得 span 类之间的所有内容,包括波动属性。我们只想要嵌入在 span 标签中的硬币的价值,我们可以使用 Perl 中的正则表达式简单地删除 span 标签。



以下代码将从整个源中提取 span 标记并删除除找到匹配的行之外的所有内容。该命令还删除了结束跨度标记,因此我们只剩下带有一些属性和文本属性的开始标记。输出存储在临时文件中。我们还将获得这些标签的一些文本行和属性。因为属性和价值都是波动的价格,所以我们得到的文本如下:

我们将删除这些文本和属性,并仅获取使用 sed 命令获得的文本中的值,如下所示:

sed -i 's/[^>]*>//g' temp.txt >$output

sed 命令是一个编辑器,它将编辑文件中的文本,因为我们需要删除 > 标记之前的文本,并简单地获取结束标记之后的值。我们再次将输出存储在作为变量的 price.txt 文件中。带有所提供正则表达式的 sed 命令将删除结束标记 (>) 之前的所有内容,从而获取这些标记之间的值,但结束标记 ( 已被 grep 删除。 -i 参数将确保我们不打印执行操作后的结果。

所以我们只会得到我们想要的值,但仍有 6-7 个值显示该代币的交易量和历史最高价和历史最低价。我们不需要那个。我们将再次使用 sed 删除它们,但这一次将非常简单,如下所示:

sed -ni '1p' temp.txt >$output

sed 将另一个参数作为 -n 来抑制输出,而 p 将打印指定的行。我们没有打印任何内容,因为我们将结果存储在 proce.txt 文件中,因此我们将通过仅打印具有当前行的第一行来实现结果。

我们需要将结果存储在 price.txt 文件中并删除 temp.txt 文件。为此,我们将 temp.txt 文件的内容移动到 price.txt 文件并简单地删除临时文件。

cp temp.txt $output
  rm temp.txt

打印价格

我们快完成了。我们只需要打印价格,因为我们已经将价格存储在文件中,我们需要将其存储在变量中,以便根据我们的需要进行打印。我们将使用 while 循环,直到文件到达文件末尾并将唯一的行提取到变量中。最后,我们使用 echo 命令打印价格。

while read price
  do 
      val=$price
  done <$output
  echo "The price of $coin is = $val" 

对于一层可读的代码,我们将为每个任务创建函数,即用于对网页进行条带化或抓取以及打印价格。

function strip_html(){
  grep -oP '(?<=)' $output >temp.txt 
  sed -i 's/[^>]*>//g' temp.txt >$output
  sed -ni '1p' temp.txt >$output
  cp temp.txt $output
  rm temp.txt
}
function print(){
  while read price
  do 
      val=$price
  done <$output
  echo "The price of $coin is = $val" 
}

下面是完整的实现。

进行一些修改,例如将 cURL 的输出清除为 /dev/null,将刷新输出并使其循环更清晰。如果它显示任何错误,请删除这些命令。我们还接受用户输入并将值存储在 coin 变量中。

#!/bin/bash

function strip_html(){
  grep -oP '(?<=)' $output >temp.txt 
  
  sed -i 's/[^>]*>//g' temp.txt >$output
  sed -ni '1p' temp.txt >$output
  cp temp.txt $output
  rm temp.txt
}
function print(){
  while read price
  do  
      val=$price
  done <$output
  echo "The price of $coin is = $val" 
}

read -p "enter the coin code : " coin
url='https://www.coingecko.com/en/coins/'$coin''
output=price.txt
touch $output temp.txt
curl -o $output $url 
strip_html  
print