Shell Script para raspar los precios de las criptomonedas en Linux

Las criptomonedas son tan populares que todos quieren ser parte de ellas. Incluso los nerds y los programadores quieren sumergirse en este increíble campo porque es bastante versátil e interesante en todos los aspectos. Entonces, ¿qué tal eliminar el precio de las monedas de criptomonedas como bitcoin, ethereum, dogecoin y un montón de otras monedas usando shell script y coingecko.com

Hay toneladas de sitios web que muestran las piezas de varias criptomonedas, pero muchos de ellos tienen bots y sistemas de seguridad para evitar el acceso recursivo a un sitio web. Entonces, la opción más segura aquí es usar coingecko, que es una plataforma excelente y masiva para analizar criptomonedas y otros aspectos también.

Inspeccionando el sitio

Esta es la parte más crucial del web scrapping para inspeccionar y analizar varios aspectos del sitio web. Esto nos permite familiarizarnos con la estructura y los componentes del sitio web. Si está utilizando Chrome, los desarrolladores tienen una excelente opción de herramientas de desarrollo, como inspeccionar la página web y ver las etiquetas y elementos asociados con ella.  

Encontrar el elemento o la etiqueta de destino

Ahora pase al contenido del sitio real y encuentre nuestro objetivo, que en este caso es el precio actual de la criptomoneda. Podemos usar la opción «Seleccionar el elemento de la página para inspeccionar» en la parte superior izquierda de la ventana de inspección/desarrollador. Esto nos permite ver los elementos/etiquetas haciendo clic o pasando el cursor sobre ellos. Esto asegurará que estamos seleccionando la etiqueta correcta de la fuente de la página web. Además, se vuelve bastante fácil encontrar nuestro elemento de destino ya que podemos verlo visualmente. 

Encontramos que el precio está almacenado en la etiqueta span con la clase ‘no-wrap’ y tiene un valor fluctuante de data-price-btc, que será la etiqueta que intentaremos extraer de este sitio web. Las otras cosas en la etiqueta de intervalo fluctúan cada segundo, ya que es el valor de la moneda almacenada en las propiedades. Entonces solo necesitaremos la etiqueta span hasta ahora, veremos cómo extraer esto usando grep y sed en las próximas secciones.

Uso de cURL para acceder al sitio web y almacenarlo en un archivo

Ahora pasamos al desguace real y al acceso a la página del sitio web desde la terminal. El comando cURL es una excelente opción para esto, ya que está disponible de forma predeterminada en muchos sistemas Linux/Unix. También tenemos una cURL alternativa llamada wget, pero no está ampliamente disponible en muchos sistemas. Podemos acceder a la URL de un sitio web usando el siguiente comando.

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

Tendrá una salida que muestra la fuente de toda la página web. La salida es enorme, por lo que necesitamos recortar y quitar muchas etiquetas y componentes para extraer los datos de ellos, pero para eso, necesitamos almacenar la fuente de la página web en algún lugar. Lo almacenaremos en un archivo. Podemos pasar argumentos al comando curl para guardar el resultado en el archivo proporcionado.

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

El argumento -o nos permite almacenar la salida en un archivo. En este caso, lo almacenamos en el archivo de texto llamado ‘price.txt’. Pero es la página de inicio del sitio web, como puede ver, necesitamos la página de la moneda en particular. Necesitamos modificar la URL y probablemente almacenarla en una variable, ya que la URL se generará dinámicamente en función de la entrada de la moneda por parte del usuario. Si ve las distintas monedas y observa la URL, hay un patrón que generó la URL ‘ https://www.coingecko.com/en/coins/bitcoin’ y ‘https://www.coingecko.com/en/ Las monedas/ethereum tienen solo la palabra/código de su nombre como diferencia. Entonces, ¿cómo podemos lograr eso? Podemos usar variables dentro de la URL como:

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

Definitivamente podemos ingresar datos del usuario y almacenarlos en la variable de moneda, pero aquí podemos mantenerlos codificados solo para probar el comando. También hemos creado una variable para el archivo de salida. Necesitaremos el archivo para encontrar patrones y filtrar las etiquetas no deseadas más adelante. Estamos usando las citas anidadas dentro de la cita para hacer que bash entienda la moneda como una variable y el símbolo $para acceder al contenido de la variable.

