Bases para el periodismo de datos

Table of Contents

Primera sesión

whoami

Soy Adolfo Antón Bravo, doctor en Ciencias de la Información por la Universidad Complutense de Madrid. He trabajado durante casi diez años como socio de una cooperativa de servicios informáticos con software libre. Anteriormente trabajé de diseño web, diseño gráfico y periodista en diversos medios. Me podéis encontrar por:

Presentación

El programa del curso es muy ambicioso. Cada una de las partes podría llevarnos todo el curso. No hay obligación de dar todo, pero sí que es importante que sentemos lo más sólidamente posible unas buenas bases sobre las que poder aprender de todas esas u otras tecnologías de ahora en adelante y seamos capaces de acometer todo tipo de proyectos de periodismo de datos, ya sea porque podemos hacerlo, porque podemos aprenderlo o porque podemos pedir ayuda especializada.

Al ser un curso presencial y colectivo, es importante que vayamos a la par, que aprendamos todxs. En este sentido, es muy importante decir en todo momento las dudas que tenemos, los fallos que se producen cuando intentamos hacer algo, no tener miedo a exponer la dificultad, los errores o lo que nos sugiere lo que estamos haciendo. De esta manera, no solo aprenderéis más quien realiza la pregunta sino que aprenderemos todxs, yo incluido.

Introducción al Periodismo de Datos

Dado que todxs -menos uno- sois periodistas, nos vamos a saltar la introducción al periodismo de datos ya que creo que es mejor que vayamos al turrón. directamente.

La introducción que normalmente realizo –en construcción- la podéis encontrar aquí.

Recolección de datos, ejemplo

Empezamos con una recolección de datos de todxs vosotrxs y de vuestras aptitudes para saber/ver varias cosas:

  • Quiénes sois
  • Qué estudios tenéis
  • Dónde habéis estudiado
  • De dónde venís

En esta recopilación se plantean algunas cuestiones habituales que ocurren cada vez que pensamos en un modelo de datos.

Además, hay algunos datos controvertidos por su caracter personal como:

  • Edad
  • Género

El proceso de recolección es una de las fases más importantes del proceso del periodismo de datos.

En relación a vuestras aptitudes, sirve para:

  • Saber cómo os consideráis en relación a algunos saberes importantes para el periodismo de datos.
  • Orientar las horas del curso.

Al final del curso, haremos otra recogida de datos y veremos cómo os ha ido.

Terminal

En este curso vamos a empezar por la terminal. Cuando me refiero a la terminal en realidad me refiero a una emulación de la terminal que era la interfaz de texto que tenían los ordenadores antes de las interfaces gráficas.

También se le conoce por consola, en cuanto que es una consola –aunque mucha gente lo puede confundir con una consola de videojuegos– o por línea de comandos, ya que se introducen comandos.

CLI, GUI y NUI

En la terminal se introducen comandos que ejecutan programas CLI, acrónimo que obedece a Command Line Interface o interfaz de línea de comandos.

En los entornos gráficos o interfaces gráficas hay programas GUI, acrónimom que responde a Graphic User Interface o intefaz gráfica de usuarix.

Pero también hemos trabajado -de hecho lo hacemos todos los días- con interfaces NUI (Natural User Interface o interfaz natural de usuarix) como pueden ser las pantallas capacitivas multitáctiles, Kinect –con el movimiento– o Siri o Alexia –con el reconocimiento de lenguaje natural–.

Algo de contexto histórico

Al inicio de los ordenadores, solo había líneas de comandos para comunicarnos con ellos. Bell Telephone lanzó en 1969 V1 sobre UNIX Timeshare System. UNIX tenía la shell sh que era la única forma de comunicarse con el ordenador.

Así fue hasta 1973, cuando Las GUI fueron desarrollados en el Centro de Investigación de Xerox en Palo Alto (Palo Alto Research Center, PARC).

Tiempo después, Apple pagó para estudiar la idea, que finalmente se concreto en su GUI.

El MIT desarrolla una GUI para Unix en 1986, X.

El sistema XFree86 de Linux se desarrolló en 1996, una implementación libre del original X, al que homenajea en el nombre.

Bienvenida a BASH

Bash (Bourne-again shell) es a la vez un programa que interpreta órdenes y un lenguaje de programación. Es la shell POSIX que viene por defecto en la mayoría de las distribuciones.

Se trata de un acrónimo recursivo y juego de palabras –una práctica habitual en el movimiento del software libre– que significa "Shell vuelta a nacer", en un homenaje a uno de los primeros intérpretes de Unix Bourne Shell, escrita por Stephen Bourne en 1978 para Unix v.7 (Bell Labs). Brian Fox escribe Bash para GNU en 1987.

Ventajas de la línea de comandos

  • Ahorras tiempo, muuuuucho tieeeeempo
  • Te ofrecen una alternativa a las GUI.
  • Te acercan más a cómo funcionan los sistemas POSIX.
  • Funcionas con atajos compartidos.
  • Te preparan para la programación.
  • Aprendes otra forma de hacer las cosas.
  • Te empodera.

¿Cómo empezamos?

Necesitamos un programa que emula la terminal.

GNU/Linux

Abrimos la terminal. Entiendo que si tienes GNU/Linux, sabes hacer esto, pero si no, basta con buscar terminal entre los programas que tenemos instalados.

MacOSX

Lxs usuarixs de MacOSX lo tienen aparentemente más fácil dado que tienen un programa llamado Terminal (Utilidades –> Terminal) que es un buen comienzo. En versiones anteriores de MacOSX puede haber problemas o inconvenientes, ya sea porque no esté activado XCode o porque sea difícil hacerlo.

Windows

Aunque versiones modernas –Windows 10– proveé una terminal, lo haremos con un programa llamado Cygwin que ofrece una completa emulación de terminal POSIX en Windows que a la postre puede resultar incluso más fácil de usar que la de Mac.

Cygwin

Cygwin es una emulación de la terminal UNIX en Windows.

Aunque este es un paso obligatorio para lxs usuarixs de Windows, el resto debe atender pues se explican conceptos que nos van a resultar útiles en otros momentos del curso.

Instalación

Hemos de hacer 4 pasos:

  • Descarga del programa.
  • Instalar apt-cyg y con ello el resto de paquetes con los que queremos trabajar.
  • Instalar nano como editor por defecto en vez de vi.
  • Cambiar la variable db_home para acceder a la estructura de directorios de Windows.

Salvo la descarga del programa en sí, el orden de las siguientes tareas responde a nuestros intereses. Lo explicamos.

Instalar paquetes

La consola viene con un conjunto de paquetes básicos. Para usar más paquetes, en el momento de la instalación del setup, tenemos que elegir los paquetes.

Instalamos nano porque necesitamos un editor de textos en la consola, un editor de textos CLI que nos aporta velocidad y precisión. Y necesitaremos más.

Una vez que lo instalamos, empezamos a utilizar Cywgin. Pero, ¿qué pasa si quermeos otro programa? Que hemos de cerrar Cywgin y volver a correr el instalador.

Podrías pensar que "¿por qué no instalar todos de una sola vez?", porque es una mala práctica, no tiene sentido y ocuparía muchísimo. Es como si para consultar un libro en una biblioteca tuvieras que descargarte todos…

Para facilitar este proceso utilizaremos apt-cyg, que es un gestor de paquetes –programas– para cygwin.

Algunos paquetes interesantes

  • nano, editor de texto.
  • git, para trabajar con git, software de control de versiones.
  • imagemagick, para manipular imágenes.
  • emacs, editor de texto.
  • python, para trabajar con Python.
  • R, para trabajar con R.
  • perl, para trabajar con perl.
  • ruby, para trabajar con ruby.
  • tesseract, herramienta de reconocimiento óptico de caracteres (OCR), con los paquetes en inglés y español dado que son los idiomas más habituales.
  • grep, para realizar búsquedas en el texto.
  • pdfgrep: para realizar búsquedas en texto de pdfs.
  • sgrep, para realizar búsquedas de texto en documentos SGML, XML o HTML.
  • awk y gawk, para procesar texto.
  • sed, para editar flujos de texto.
  • qpdf, para transformación de PDF
  • xpdf, para visionar y otras operaciones con pdf
  • odt2txt, para pasar un odt a txt.
  • xlsx2csv, para pasar un xlsx a csv.
  • p7zip, archivar y comprimir datos.
  • gzip, compresor de datos
  • unzip, descompresor de datos
  • zip, compresor de datos
  • lynx, visor web
  • links, visor web
  • curl, transferencia de archivos multiprotocolo
  • wget, descargar archivos de la web
  • less, paginador, similar a more

apt-cyg

apt-cyg es un gestor de paquetes de Cygwin que funciona en línea de comandos. El nombre proviene de ser como un apt para Cygwin. Un APT (Advanced Package Tool) es un conjunto de herramientas para manejar los paquetes –programas– de los sistemas Debian GNU/Linux. Se ha hecho muy popular su funcionamiento y otros sistemas operativos lo han imitado porque permite:

  • Instalar programas.
  • Desinstalar programas.
  • Actualizar programas.
  • Resolver dependencias de los programas de forma automática.

Para instalarlo, tal como cuentan en su página web:

lynx -source rawgit.com/transcode-open/apt-cyg/master/apt-cyg > apt-cyg
install apt-cyg /bin

Cerramos Cygwin y volvemos a abrirlo.

Ahora ya podremos instalar un editor como nano como sigue:

apt-cyg install nano

De su ayuda, vemos el listado de opciones –argumentos– que tiene:

install
para instalar paquetes.
remove
para borrar paquetes.
update
descarga una copia de la lista de paquetes del servidor.
download
descarga los paquetes del servidor pero no los instala ni actualiza.
show
muestra información del paquete.
depends
muestra el árbol de dependencia de un paquete.
rdepends
produce un arbol de paquetes que dependen de ese. Produce a tree of packages that depend on the named package.
list
busca en los paquetes instalados coincidencias con esa expresión regular.
listall
buscará cada paquete en el listado de paquetes por coincidencias con esa expresión regular.
category
muestra todos los paquetes que forman parte de una categoría.
listfiles
lista los archivos que pertenecen a un paquete. Se pueden especificar varios archivos.
search
busca por paquetes descargados propietarios de uno o varios archivos.
searchall
busca en cygwin.com información sobre los paquetes. El objetivo es un archivo y searchall devolverá los paquetes que contengan ese archivo.
packageof
seguido de archivos o instrucciones, localiza paquetes que los contiene.

Cambiar la home de Cygwin

Por defecto, la home del usuarix de Cygwin es el directorio de instalación del programa.

Para disfrutar de Cygwin y acceder a todo el disco, debemos modificar la variable db_home en /etc/nsswitch.conf con nuestro editor nano:

nano /etc/nsswitch.conf

Y escribimos:

db_home: windows

O de forma equivalente:

db_home: /%H

Tened en cuenta que en los archivos de configuración, la almohadilla # que aparece al principio de línea significa que la línea está comentada, es decir, que no la va a leer el programa que quiera leerla para hacer algo.

Así que os pueden quedar varias líneas comentadas, incluso contad lo que habéis hecho en una línea comentada, para que cuando volváis a este archivo sepáis por qué esta línea es así:

Ahora modifico la línea de la variable db_home

De esta última manera puedes interpretar el esquema y hacer que estén dentro del subdirectorio cygwin, por ejemplo:

db_home: /%H/cygwin

Si a alguien no le funciona, puede proponer este otro método que proponen en página:

mkpasswd -l -p "$(cygpath -H)" > /etc/passwd

Comandos de Cygwin en la consola de Windows

Esto sería un plus, no lo vimos pero podría hacerse según este blog.

En las propiedades del sistema, en la columna izquierda pincha en propiedades de sistema avanzadas para abrir la ventana de propiedades.

En la pestaña de avanzados, pincha en las variables de entorno abajo. Busca la variable path y pincha en editar. Al final, añadimos la localización de Cygwin:


;C:\Cygwin\bin

Nótese el punto y coma para separarlo de los valores anteriores.

Pincha en OK y cierra la ventana. En el prompt de windows ya puedes ejecutar comandos UNIX.

Configuración de editor por defecto

Cuando editamos un archivo de configuración, por ejemplo de git, el programa que utiliza por defecto es vi, complicado pero no imposible (manual en inglés y español).

Si os mola el rollo vi, sería mejor instalar vim (manual).

En este caso vamos a modificarlo por nano. Para ello, editaremos desde el propio nano el archivo .bashrc del directorio de Cygwin o de la terminal y pondremos:

export VISUAL=nano
export EDITOR="$VISUAL"

Algunas utilidades

Interrumpir un comando

Para interrrumpir el curso de un comando, se puede pulsar a la vez las teclas de Ctrl y c, es decir, C-c

Ctrl + c

Para que esto no suponga un lío, lo habitual es presionar primero la letra Ctrl y, sin soltarla, pulsar c una vez. Luego soltar en orden inverso, primero la c y luego Ctrl.

Limpiar la línea

Para limpiar la línea con algo que hemos escrito y podríamos borrar con la tecla de Backspace, podríamos pulsar la combinación de teclas C-u.

Ctrl + u

Salir de la terminal

Se puede salir de la sesión con el comando exit o con la combinación de teclas C-d.

Aliases

Esto fue algo que citamos pero que no hicimos, si alguien quiere adaptarlo a sus necesidades, bienvenido sea.

Se pueden hacer alias de los comandos e incluirlos en .bashrc. Por ejemplo:

Un alias de ls para que siempre que lo invoquemos haga ls -aF --color:

alias ls='ls -aF --color=always'

O un comando nuevo, por ejemplo ll, que lanza ls -l:

alias ll='ls -l'

Podemos renombrar un comando, como por ejemplo que grep sea search:

alias search=grep

O que al escribir .. subamos un directorio con cd ../:

alias ..='cd ../'

Pros y contras: hay personas que han personalizado tanto su consola que luego se van a otra y no se apañan. Conviene mantener un equilibrio entre ventajas e inconvenientes.

Comandos como explorador de archivos

whoami

Dice cuál es la cuenta de usuarix que estás empleando:

whoami

ls

Lista los archivos del punto en el que nos encontramos. Viene del inglés list. Si lo lanzamos sin argumentos, obtendremos un listado de los archivos y directorios que contiene ese directorio:

ls

ls [opciones] lista los archivos del punto en el que nos encontramos.

  • -a, lista todos los archivos.
  • -l, lista en formato largo

Para emplear argumentos, utilizaremos la estructura:

ls -a

Si queremos saber la información de cada archivo y directorio, lo haremos con la opción -l:

ls -l

pwd

pwd es el acrónimo de print working directory o muestra por pantalla el directorio de trabajo actual.

Es decir, imprime la ruta absoluta del sistema donde nos encontramos.

pwd

touch

Con touch [archivo], creamos archivo vacío. Podemos usar una extensión o no, a bash le va a dar igual.

touch archivo-para-borrar

Cuando estoy probando, pongo ese tipo de nombres para saber claramente que lo podría borrar ya que si no lo hago inmediatamente, igual más tarde no sé de qué iba.

Ojo de no utilizar mayúsculas, caracteres que no sean ASCII –los ingleses– o espacios en blanco. Para separar palabras, podemos usar los guiones medios –los prefiero a los bajos por cuestiones prácticas, aunque en realidad se han utilizado más los guiones bajos o underscores– o la nomenclatura camelCase (lower, para que la primera palabra empiece por minúsculas.)

file

Este comando permite saber qué tipo de formato es el de cualquier archivo.

Así, si hacemos file sobre archivo-para-borrar, nos dirá:

archivo-para-borrar: empty

empty, vacío.

Si vemos un archivo con terminación txt o el .bashrc que hemos editado antes, dirá otra cosa:

/home/flow/.bashrc: ASCII text

mkdir

Para crear un directorio, usamos mkdir, make directory. Si luego queremos ir a este directorio, tendremos que usar el comando cd.

cd

Con cd cambiamos de directorio. Viene de las iniciales del inglés change directory. Si lo lanzamos sin argumentos vamos a nuestro espacio home definido en la variable de entorno HOME.

Para cambiar de directorio, podemos elegir la ruta absoluta o la relativa.

En sistemas *Unix, como son GNU/Linux o MacOSX, la ruta absoluta empieza por una barra / que sería la raíz del sistema, como el tronco del árbol de donde salen las ramas que son las distintas carpetas. Hay una jerarquía. Cada carpeta/directorio se separa con una barra /.

En los sistemas Windows, la raíz es C:\. Las carpetas o directorios se separan con la barra invertida \.

cd [ruta]
  • Atajos de rutas
    • cd, vamos a la home del usuario
    • cd ., vamos al directorio en el que estamos.
    • cd .., vamos al directorio superior
    • cd ~, vamos al directorio home del usuario.
    • cd -, vamos al directorio donde estábamos antes.

    Con esos atajos también podemos construir rutas, por ejemplo, con cd ~/Documentos vamos al directorio Documentos del usuario con el que estamos (en un ordenador con GNU/Linux)

    cd [ruta], change directory, cambia al directorio elegido. Podemos escribir la ruta absoluta o bien con atajos:

    • cd, vamos a la home del usuario
    • cd ., vamos al directorio en el que estamos.
    • cd .., vamos al directorio superior
    • cd ~, vamos al directorio home del usuario.

    Con esos atajos también podemos construir rutas, por ejemplo, con cd ~/Documentos vamos al directorio Documentos del usuario con el que estamos.

cp

Con cp copiamos archivos y/o directorios.

cp [opciones] [origen] [destino]
  • Con cp -r copia los directorios recursivamente
  • Si queremos copiar varios archivos/directorios en un directorio, el último que ponemos es el destino.

mv

Con mv un archivo o directorio completo. También sirve para renombrar, aunque para esto tenemos a rename.

mv [origen] [destino]

env

Si queremos ver o saber qué variables maneja el sistema, podemos verlas con el comando env.

env

Para ver una en concreto, usamos echo, que es un comando que nos devuelve lo que le pidamos. En este caso, le pedimos que nos devuelva una variable, por ejemplo, de configuración del aspecto del prompt de la línea de comandos:

echo $PS1

Con el carácter reservado de bash $ llamamos a una variable y con PS1 a esa en concreto.

Miscelánea

Buscadores

Segunda sesión

Repaso de la primera sesión

Viene una persona que no vino el primer día y además contamos con un posible nuevo compañero.

Operadores de búsqueda

Hemos tocado los operadores de búsqueda de soslayo, pero os invito a explorarlos más para ser más eficaces en el apartado la Web como fuente de datos del recopilatorio de herramientas de scraping que tengo en Github.

El ejemplo que vimos fue:

site:blog.infotics.es editor de textos

Donde hago una búsqueda sobre mi blog para encontrar un artículo en el que hablo sobre editores de texto.

Editor de textos

Del artículo que os señalo, resumo las características que debe tener cualquier buen editor de texto:

  • Herramienta de búsqueda y reemplazo de texto
  • Que se combina con el uso de expresiones regulares
  • Indentado de texto, para los bloques de código o el código.
  • Resaltado de sintaxis, para colorear las distintas partes del documento según de qué se trata.
  • Modo esquema, para visualizar rápidamente documentos complejos.
  • Ejecución de código, para que los bloques de código produzcan texto.

Aunque vimos varias opciones de editores GUI al final nos decidimos por nano.

Repaso de la instalación de apt-cyg en Cygwin

El software apt-cyg se utiliza en Cygwin para la gestión de paquetes -comandos, programas- en Cygwin.

Para instalarlo, en la página web nos sugieren hacerlo copiando y pegando en la terminal -Cygwin- esta línea:

lynx -source rawgit.com/transcode-open/apt-cyg/master/apt-cyg > apt-cyg

Como muchxs no teníais lynx, lo descargamos corriendo de nuevo el instalador de Cygwin.

En el caso de Mac, conviene instalar brew.

Brew

Se puede descagar de brew.sh

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Entonces:

brew install wget

O bien:

brew cask install firefox

lynx

Volviendo al manual de Cywgin, ejecutamos en la consola la siguiente línea

lynx -source rawgit.com/transcode-open/apt-cyg/master/apt-cyg > apt-cyg

Luego le damos a Enter.

Esta línea hace varias cosas:

  • Utiliza el comando lynx, que es un navegador CLI, para ver la página del código de apt-cyg.
  • Con la opción -source, lo que hace es mostrar el código fuente de la página, por lo que así tenemos lo que queremos, el código del comando apt-cyg.
  • Luego emplea el operador de bash > (luego explicamos esto más) para enviar ese código a un archivo que creamos en ese momento que llamaremos apt-cyg.

A continuación, instalamos en nuestro cygwin ese comando en el directorio/carpeta donde se encuentran los programas –los binarios, los ejecutables–, que es /bin:

install apt-cyg /bin

Cerramos Cywgin y volvemos a abrirlo.

A partir de aquí, ya podremos utilizar apt-cyg para instalar comandos.

Una de las primeras cosas que hicimos fue modificar el archivo /etc/nsswitch.conf para que la home de Cywgin fuera la de Windows y no la propia de Cygwin.

Para ello, usamos nano:

nano /etc/nsswitch.conf

Y vemos esto:

# /etc/nsswitch.conf
#
#    This file is read once by the first process in a Cygwin process tree.
#    To pick up changes, restart all Cygwin processes.  For a description
#    see https://cygwin.com/cygwin-ug-net/ntsec.html#ntsec-mapping-nsswitch
#
# Defaults:
# passwd:   files db
# group:    files db
# db_enum:  cache builtin
# db_home:  /home/%U
# db_shell: /bin/bash
# db_gecos: <empty>
db_home: windows
db_home:  /%H

En este archivo, he añadido esas dos líneas al final. Nótese que no están con una almohadilla al principio de línea, lo que indica que no están comentadas.

Grupo de Telegram

Hemos creado un grupo de Telegram para intercambiar este tipo de archivos y ser más operativos en clase.

Poco a poco ha ido añadiéndose todo el mundo.

Símbolos escapados

Los símbolos o caracteres que se escapan son aquellos que utiliza el lenguaje que estemos utilizando para sus propias órdenes.

Por ejemplo, en HTML hay que escapar el carácter & ya que es el carácter con el que se nombran las entidades HTML:

&amp;

API de BASH

BASH tiene una API muy sencilla y muy potente. Una API (Application Programming Interface o interfaz de programación de la aplicación) es el código para comunicarnos con un programa determinado. En este caso, con BASH.

Cuando ejecutas un comando en la shell, se producen tres procesos:

  • La salida del comando, que es lo que devueve el comando, normalmente en la terminal, llamada STDOUT por STandarD OUTput o salida estándar.
  • La entrada de datos, argumentos o comandos es lo que se conoce como STDIN por STandarD INput.
  • La salida de errores, si ha dado errores, que se llama STDERR por STandarD Error o error estándar.

Sorry, your browser does not support SVG.

Figure 1: Diagrama de funcionamiento de STDIN, STDOUT y STERR. Fuente: Wikipedia: Esquema de POSIX y C de entrada estándar. Licencia Dominio Público.

Atajos de Bash

Comando Descripción Ejemplo
C-d o exit Cierra la ventana salida
cd Cambia el directorio cd test
pwd Mostrar el directorio actual cd (Windows) o pwd (Mac OS / Linux)
ls Lista directorios/archivos ls .
cp Copia de archivos cp ruta-origen ruta-destino
mv Mueve archivos mv ruta-origen c:\test\test.txt c:\windows\test.txt
mkdir Crea un nuevo directorio mkdir testdirectory
rm Eliminar un archivo rm ruta-archivo
rm -rf Fuerza la eliminación de un Directorio de forma recursiva rm -r ruta-directorio

Comodines

Los comodines permiten usar valores conocidos con valores comodín.

Hay tres operadores:

  • *, para cualquier número de caracteres.
  • ?, para un carácter.
  • [x-y], para un rango.

*

Podemos listar todos los csv con el comodín *, ya que puede haber archivos con un carácter o varios.

ls *.csv

De esta manera listaremos todos los archivos csv, pero también #+BEGIN_SRC sh :output org ls *.csv

#+END_SRC

black_corrupcion.csv
black-is-black_backup.csv
black-is-black.csv

?

El comodín ? sirve para solo un carácter, cualesquiera. Por ejemplo, si tuviéramos archivos que solo difieren en un carácter, podemos listar ambos.

Imaginemos que tenemos archivos 1.pdf, 2.pdf, 3.pdf, etc. Podríamos listarlos con el comodín ?:

ls ?.pdf

[]

El comodín corchetes cuadrados o [] permite buscar rangos de números o letras.

si queremos buscar en el csv tanto CLESA como BLESA, podemos escribir:

grep [B-C]LESA black-is-black.csv | wc -l

Proyectos interesantes referenciados

  • De Civio, España en llamas

Software hablado

Fun-da-men-tal?

How (not) to be a danger to yourself and others using the command line:

Taller de la conferencia de periodismo de datos de EE.UU. (NICAR) de 2013:

Harkening back to an earlier era of computing, the command line can easily seem like magic. Incantations are learned by rote, passed on by word of mouth from user to user, or written into arcane and impenetrable documentation. But live in fear no more! We will illuminate its nature and bind it to our use, navigating computers, manipulating files, and opening a comprehensible gateway to a world of pro-user and developer tools. Attendees should bring their laptops and be prepared to discover the Linux or Mac command line. (Note: Windows users may also learn transferable skills)

¿Puede un periodista usar la línea de comandos?

Esta sesión comienza con la explicación de un conjunto muy básico de comandos con los que nos moveremos por el sistema de ficheros. Progresivamente iremos viendo cómo se pueden usar otros comandos para hacer el tratamiento de los datos que podemos tener en nuestro sistema de ficheros, y como podemos automatizar muchas de estas tareas, tan necesarias cuando uno tiene que hacer preprocesamiento de datos.

Introducción a la línea de comandos

Introducción a la línea de comandos de Django Girls. Django es un framework para el desarrollo web en Python. Vaya, ¿si se sabe de Python para qué se necesita Bash? Precisamente.

Tercera sesión

URL y más allá

Si queremos interactuar con una web, hacer una página, hacer web scraping, en definitiva, entender algo de la web, debemos saber qué es una URL.

Qué es una URL… el acrónimo significa Uniform Resource Locator, localizador de recursos uniformes. Esto ya da algunas pistas:

  • Es un localizador, luego seguirá alguna nomenclatura.
  • Localiza recursos, que es como se denominan genéricamente los archivos, documentos, páginas web, direcciones de correo electrónico o cualquier cosa electrónica: recursos.
  • Es uniforme, luego un localizador no choca con otros.

Veamos un ejemplo de URL, la web del diario británico The Guardian:

https://www.theguardian.com/international

Esta dirección URL se descompone en:

  • Protocolo: https
  • Separación protocolo-dominio: ://
  • Dominio completo: www.theguardian.com
    • dominio mínimo: theguardian.com
      • .com: TLD
      • theguardian: el proyecto
    • www: subdominio
  • /international : estructura de ficheros/contenidos

Repaso de atajos

Ordenador

Aunque utilizamos teclados QWERTY –por la disposición de las teclas–, cada ordenador dispone otras teclas o caracteres en uno u otro lugar. O viceversa, aunque hay diferencias, hay un gran teclado común que podemos explotar si sabemos algo de mecanografía e incorporamos algunas otras teclas/caracteres.

Sistema operativo

Cada sistema operativo e incluso cada versión del sistema utiliza unas u otras formas de acceder al contenido. Debemos familiarizarnos con ello para mejorar la productividad.

Aplicaciones

También las aplicaciones tienen sus particularidades, pero hay unas normas de accesibilidad a las aplicaciones que sirven para que nos apoyemos en el teclado como vehículo de nuestra interacción con el ordenador/aplicación. Explotar esta relación hará que seamos más eficientes.

Navegador

Como cualquier otra aplicación, se puede aprovechar esa accesibilidad. Pero además, traerá sus propios atajos o shortcuts. Una búsqueda apropiada en nuestro buscador favorito nos devolverá por seguro alguna referencia interesante. Merece la pena que empleemos algo de tiempo para con las aplicaciones que más a menudo utilizamos.

Web

El contenido web en sí también cumple unos parámetros de accesibilidad, aunque en este caso es probablemente en el que menos se cumplen, en general. Una buena forma de probarlo es utilizar el tabulador para pasar del texto de un enlace a otro. Si la página está bien realizada, tendrá teclas de acceso al contenido o accesskeys.

Open Refine

Open Refine lo llaman la navaja suiza del análisis de datos. Nos permite explorar de una forma muy sencilla grandes archivos CSV, pero también realizar transformaciones de datos o incluso de formatos.

Descarga de Open Refine:

http://openrefine.org/download.html

En esta sesión no pudimos avanzar por las distintas situaciones de cada uno de los equipos. Fundamentalmente:

  • Actualización de la máquina virtual de Java.
  • Aceptación del uso de aplicaciones "no seguras" por parte de MacOSX.

Manual de Open Refine:

Para quienes lo vayan consiguiendo, les recomiendo echar un vistazo a mis apuntes sobre Refine.

Personalización de la línea de comandos

Esto no lo pudimos realizar juntxs pero os dejo este enlace por si queréis probarlo.

Análisis de datos

Hemos empezado bajándonos este archivo de mercados de barrio del portal de datos del ayuntamiento de Madrid. Pero como no era muy grande, hemos pasado al tutorial de Óscar Corcho ¿Puede un periodista usar la línea de comandos?, donde compartía un dataset de comercios de Madrid.

Como no lo encuentro en su lugar de origen, en el portal de datos abiertos del Ayuntamiento de Madrid, tiro de biblioteca y lo comparto por aquí, pero lo vamos a bajar con curl:

curl -L https://nube.egelesta.net/s/PnCwxyeG8rr23oL/download > data/comercios-madrid.csv

Lo ponemos en la carpeta data

He encontrado este otro archivo PDF que sobre los microdatos de este archivo.

Para descargarlo, podemos emplear curl:

curl -O https://datos.madrid.es/FWProjects/egob/contenidos/datasets/ficheros/Comercio_CensoLocalesActividades/ConceptosFundamentalesCLA.pdf

Antes de pasar a las operaciones básicas de de exploración del archivo, detengámonos en lo que hemos hecho y tres comandos con los que nos podemos descargar archivos:

Descarga de archivos

En la anterior sesión usamos lynx para descargarnos el programa apt-cyg. En esta ocasión vamos v ver otros dos comandos, hechos más a propósito para esa tarea:

curl

curl es una herramienta para transferir datos de o hacia un servidor a través de uno de los protocolos soportados. Nos interesa porque soporta tanto HTTP como HTTPS. Para descargarnos un archivo sería:

curl https://nube.egelesta.net/s/PnCwxyeG8rr23oL/download > data/comercios-madrid.csv

De esta manera, redirigimos la salida estándar al archivo deseado. También podríamos haberlo hecho con curl -o nombre-archivo url:

curl -o data/comercios-madrid.csv https://nube.egelesta.net/s/PnCwxyeG8rr23oL/download

O -O si no quisiéramos cambiar su nombre:

curl -O https://nube.egelesta.net/s/PnCwxyeG8rr23oL/download

Si quisiéramos descargar de una sola vez varios archivos, podríamos poner sus URLs una tras otra después de la opción -O antes de cada URL:

curl -O url1 -O url2 -O url3

Otras dos opciones interesantes son, la de -C para continuar una descarga que se paró, y la de -z para descargar de nuevo un archivo si se ha modificado en una fecha dada.

curl -z -21-dic-11

wget

wget es otro programa creado para descargar archivos. La estructura sería la siguiente:

wget -O ruta-local URL

Con la opción -O damos nombre al archivo que descargamos.

  • Descargar una lista de archivos

    Una opción muy interesante con wget es la opción -i, que permite descargar archivos que estén en una lista en un archivo de texto. Por ejemplo, los cuatro archivos CSV de locales de Madrid son:

    $ cat descarga.txt 
    https://datos.madrid.es/egob/catalogo/209548-148-censo-locales-historico.csv
    https://datos.madrid.es/egob/catalogo/209548-151-censo-locales-historico.csv
    https://datos.madrid.es/egob/catalogo/209548-149-censo-locales-historico.csv
    https://datos.madrid.es/egob/catalogo/209548-150-censo-locales-historico.csv
    
    
  • De forma recursiva

    Con la opción -r descarga un sitio de forma recursiva y crea los directorios tal como están:

    wget -r url
    
  • De forma recursiva, a un solo archivo
    wget -nd -r url
    
  • Todos los archivos de cierto tipo
    wget -A "*.xlsx" -r url
    
  • Ignorar los archivos de cierto tipo
    wget -R "*.exe" -r
    
  • Bibliografía

lynx

Fue de los primeros comandos que conocimos al descargar desde Windows apt-cyg. Se trata de un navegador web en línea de comandos pero se puede utilizar para descargar el código fuente de una página, en estos casos un archivo csv, con la opción --source. Además, debemos llevar la salida estándar a un archivo para guardarlo.

lynx --source https://nube.egelesta.net/s/PnCwxyeG8rr23oL/download > nombre-archivo

Exploración de archivos

wc

Con wc (word count) podemos saber cuántas líneas tiene, cuántas palabras, cuántos caracteres o cuánto pesa:

El esquema de uso sería:

wc [opciones] archivo

Y las opciones son:

  • -l, cuenta líneas
  • -c, cuenta bytes
  • -m, cuenta carácteres
  • -w, cuenta palabras

Me interesa saber cuántas líneas tiene:

wc -l data/comercios-madrid.csv

file

Qué tipo de archivo es, para ello usamos file:

file data/comercios-madrid.csv

du

Para saber cuánto pesa de forma legible, usamos du con las opciones -sh:

du -sh data/comercios-madrid.csv

Donde:

  • -h, pone los datos de forma comprensible.
  • -s, resume.

head

Con head vemos la cabecera del archivo, las diez primeras líneas o filas:

head -1 data/comercios-madrid.csv

Aquí vemos algunas cosas:

  • Que la primera línea es la cabecera del *SV, lo cual está bien.
  • Que los valores de las celdas están entrecomillados para evitar problemas con lo que contienen.
  • Que el separador o delimitador de cada valor es el punto y coma ;.
  • Que al final de línea hay un símbolo ^M, que merece punto aparte.
  • Que los caracteres con tildes no se ven correctamente, que merece punto aparte y que tiene que ver con la codificación del archivo que veíamos antes que era ISO-8859-1 en vez de ISO-8859-15 o UTF-8.
  • Un número de caracteres

    Para ver un número de caracteres, se pone la opción -c. En este caso, 5 caracteres del archivo:

    head -c 5 archivo
    

Qué es "^M"

Tal como cuentan en stackoverflow, está causado por ser el carácter de final de línea de DOS/Windows. El comando dos2unix resuelve el tema:

dos2unix data/comercios-madrid.csv

Volvemos a pasar head, en esta ocasión solo con 3 líneas con la opción -3 para ver si ha funcionado:

head -1 data/comercios-madrid.csv

Codificación del archivo

Dado que el archivo no es ISO-8859-15 o UTF-8 sino ISO-8859-1, no vemos los caracteres con tilde.

Para ello, pasamos el archivo a UTF-8 con iconv:

iconv -f ISO-8859-1 -t UTF-8 data/comercios-madrid.csv > data/comercios-madrid-utf-8.csv

Otra opción es hacerlo con uconv, que se encuentra en el paquete ruby-uconv, y que Jon Avrach señala como más potente que iconv para grandes archivos:

uconv --from-code ISO_8859-1 --to-code UTF8

Veamos si ahora se ven esos caracteres:

grep -rn Hostelería data/comercios-madrid-utf-8.csv | wc -l

Se encuentran 17016, luego se "ven" ;-)

tail

Con tail vemos las diez últimas líneas/filas, a no ser que le pongamos la opción -n, donde n es el número de líneas/filas que podemos ver.

tail -3 data/comercios-madrid-utf-8.csv

split

Una opción que planteaba Óscar era, dadas las dimensiones del archivo, partirlo en trozos con split:

split -l 2000 data/comercios-madrid-utf-8.csv

Lo cual generará 76 ficheros, con nombres xaa, xab, etc., cada uno de ellos con 2000 líneas (excepto el último).

Para moverlos todos a un directorio, primero lo creamos:

mkdir data/comercios-split

Y luego los movemos:

mv x* data/comercios-split/.

grep

Para hacer búsquedas sobre el texto.

Imaginemos que queremos saber cuántos locales de 100 Montaditos hay:

grep -i 'montaditos' data/comercios-madrid-datos-txt.csv |wc -l


La opción -i de grep es para indicarle que no discrimine por mayúsculas o minúsculas, que encuentre todas.

De estos 47 locales en Madrid capital, nos gustaría saber cuántos están en el distrito centro:

grep -E 'MONTADITOS' data/comercios-madrid-datos-txt.csv | grep -Ec 'CENTRO'

Un total de 14 locales, casi un tercio del total.

14

sed

sed -n '5p' ruta-archivo

Cuántas columnas tiene

Para extraer otras columnas, podemos ayudarno si sabemos cuántas columnas tiene. Para ello, dado que sabemos que utiliza el delimitador ;, podemos contar cuántas veces aparece en una línea:

head -1 data/comercios-madrid-utf-8.csv | fgrep -o ";" | wc -l

La opción -o de fgrep busca solo esa cadena.

En esta web, he encontrado esta opción con sed:

head -1 data/comercios-madrid-utf-8.csv | sed 's/[^;]//g' | wc -c

Utiliza sed para borrar de la primera línea todo menos los punto y coma, y luego los cuenta. Más adelante vemos un poco de sed.

cut

Con cut podemos seleccionar columnas del archivo. Imaginad que nos interesan las columnas -los campos- número 3, de distrito; 5, de barrio; 32, de rótulo; 34, de sección; 36, de división; y 38, de epígrafe:

cut -f 3,5,32,34,36,38 -d ';' data/comercios-madrid-utf-8.csv > data/comercios-madrid-datos-txt.csv

Si os devuelve el error: illegal byte sequence, como ha ocurrido en varios MacOSX, se deben ejecutar estos comandos, primero uno y luego el otro:

export LC_CTYPE=C export LANG=C

Y volver a ejecutar cut.

Si hubiéramos querido campos seguidos, podríamos haber combinado las comas para separarlos con el guión para los rangos. Por ejemplo, si quisiéramos los campos del primero al quinto más el décimo:

cut -f 1-5,10 -d ';' data/comercios-madrid-utf-8.csv > data/comercios-1-5-10.csv

Se pueden seleccionar todos los campos menos uno, dos y/o un rango:

cut -d ';' --complement -s -f 7-38

De esta forma, no tendremos los campos del 7 al 38.

También se puede cambiar el delimitador con la opción --output-delimeter:

cut -d ; --complement -s -f 3-5,6-33 --output-delimeter ',' data/comercios-madrid-utf-8.csv

Flujo de texto

sed

Se utiliza para modificar el texto.

  • Buscar y reemplazar

    Por ejemplo, de 100 MONTADITOS quiero convertir 100 en CIEN:

    sed s/100/CIEN/ ComerciosMadrid.csv 
    
    

    Si hay algún carácter en blanco y lo tenemos identificado, como en el caso de "CIEN MONTADITOS ":

    sed s/100 MONTADITOS/CIEN MONTADITOS/ ComerciosMadrid.csv 
    
    
  • Eliminar línea

    Se puede borrar las líneas que contengan algo:

    sed /patrón/d archivo
    
  • Para actualizarlo

    Con la opción -i:

    sed -i /patrón/d archivo
    

Cuarto día

  • Repaso: ¿lo dejamos para el jueves?
  • Open Refine: ¿lo dejamos para el jueves?
  • Github: crear nuestro primer repositorio.
  • Web scraping: si da tiempo, empezamos.

Dudas

Conocer distintos tipos de formatos de (intercambio de) datos

Fundamentalmente hay tres familias de formatos de datos, que también son formatos de intercambio de datos:

  • *SV, valores separados por algo.
  • *ML, lenguajes de marcado.
  • JSON, JavaScript Object Notation, notación de objetos JavaScript.
  • *SV

    El asterisco indica cualquier carácter mientras que SV significa valores separados por. Los caracteres más comunes son el tabulador y la coma, que hacen los formatos TSV (tab separated values, valores separados por tabulador) y CSV (Comma Separated Values, valores separados por comas.

    El formato CSV es el RFC4180 y el TSV IANA-TSV (según aparece en SPARQL 1.1) están soportados por la mayoría de las aplicaciones. Son simples, pesan poco y facilitan el intercambio de datos.

    Son formatos abiertos aunque no estandarizados. También presentan problemas con la codificación de caracteres y el indicador de fin de línea.

    La elección entre uno u otro, como cuentan en stackoverflow, depende de los datos que haya. Básicamente, si los datos no contienen comas, CSV es una buena elección; en caso contrario y siempre que no tengan tabulación, TSV.

    En ambos casos vamos a encontrarnos con problemas con el delimitador de valor, por lo que si aparece habría que indicar que se trata de un carácter más y no un delimitador, lo cual se puede hacer de varias maneras:

    • Quitándolos, lo cual no es muy práctico.
    • Escapándolos, lo cual es tedioso.
    • O la solución más extendida, que es que cada valor se entrecomilla, por lo que se trata como literales. Lo cual puede ser controvertido si hay valores que presentan comillas a su vez

    Ventajas y desventajas:

    • El CSV es más genérico y más conocido y por tanto puede funcionar mejor en más

    escenarios. Por contra, el entrecomillado aumenta el tamaño del archivo y genera también sus inconvenientes.

    • El TSV (<TAB> o \t) no suele presentar el inconveniente del delimitador como es menos conocido pero también lo es el formato.
  • *ML

    ML se refiere a lenguaje de marcas, una forma de anotar un documento de tal forma que su sintaxis sea distinguible del contenido.

    Tradicionalmente se han utilizado las marcas para hacer anotaciones al texto, por ejemplo, en las labores de revisión del texto, pero los lenguajes de marcas van más allá, pues también son una estructuración del contenido y de sus distintas partes.

    Hay ejemplos de lenguajes informáticos en los orientados a labores de impresión, como troff, TeX o LaTeX.

    El nombre ML viene del IBM GML, lengua de marcas generalizadas en el que luego se inspiró SGML, con dos principios:

    • El marcado es declarativo, describe la estructura del documento y los atributos, no se preocupa tanto por su procesado.
    • El marcado debe ser riguroso, de cara a que se pueda procesar y aprovechar como un sistema de base de datos de documentos.

    HTML se basa en -es una instancia de- SGML y XML en HTML. HTML fue construido para la web de documentos y XML se inspiró en esa potencia para realizar un formato de marcas extensible, de cara al intercambio de datos de cualquier aplicación.

    Ha tenido una edad dorada en la década de los 2000, incluso Microsoft convirtió sus formatos de datos a formatos basados en XML.

    Aunque se usa mucho en aplicaciones comerciales o industriales, en la actualidad ha perdido mucho peso en beneficio de JSON, que es más sencillo y nativo para la web.

  • JSON

    JSON (JavaScript Object Notation o notación de objeto de JavaScript) es un formato de texto muy utilizado para el intercambio de datos en la Web.

    Se analiza con la función eval().

    JSON se construye sobre dos estructuras:

    • Una colección de pares nombre-valor: object, record, struct, dictionary, hash table, keyed list, o associative array.
    • Una lista ordenada de valores: array, vector, list, o sequence.
    • Objeto

      Un objeto es un conjunto desordenador de pares de nombre-valor. Un objeto empieza con una llave { y finaliza con cierre de llave }. Cada nombre es seguido por un dos puntos : y los pares nombre-valor son separados por comas ,.

      Ejemplo de objeto:

      objeto:{"nombre":"Fulano","nombre":"Mengano"}
      
    • Array

      Un array o serie es una colección ordenada de valores. El array empieza con un corchete [ y termina con un cierre de corchete ]. Los valores son separados por comas.

      serie:["Fulano","Mengana","Zutanito"]
      
    • Value

      Un value o valor puede ser una cadena de caracteres, un número, un valor nulo, un buleano, un objeto o una serie. Estas estructuras se pueden anidar.

    • string

      Un string o cadena es una secuencia de cero o más caracteres Unicode entrecomillados.

    • number

      Un número es un número salvo los octales o hexadecimales.

    • Ver un JSON en terminal
      python -m json.tool mi_archivo.json
      
      

Tipos de datos

En general, tratamos con:

  • Números enteros o integers
  • Decimales, flotantes o floats
  • Cadenas -de caracteres- o strings
  • Booleanos: verdadero o falso
  • Null: datos nulos
  • Otros objetos

Conversión de datos: XML, CSV, XLSX

  • Pandoc

    Pandoc funciona muy bien como conversor entre formatos de marcas, una auténtica navaja suiza para Markdown, reStructuredText, textile, HTML, DocBook, LaTeX, MediaWiki, TWiki, TikiWiki, Creole 1.0, Vimwiki, roff man, OPML, Emacs Org-Mode, Emacs Muse, txt2tags, Microsoft Word docx, LibreOffice ODT, EPUB o Haddock.

  • Code beautify

    Code Beautify transforma datos de unos a otros.

  • ssconvert

    ssconvert es una utilidad en línea de comandos para transformar hojas de cálculo de unos formatos a otros. Forma parte del programa gnumeric, el gestor de hojas de cálculo de GNOME. Puede trabajar entre xls, xlsx, odf, html, LaTeX, PDF y CSV, entre otros.

    Con ~ ssconvert –list-exporters~ se puede ver la lista de formatos.

  • csv a tsv y viceversa con sed

    De csv a tsv, transformamos la , en tabulador \t:

    sed 's/,/\t/' archivo.csv > archivo.tsv
    

    De tsv a csv, al revés:

    sed 's/,/\t/' archivo.tsv > archivo.csv
    
  • cat y tr
    $ cat archivo.csv | tr "," "\\t" > Galton.tsv
    
  • csvkit

    csvkit es un conjunto de programas en línea de comandos para convertir o trabajar con CSV. Se pueden convertir XLSX o JSON a CSV, entre otras opciones.

  • Open Refine

    Se puede utilizar para pasar de un formato a otro. En este ejemplo, se pasa de XML o JSON a CSV o XLSX.

¿Necesita Open Refine conexión a Internet?

No

Selección por fechas en refine y agrupación en Refine

Sí, lo vemos.

Grep es súper útil y lo demás sobra

Para muestra, un botón: grep1p.png

(Citado en esta presentación)

Se muestra el tiempo que emplean distintos lenguajes en búsqueda de patrones de expresiones regulares. grep y awk ganan ampliamente.

¿Y no vamos a ver algún programita que haga gráficos?

Si da tiempo, veremos datawrapper.

Gestión paquetes windows

Si ya te has acostumbrado a apt-cyg para Cygwin, Chocolatey hace lo mismo para Windows, es decir, es un gestor de programas para Windows.

Github

Lo primero que se necesita es tener git instalado, podemos hacerlo con apt-cyg en Cygwin, Brew en Mac o el modo adecuado en las distribuciones GNU/Linux.

Vamos a trabajar con un servicio web remoto que soporta git, Github. Necesitamos una cuenta en este servicio gratuito.

Creamos un repositorio siguiendo el método de línea de comandos.

Para cualquier duda, se pueden consultar mis notas de Github. Seguimos el

Hagamos nuestra propia web

Para ello, hemos de elegir una plantilla de html5up.net. Recomiendo Prollogue, pero elegid la que queráis.

Si elegís Prologue, descargad el zip y descomprimirlo con unzip en el directorio donde queráis poner la web.

Si no tenéis unzip, solo hay que descargarlo.

Aprovecho para recomendar en Windows un programa gráfico de gestión de archivos comprimidos: 7-zip.

Quinto día

Desorden del día

  • Repaso de Github
  • Repaso de línea de comandos
  • Open Refine
  • Scraping: web y pdf

Repaso de línea de comandos

seq

Con seq podemos crear una secuencia de números.

seq 1 10000 > data/diez-mil.txt

De esta manera, creamos un archivo txt con 10000 líneas con los números de 1 a 10000.

Sipones un número entre medias es el intervalo. Por ejemplo:

seq 1 100 10000 > data/diez-mil-de-cien-en-cien.txt

Crea un archivo con números de 1 a 10000 cada 100.

Web scraping

Web scraping significa literalmente rascar datos de la web. Por ello podemos pensar que cada vez que queramos información de la web debemos hacer web scraping, y eso no es del todo así.

Web scraping sería, estrictamente, sacar algunos datos, los que precisemos, del conjunto de contenidos que muestran las webs. Esto de rascar no es casual, obedece a que aunque HTML es un lenguaje de marcas estructurado y la web puede simular información estructurada y ordenada, ni esto es siempre así –por malas prácticas voluntarias o involuntarias de quienes producen o publican la información web– ni suele estar accesible al estilo base de datos pública de datos abiertos.

Otra opción, que no es scraping, es utilizar un crawler como nuestra querida wget o el todavía no conocido httrack y descargarnos todo el sitio para hacer luego una exploración en local.

Simon Holywell propone esta receta con wget:

wget -H -r --level=5 --restrict-file-names=windows --convert-links -e robots=off http://example.org
  • Se crea una copia local.
  • --convert-links convierte los enlaces en URLs relativas de tal manera que puede explorarse todo el sitio en local.
  • Con --restrict-file-names\=windows se aseguran nombres de archivo seguros, sin parámetros añadidos.

A continuación jugamos un poco con algunos listados y tablas de distintas urls probando:

  • Funciones importHTML() e importXML() de Google Spreadsheets
  • Repaso de curl, wget y lynx

ImportHTML()

Para esto necesitamos una cuenta de Google y abrir una nueva hoja de cálculo.

Con importHTML() podemos llevar a esa hoja de cálculo los datos de una tabla o de un listado de una página web. Para ello conviene tener ciertas nociones de HTML.

Los elementos HTML que se ven afectados son table (tabla), ul, ol y dl (listados).

  • ul, que corresponde a unordered list o lista desordenada, la típica lista donde cada elemento aparece con un punto o un guión.
  • ol, que corresponde a ordered list o lista ordenada, donde los elementos del listado aparecerán ordenados, bien numérica o alfabéticamente, por ejemplo.
  • dl, corresponde con description list, listas de descripciones
  • table, corresponde con una tabla de datos tabulados.

Construiremos la función IMPORTHTML con la url entrecomillada, separado por punto y coma y entrecomillado el elemento del que queremos sacar la información, bien una lista list o una tabla table, seguido del número de elemento en la página de su mismo tipo, separado por otro punto y coma:

=IMPORTHTML("URL";"list|table";n)

ImportXML()

Una vez que hemos probado importHTML() vamos con importXML(). Si la primera tenía tres argumentos, en esta segunda solo son dos, pero el segundo puede ser muy simple o muy complejo.

El esquema es:

IMPORTXML("url";"consulta-xpath")

Como vemos, el primer argumento es la URL sobre la que queremos obtener datos y el segundo es la consulta xpath.

XPATH es el acrónimo de XML Path o ruta XML. Es decir, se trata de identificar los nodos de un archivo XML. La web son archivos HTML pero al ser renderizados por el navegador crea un DOM (Document Object Model, modelo de objetos de documento) como un árbol de objetos que puede ser leído por XPATH.

XPATH

Algunos ejemplos:

  • "nombre_del_nodo", selecciona todos los nodos con ese nombre
  • /, selecciona del nodo root.
  • //, selecciona nodos en el documento desde el nodo actual que coincide con la selección, sin importar donde se encuentran.
  • ., selecciona el nodo actual
  • .., selecciona el nodo padre del nodo actual.
  • @, selecciona atributos

Se pueden consultar mis apuntes de Scraping. Si queréis aprender web scraping, XPATH es el camino.

  • Listado de atributos

    Por ejemplo, si queremos obtener el listado de todos los atributos href que contiene el elemento a que corresponde a los enlaces, de la URL, de una página web, haremos:

    =IMPORTXML("URL";"//a/@href")
    
    
  • Enlaces de una clase

    Pero podríamos elegir sólo los enlaces que tienen una determinada clase, lo que haríamos también con XPath de esta manera:

    =IMPORTXML("URL";"//a[@class='clase']")
    
    
  • Referencia a celdas

    En vez de editar la fórmula completa, se puede poner la URL en una celda, el elemento XPath a buscar en otra y construir la expresión llamando a las celdas:

    =IMPORTXML(celda1;celda2)
    
  • Elementos que comienzan con…

    La potencia de Xpath es infinita y podemos hacer extracciones de datos muy concretas, como por ejemplo seleccionar solo los elementos que comiencen con una clase específica, como [starts-with y luego especificar la clase con el atributo @ donde class es el valor del atributo (@class, 'clase')

    Si queremos sacar todos los enlaces una URL, después de inspeccionar la página, comprobamos que los enlaces se encuentran en un div que tiene la clase clase. Construimos esta fórmula de IMPORTXML

    IMPORTXML("URL"; "//div[starts-with(@class,'clase')]")
    

    Si quisiéramos los enlaces, añadiríamos al final //@href, ya que el enlace se encuentra en el atributo de a, href

    =IMPORTXML("URL"; "//div[starts-with(@class,'clase')]//@href")
    
    

    Puede ser que la página no traiga los enlaces absolutos sino que sean relativos, por lo que podemos concatenarlos con la función CONCATENATE:

    =CONCATENATE("URL",celda-resultados)
    
    

    Y luego estiramos esta función al resto de las celdas que lo requieran.

  • Algunos ejemplos XPath útiles:
    • //, descarga todos los elementos de html que empiecen con <
    • //a, descarga todos los contenidos del elemento a, los enlaces, de la URL que decidamos.
    • //a/@href, descarga todos los contenidos del atributo href del elemento a, que corresponden con la URL del enlace.
    • //input[@type'text']/..=, descarga todos los elementos padre de los elementos de texto input
    • count(//p), cuenta el número de elementos que le digamos, en este caso párrafos p
    • //a[contains(@href, 'protesta')]/@href, encuentra todos los enlaces que contienen la palabra protesta
    • //div[not(@class'left')]=, encuentra todos los div cuyas clases no sean left
    • //img/@alt, muestra todos los textos de los atributos alt de las imágenes img

Sexto día

Desorden del día

  • QGIS
  • Plantilla de HTML
  • Bash avanzado

Repaso Github

Cambiar el editor por defecto

Por defecto, bash y git vienen con el editor vi por defecto. Para cambiarlo, tal como explican en stackoverflow, podemos hacerlo en una o en ambas.

  • core.editor

    Para usar nano o el editor de texto CLI de nuestra elección, corremos:

    git config --global core.editor "nano"
    

    La opción --global es para hacerlo en todo git. Si solo quisiéramos en este repositorio, sería sin esa opción.

  • nano como editor por defecto

    Lo hacemos en dos líneas, con dos variables de entorno:

    export VISUAL=nano
    export EDITOR=$VISUAL
    

Séptimo día

Desorden del día

  • Repaso general
  • Dudas
  • Documentación

Repaso general

He intentado dar un panorama introductorio lo más profundo posible de varias tecnologías. Aposté por que empezáramos por la terminal para no quedarnos faltos de tiempo y creo que habéis conseguido empezar a controlar la herramienta.

La terminal os va a dar las bases para probar, practicar y aprender lo demás.

Para practicar, y retomando lo que hicimos el otro día, vamos a configurar el editor de texto nano para que sea el editor por defecto de la terminal, de git y además para que muestre resaltado de sintaxis.

Recordad que el resaltado de sintaxis es una de las características fundamentales de un editor de textos, tal como contaba en mi blog.

Si no os acordáis la URL del artículo, podemos encontrarlo fácilmente con el operador de búsqueda site: de los busdcadores:

site:infotics.es editor de textos

Resaltado de sintaxis en nano

Para activar el resaltado de sintaxis en nano enlazamos en el archivo de configuración de nano los archivos adecuados.

Primero comprobamos que están en /usr/share/nano. Si no está, podemos descargarnos unos archivos de configuración que encontramos en este repositorio:

git clone https://github.com/scopatz/nanorc.git

Ahora que ya están, se puede editar el archivo de configuración de nano, .nanorc con nano ~/.nanorc:

include "~/.nanorc

Extra

Cron y crontab

Cron es un administrador de tareas programadas. Se activa cada minuto y examina las configuraciones que están en /etc/crontab y en las de cada usuarix.

¿Qué cosas se pueden hacer?

  • Copia de seguridad automatizada.
  • Registros de bases de datos.
  • Sincronización de información.

Para listar las tareas

crontab -l

Para editar el archivo

Para editar el archivo propio de tareas, se hace con crontab -e:

crontab -e

Esto abrirá nuestro archivo de configuración de crontab con nuestro editor CLI que tengamos especificado en la variable $EDITOR. Si no tenemos a nano, se puede usar el comando export para establecer la variable.

export EDITOR=nano

Eliminar el archivo

Para eliminar el archivo de crontab, tan solo hay que borrarlo con la opción -r:

crontab -r

Sintaxis

Se escriben cinco asteriscos separados por espacio o tabulación. En cada uno de los asteriscos se ponen valores para marcar el tiempo de ejecución del cron, en este orden:

  • Minutos.
  • Horas.
  • Día en el mes.
  • Mes.
  • Día en la semana.

A continuación, va el comando a ejecutar.

  • Asterisco: ejecución en todos los periodos de tiempo

    El asterisco * significa ejecutarse en todos los periodos de tiempo de esa unidad de tiempo, es decir:

    • Todos los minutos
    • Todas las horas
    • Todos los días del mes.
    • Todos los meses
    • Todos los días de la semana.
    
    *     *     *   *    *        comando a ejecutar
    -     -     -   -    -
    |     |     |   |    |
    |     |     |   |    +----- día en la semana (0 - 6) (domingo=0)
    |     |     |   +------- mes (1 - 12)
    |     |     +--------- día en el mes (1 - 31)
    |     +----------- hora (0 - 23)
    +------------- minuto (0 - 59)
    
  • Periodos concretos

    Se pueden elegir periodos de tiempo, por ejemplo,

    */15 * * * * /home/flow/scripts/fecha.sh
    
    

    Ejecutará el script cada 15 minutos por el valor */15 en minutos y * en los demás.

    O bien cada cinco horas:

    0 */5 * * * /home/flow/scripts/fecha.sh
    
    
  • Rangos

    Se puede elegir un rango:

    * 6-8 * * * /home/flow/scripts/fecha.sh
    
    • De las 6 a las 8 AM por el valor 6-8, en cada minuto por el valor * de minuto.

    O varios, separados por comas:

    0 8-12,14-20 * * * /home/flow/scripts/fecha.sh 
    
    • Rangos: de 8 a 12 y de 14 a 20 horas.
    • Cada hora exacta: minuto 0, el primer valor.
  • Un día concreto a una hora
    0 6 1 * * /home/flow/scripts/fecha.sh
    
  • Todos los días a una hora concreta
    0 6,20  * * * /home/flow/scripts/fecha.sh
    
    
    • Se ejecuta todos los días por el valor 0.
    • A las 6,20 por el valor 6,20 en las horas.
  • Todos los días de un mes a una hora exacta
    0 6 * 1 * /home/flow/scripts/fecha.sh
    
    • Todos los días de enero por el valor 1 en mes y * en días.
    • A las 6 AM por el valor 6 de hora y 0 de minuto.
  • Todos los lunes a las 6 horas
    0 6 * * 1 /home/flow/scripts/fecha.sh
    
    • Todos los lunes por el valor 1 (el primer día es el domingo que es valor 0).
    • A las 6 AM por el valor 6 de hora y 0 de minuto.

Una tarea del cron

Vamos a crear un script para crear una tarea:

nano scripts/fecha.sh

Y el contenido es:

#/bin/bash

date >> /tmp/fecha.log

Cambiamos los permisos de este archivo para hacerlo ejecutable:

chmod u-x scripts/fecha.sh

Lo ejecutamos para comprobar que funciona:

.scripts/fecha.sh

Y a su vez comprobamos que ha resultado con cat:

cat /tmp/fecha.log

Si en vez de cada minuto queremos hacerlo cada 10 minutos, hemos de fraccionarlo por 10:

*/10 * * * * /home/flow/scripts/fecha.sh

Algunos enlaces desordenados

Author: Adolfo Antón Bravo

Created: 2018-12-30 dom 02:44

Validate