Raspando el archivo de la página web usando grep y sed

Ahora tenemos la fuente de la página web de la que necesitamos el precio de las criptomonedas. Comenzaremos usando grep para marcar la etiqueta span con la clase no wrap y data-price-BTC, cuyo valor cambia cada vez, así que lo revisaremos aquí. No podremos descartar el contenido si codificamos el valor, puede cambiar cada segundo, así que manténgalo hasta allí. 

Usaremos grep con los argumentos -o y -P, lo que nos permitirá devolver solo los casos coincidentes y para Perl Regular Expression respectivamente. Obtendremos todo lo que se encuentre entre la clase span, incluidas las propiedades fluctuantes. Solo queremos el valor de la moneda que está incrustada en la etiqueta de intervalo, simplemente podemos eliminar las etiquetas de intervalo usando la expresión regular en Perl.

grep -oP ‘(?<=<span class=”no-wrap” data-price-btc).*?(?=</span>)’ $salida >temp.txt

El siguiente código extraerá la etiqueta span de toda la fuente y eliminará todo excepto las líneas donde se encuentra la coincidencia. El comando también elimina la etiqueta de extensión final, por lo que solo nos queda la etiqueta inicial con algunas propiedades y atributos de texto. La salida se almacena en el archivo temporal. También obtendremos algunas líneas de texto y propiedades de esas etiquetas. Debido a que las propiedades y los valores son precios fluctuantes, obtenemos el texto de la siguiente manera:

Eliminaremos ese texto y propiedades y obtendremos solo el valor en el texto que tenemos usando el comando sed de la siguiente manera:

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

 El comando sed es un editor que editará el texto en el archivo, ya que necesitamos eliminar el texto antes de la etiqueta > y simplemente ingresar el valor después de la etiqueta de cierre. Almacenamos la salida nuevamente en el archivo price.txt que hemos creado como una variable. El comando sed con la expresión regular proporcionada eliminará todo antes de la etiqueta de cierre (>) y, por lo tanto, obtendrá el valor entre esas etiquetas, pero la etiqueta final (</> ya fue eliminada por grep. El argumento -i se asegurará de que no imprimamos los resultados después de realizar la operación.

Por lo tanto, solo obtendremos el valor que queríamos, pero todavía hay 6-7 valores que muestran el volumen y los precios máximos y mínimos históricos de esa moneda. No requerimos eso. Los eliminaremos usando sed nuevamente, pero esta vez será bastante simple, como lo siguiente:

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

El sed toma otro parámetro como -n que suprimirá la salida y p imprimirá la línea especificada. No estamos imprimiendo nada ya que estamos almacenando el resultado en el archivo price.txt y, por lo tanto, lograremos el resultado imprimiendo solo la primera línea que tiene la línea actual.

Tendremos que almacenar el resultado en el archivo price.txt y eliminar el archivo temp.txt. Para eso, moveremos el contenido del archivo temp.txt al archivo price.txt y simplemente eliminaremos el archivo temporal.

  cp temp.txt $output
  rm temp.txt

Imprimiendo el precio 

Casi terminamos. Solo necesitamos imprimir el precio, como tenemos almacenado el precio en el archivo, necesitamos almacenarlo en la variable para imprimirlo de acuerdo a nuestras necesidades. Usaremos un ciclo while hasta que el archivo llegue al final del archivo y extraigamos la única línea en una variable. Finalmente, usamos el comando echo para imprimir el precio. 

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

Para una capa de código legible, crearemos funciones para cada tarea, es decir, para dividir o raspar la página web y para imprimir el precio. 

function strip_html(){
  grep -oP '(?<=<span class="no-wrap" data-price-btc).*?(?=</span>)' $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" 
}

A continuación se muestra la implementación completa.

Hacer varias modificaciones, como borrar la salida de cURL a /dev/null, vaciará la salida y hará que el bucle sea un poco más limpio. Si muestra algún error, elimine esos comandos. También tomamos la entrada del usuario y almacenamos el valor en la variable de moneda.

#!/bin/bash

function strip_html(){
  grep -oP '(?<=<span class="no-wrap" data-price-btc).*?(?=</span>)' $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

Publicación traducida automáticamente

Artículo escrito por meetgor y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *