├── README.md └── Readme.org /README.md: -------------------------------------------------------------------------------- 1 |
2 |

Table of Contents

3 |
4 | 128 |
129 |
130 | 131 | Módulo de periodismo de datos de *scraping* donde aprenderemos cosas directamente relacionadas: 132 | 133 | - Web *scraping* 134 | - PDF *scraping* 135 | - Nociones de programación 136 | - Detectar y estructurar información localizada en web o en otros formatos para poder analizarla e interpretarla. 137 | - Volcar y formatear datos de diferentes orígenes para poder gestionarlos. 138 | 139 | Pero también otras cuestiones directamente relacionadas como: 140 | 141 | - Aprender a instalarnos programas adecuadamente 142 | - Resolución de problemas 143 | - Manejo de versiones 144 | - Github 145 | - Tecnologías web 146 | - Empezar a practicar con lenguajes de programación 147 | 148 | # Necesidades técnicas 149 | 150 | - Navegadores [Firefox](http://getfirefox.com/) (o derivados) y [Chrome](https://www.google.es/chrome/browser/desktop/) (o derivados) 151 | - Editor de textos con indentado y resaltado de sintaxis, [elige el que más te guste](http://infotics.es/2015/11/11/editor-de-textos/) 152 | - Extensiones del navegador: [Firebug](http://getfirebug.com/), [Xpath Checker](https://addons.mozilla.org/En-uS/firefox/addon/xpath-checker/), [Tineye](http://www.tineye.com) 153 | - Cuenta Google Drive. 154 | - Programas de copia, descarga, spiders o crawling como [httrack](https://www.httrack.com/) o [Downthemall](http://www.downthemall.net/). 155 | - Programas de web scraping como [Outwit](https://www.outwit.com/), [Import.io](http://import.io) y [kimono](http://kimonolabs.com). 156 | - Programas de tratamiento de PDF como [xpdf](http://www.foolabs.com/xpdf/). 157 | - La terminal, también es posible desde Windows con [cygwin](https://www.cygwin.com/) 158 | - Python, Ruby y R 159 | 160 | # La Web como fuente de datos 161 | 162 | - La web es un fuente de datos inagotable 163 | - De hecho, se puede considerar una gran base de datos. 164 | - Se puede acceder a servicios web anónimos, con perfiles, buscadores generales y específicos. 165 | - El buscador es un software que recopila e indexa archivos almacenados en servidores web y recupera la información conforme a algunos criterios específicos. 166 | 167 | ## Recopilar datos 168 | 169 | - La manera más sencilla de extraer datos de una página web consiste en seleccionar el texto, copiarlo y pegarlo allí donde queremos luego trabajar con ello. 170 | - Si se tratan de datos que se encuentran dispuestos en tablas, los podemos copiar y pegar en nuestra aplicación de hoja de cálculo favorito. 171 | - Es la forma más fácil pero también **manual**. 172 | - Si queremos **automatizar** esa tarea, o incluso **si no nos deja hacerlo manualmente**, tenemos que optar por otras opciones. 173 | - Las opciones más fáciles pasan por que los datos estén bien estructurados, un HTML bien formado 174 | - Se habla de recopilación de datos, *crawling* o *spiding* cuando nos descargamos sitios completos. 175 | - Se habla de *scraping* cuando rascas de aquí y de allá. 176 | 177 | ## Búsqueda avanzada 178 | 179 | - Se puede utilizar búsqueda avanzada en los principales buscadores 180 | - *Google*, *Yahoo!*, *duckduckgo*, *Yandex* o *Bing* 181 | - También están los [operadores de búsqueda](https://support.google.com/websearch/answer/2466433): permiten filtrar las búsquedas. 182 | - Un listado no oficial lo encontrais en [googleguide](http://www.googleguide.com/advanced_operators_reference.html) 183 | 184 | ## Ejemplo con operador `site:` de Google 185 | 186 | - Los operadores de búsqueda nos permiten acotar y especificar más los resultados. 187 | - Se puede buscar una palabra específica en un dominio concreto con `site:dominio` 188 | - Por ejemplo, busquemos la palabra **inmigración** en el sitio de [elpais.com](https://www.google.es/?gfe_rd=cr&ei=QVl-VoOmOtGp8weIvqSwBg#q=site:elpais.com+inmigraci%25C3%25B3n) 189 | - El resultado no varía en función de nuestro perfil o nuestra navegación ya que es sobre un sitio concreto. 190 | - Sí que puede variar desde que he realizado la búsqueda hasta que lo buscáis. 191 | 192 | La búsqueda devuelve 55200 resultados. 193 | 194 | site:elpais.com inmigración 195 | 196 | ## Operador lógico *AND* 197 | 198 | - Cuando buscamos una palabra buscamos unos caracteres escritos de esa manera determinada. 199 | - Si buscamos más de una palabra, comienzan a actuar operadores lógicos. 200 | - Los operadores se utilizan para afinar aun más la búsqueda. 201 | - El operador por defecto cuando se buscan dos palabras es es `+`, `AND` o `Y`. 202 | - En Google se utiliza `+`, no los otros. 203 | - Eso quiere decir que se buscan documentos que contengan esas dos palabras. 204 | 205 | La búsqueda de `inmigración ilegal` devuelve los mismos resultados, 6680, que `inmigración + ilegal` 206 | 207 | site:elpais.com inmigración ilegal 208 | 209 | ## Operador lógico *OR* 210 | 211 | - Otro operador muy utilizado es `OR`, `O` o `|` 212 | - En Google se utilizan `OR` y `|` 213 | - Busca documentos donde aparecen una u otra palabra. 214 | 215 | Si buscamos `inmigración OR ilegal` da los mismos resultados que si buscamos `inmigración | ilegal`, 16700 resultados: 216 | 217 | site:elpais.com inmigración OR ilegal 218 | 219 | ## Palabras reservadas 220 | 221 | - Los operadores lógicos nos introducen en el concepto de las *palabras reservadas*. 222 | - Las palabras reservadas se dan en todos los lenguajes informáticos y son palabras que utiliza el propio lenguaje. 223 | - Son palabras o caracteres reservados `AND`, `OR`, `+`, `-`, `|`, etc. 224 | - Lo cual nos lleva al concepto de *literales* 225 | - Si queremos utilizar esas palabras reservadas como palabra a buscar, deberemos entrecomillarlas. 226 | 227 | Lo cual buscará documentos donde aparezcan las tres palabras: `spain`, `or` y `greece` 228 | 229 | site:theguardian.com spain "or" greece 230 | 231 | ## Búsqueda literal 232 | 233 | - La búsqueda literal sirve para encontrar expresiones específicas. 234 | - Los literales se denominan también en programación *strings* o *cadenas de caracteres*. 235 | - Por ejemplo, la búsqueda de `violencia de género en madrid` encuentra 330 resultados porque hay 330 documentos donde aparece esa expresión tal cual. 236 | 237 | Si queremos que aparezca `violencia de género` y también `madrid`, pero sin estar juntos en la expresión, devuelve 20200 resultados. 238 | 239 | site:elpais.com "violencia de género" madrid 240 | 241 | ## Operador menos 242 | 243 | - Si el operador `+` se utiliza como sinónimo de `OR`, el operador menos reduce los resultados de la búsqueda. 244 | - Con el operador `-` elegimos palabras que no queremos que aparezcan acompañadas de otras. 245 | - Observad que el signo de menos debe estar pegado al texto. 246 | - Seguimos con el ejemplo anterior y **concatenamos operadores** 247 | - Cuántas veces aparece "violencia de género" pero no aparece `2014`, `2011` y `2010`, para que no aparezcan las noticias de esos años, aparecen 9 resultados. 248 | 249 | Incluso se combina con el operador `site:`: 250 | 251 | "violencia de género en españa" -site:wikipedia.org -2014 -2011 -2010 252 | 253 | ## Operador comodín 254 | 255 | - El asterisco encuentra cualquier cosa en medio de una cadena de caracteres. 256 | - Si queremos buscar *violencia de género*, *violencia a las mujeres* y *violencia contra las mujeres*, podemos emplear el operador el operador `|` 257 | 258 | Y apoyarnos en el operador comodín `*` 259 | 260 | site:elpais.com "violencia * mujeres|género" 261 | 262 | ## Debemos saber que 263 | 264 | - Las búsquedas en estos buscadores no son *case sensitive*, es decir, no distinguen entre minúsculas y mayúsculas. 265 | - Si buscamos "violencia de género" obtendremos los mismo resultados que si buscamos "VIOLENCIA DE GÉNERO" 266 | - el uso de estos operadores implica el uso de **expresiones o palabras reservadas** 267 | - Las palabras reservadas son las que el buscador entiende como propias de su vocabulario. 268 | - Para utilizar palabras reservadas en la búsqueda debemos entrecomillarlas. 269 | - Las comillas también se utilizan para buscar literales, expresiones exactas. 270 | 271 | ## Resumen operadores lógicos 272 | 273 | - El operador de restricción `+`, es similar a `AND` 274 | - El operador de restricción `-`, es similar a `NOT` en otros tipos de búsqueda. 275 | - El operador `OR`, donde esté cualquiera de los dos términos, o `|` 276 | - =""=, se entrecomilla el texto exacto que queremos buscar, búsqueda literal. 277 | - Si no queremos aprender estas reglas, podemos usar el buscador avanzado de Google que ofrece una interfaz gráfica en forma de formulario. 278 | 279 | 280 | 281 | ## Operadores de tipos de archivo 282 | 283 | - Otro operador de búsqueda de google es el operador de tipos de archivo. 284 | - Se puede buscar documentos que estén en un determinado formato de archivo en un sitio determinado 285 | - O se pueden buscar palabras que estén en un documento con un formato determinado. 286 | - O concatenar aun más con el operador de sitio y el de tipo de archivo. 287 | 288 | ### Búsqueda en sitio concreto y tipo de archivo concreto 289 | 290 | Busca documentos que estén en formato `xls` en `elpais.com` 291 | 292 | filetype:xls site:elpais.com 293 | 294 | ### Búsqueda de literales en tipo de archivo concreto 295 | 296 | Busca literales `violencia de género` que estén en un documento con un formato `csv` 297 | 298 | filetype:csv "violencia de género" 299 | 300 | ### Búsqueda de literales en tipo de archivo en sitio concreto 301 | 302 | Busca literales `violencia de género` en archivos `csv` en el sitio del `ine.es` 303 | 304 | filetype:csv site:ine.es "violencia de género" 305 | 306 | ## Operadores de búsqueda 307 | 308 | - El listado completo de operadores de búsqueda disponible se encuentra en [Google](https://support.google.com/websearch/answer/2466433?hl=en). 309 | 310 | ### `link:` 311 | 312 | `link:` encuentra páginas que enlazan a cierta página. 313 | 314 | link:okfn.es 315 | 316 | ### `related:` 317 | 318 | `related:` encuentra páginas similares a una de tu elección. 319 | 320 | related:okfn.es 321 | 322 | ### `info:` 323 | 324 | `info:` obtiene información sobre una página web, incluida la versión cacheada de la página, páginas similares y páginas que enlazan con el sitio. 325 | 326 | info:okfn.es 327 | 328 | ### `cache:` 329 | 330 | `cache:` muestra la página la última vez que Google visitó la página. 331 | 332 | cache:okfn.es 333 | 334 | ## Desafíos 335 | 336 | - Busca patrones en la información, los datos o la estructura de las páginas: 337 | 338 | - Estructura de páginas estructurada: 339 | 340 | 341 | 342 | - Una tabla en una web 343 | 344 | 345 | 346 | - Tablas páginadas con *URLs* distintas 347 | 348 | 349 | 350 | # Otras utilidades 351 | 352 | Veremos algunas utilidades que nos pueden ayudar de una u otra manera: 353 | 354 | - *Bitly* 355 | - *Twitter* 356 | - *Archive.org* 357 | - *Wayback Machine* 358 | - Código fuente 359 | - *TinEye* 360 | - Otras: *Readability*, *Downthemall*. 361 | 362 | ## Bit.ly 363 | 364 | - El servicio de *urls* cortas nos puede ayudar a saber cuántas veces se ha compartido un determinado enlace. 365 | - Tenemos que ir a e introducir la *URL* que nos interesa. 366 | - Si ya se ha utilizado, aparecerá una *URL* corta y podremos ver esa información escribiendo la URL seguida del símbolo `+`. 367 | - Así vemos las estadísticas completas de la página, da una idea de lo popular que era la página y de lo que fue utilizado por las redes sociales como *Twitter* o *Facebook*. 368 | 369 | ## Twitter 370 | 371 | - Con *Twitter* hacemos algo parecido a *Bit.ly* 372 | - No vamos a poder disfrutar del mismo nivel de estadísticas. 373 | - Se trata de buscar en el buscador de Twitter un enlace que nos interese y mostrará las últimas veces que se ha compartido. 374 | - No guarda un histórico de todo el tiempo. 375 | 376 | ## La máquina del tiempo de archive.org 377 | 378 | - La herramientas [Wayback Machine](http://archive.org/web/web.php) de [Internet Archive](http://www.archive.org) guarda pantallazos periódicos de las webs 379 | - 456 mil millones de páginas en total que puedes consultar desde su buscador. 380 | - Una vez encontrada esa página, ese dominio, podemos ver en una línea de tiempo los distintos instantes que ha guardado la máquina y ver qué aspecto tenía. 381 | - No guarda muchas imágenes o estilos, por cuestiones de espacio, pero nos puede dar alguna sorpresa. 382 | 383 | ## Código fuente HTML 384 | 385 | - A menudo en el código fuente los programadores han realizado comentarios o han ocultado algo que podía estar en otro momento y que ahora no conviene. 386 | - No hace falta saber de *HTML* pero sí que hay que saber dónde buscar. 387 | - Los comentarios, contenido que el navegador no muestra, se encuentran entre los signos de `` cierre de comentario. 388 | - Por ejemplo, en la página de [The Guardian](http://theguardian.co.uk) ahora ponen que están contratando programadores. 389 | 390 | ## TinEye 391 | 392 | - TinEye permite controlar el uso de las imágenes en un sitio web 393 | - Nos pueda dar pistas sobre el origen, la fuente, otros usos de esa imagen… 394 | - Se puede subir una imagen o bien escribir una *URL*, ya sea de la imagen o de la página web que contiene esa imagen 395 | - Es capaz de mostrar unos resultados que pueden ser curiosos.. Por ejemplo, cuando se produce un acontecimiento importante, se suelen utilizar las mismas imágenes para ilustrarlo. 396 | - Con TinEye podemos ver en qué medios se están utilizando esas imágenes y cuándo lo hicieron, por lo que podemos saber quién lo hizo primero y crear una línea temporal del uso de la imagen. 397 | - Tiene extensiones para Firefox, Opera, Chrome o Safari. 398 | - Ejemplo: 399 | 400 | ## Otras 401 | 402 | - [Readability](http://www.readability.com), servicio web que ayuda a extraer texto de la página web. Dispone de extensión para Firefox. 403 | - [DownThemAll](http://www.downthemall.net/), extensión que permite la descarga de varios archivos a la vez. 404 | 405 | # Outwit Hub 406 | 407 | - Outwit Hub, software y extensión para el navegador que contiene varias utilidades de reconocimiento y extracción de contenidos web y de organizar las colecciones de datos. 408 | - Busca automáticamente a través de páginas. 409 | - La primera vista en el marco de la izquierda es `Página`, mientras que los otros objetos son: `links`, `images`, `data` 410 | - OutWit considera la página web como elementos de datos, por lo que si nos ponemos sobre el objeto `images`, seleccionaremos todas las imágenes. 411 | 412 | ## Conceptos Outwit 413 | 414 | Hay tres conceptos en OutWit Hub: 415 | 416 | 1. Una cesta de la compra llamada *catch* o la *cesta*, discpuesto al pie de la página para recoger todo lo que queramos. 417 | 2. Podemos filtrar la información por cada tipo de datos y recogerla en nuestra cesta. 418 | 3. Puedes navegar a lo largo de varias páginas con el botón de paginación. 419 | 420 | ## Vistas Outwit 421 | 422 | Las vistas que muestra *OutWit* son: 423 | 424 | - *Página*, actual. Muestra imágenes, enlaces, correos electrónicos, textos, rss, enlaces de noticias y otros datos que pueden extraerse de la página. 425 | - *Imágenes*, que aparecen en la página actual. Se pueden filtrar, ordenar y copiar en la cesta. 426 | - *Enlaces*, que aparecen en la página actual. Se pueden filtrar, ordenar y copiar en la cesta. 427 | - *Correos electrónicos*, que aparecen en la página. ídem. 428 | - *Texto*, muestra el texto de la página. 429 | - *RSS*, en caso de que los hubiera. 430 | - *Tablas*, extrae el contenido de la tabla y se le puede aqplicar las operaciones típicas. 431 | - *Listas*, extrae el contenido de las listas. 432 | - *Scraper*, aplica un escrapeador previamente cargado a la página. 433 | - *Source*, muestra el HTML de la página. 434 | 435 | ## Filtros Outwit 436 | 437 | Los filtros de control de los que dispone: 438 | 439 | - Ocultar local, si activas esta caja de control, la vista solo mostrará los enlaces salientes o las imágenes externas, y se ocultaán los elementos locales. 440 | - Ocultar caché, cuando esta casilla esté activa, las URLs cacheadas no se mostrarán. 441 | - Documentos, cuando esta casilla esté marcada, sólo se mostrarán las URLs que correspondan con docuementos: pdf, doc, xls, etc. 442 | - *Script*, si está marcada esta casilla, se mostrarán las imágenes que vengan de scripts y el resto se ocultarán. 443 | - *Style*, si se marca se ocultarán las imágenes que no vengan de CSS. 444 | - Background, muestra las imágenes utilizadas como fondo si está marcada. 445 | 446 | ## Navegación Outwit 447 | 448 | Cuando hay más de una página que cargar, cuenta con algunas opciones: 449 | 450 | - *Next*, carga la página siguiente de la serie 451 | - *Browse*, busca automáticamente a través de todas las páginas de una serie. 452 | - *Dig*, puede explorar todos los enlaces de la página. Si pinchamos en *Dig*, en el menú podemos establecer la profundidad de la búsqueda. Si marcamos `depth \` 0=, buscará por todos los enlaces de la página pero si modificamos el valor a `1`, explorará también todos los enlaces de las páginas visitadas. 453 | - *Site Home*, carga la página principal del sitio. 454 | - *Slideshow*, muestra las imágenes de la página como un carrusel. 455 | 456 | ## Resultados 457 | 458 | - Los datos se pueden exportar a CSV, TSV, HTML, XLS o crear scripts SQL para guardarlos en bases de datos. 459 | - En la versión de pago también se pueden programar tareas. 460 | - Se suele adoptar como estándar de tiempo entre petición y petición la de 2 segundos de retraso. 461 | - Si nos encontramos con contenido generado dinámicamente a través de javascript, será mejor que recopilemos los datos manualmente o que aprendemos otra técnica. 462 | 463 | ## Enlaces Outwit 464 | 465 | - Extensión, 466 | - Add-on Firefox, 467 | - Vídeo, 468 | 469 | # Import.io 470 | 471 | - Import.io es una herramienta para la extracción de datos de páginas web. 472 | - No se necesita ningún aprendizaje de lenguajes de programación. 473 | - Para probarla podemos hacerlo a través de 474 | - Podemos [descargárnosla de la web](http://support.import.io/knowledgebase/articles/190281-how-do-i-install-import-io) 475 | - En pones la *URL* que deseas probar y pulsas el botón "GET DATA". 476 | - Nos aparecen los datos tabulados en una tabla. 477 | - Eliminamos columnas que no queramos pinchando en la `(x)` que aparece. 478 | - Si queremos guardar la información que aparece, tendremos que dar a `Extract Data` 479 | - En la parte de abajo de la página salen tres botones. 480 | - Uno es por si lo que ha encontrado import.io no es lo que queríamos. 481 | - Si queremos descargarnos los datos para jugar con ellos, *Download CSV* 482 | - Pero también podemos crear una *API*, si estamos registrados. 483 | 484 | # Kimonolabs 485 | 486 | - Herramienta de *scraping* que convierte web en API. 487 | - Se utiliza como [extensión](https://chrome.google.com/webstore/detail/kimono/deoaddaobnieaecelinfdllcgdehimih?hl%3Des%0A) en Chrome/Chromium o atajo a los marcadores en Firefox. 488 | - Una vez que estamos registrados en Kimono, podremos comenzar a crear nuestra propia API de cualquier sitio web apuntando al botón de Kimono. 489 | - Una de las características de Kimono y que lo hacen muy atractivo es el hecho de crear una API sobre la base de cualquier web. 490 | - La *API* nos ofrece una forma de interactuar con el contenido de esa web de forma automática, por lo que podemos crear nuestra propia web o aplicación con nuestro propio *HTML*, *CSS* y/o *JavaScript* y poner el contenido de esa *API*, normalmente en formato *JSON*. 491 | 492 | ## Codesamples 493 | 494 | ### Curl 495 | 496 | curl --include --request GET "https://www.kimonolabs.com/api/5gqzg2ws?apikey=NQEaiInc5MYvqqdD14pvzpHvpwkqsDQ3" 497 | 498 | ### R 499 | 500 | library('bitops') 501 | library('RCurl') 502 | install.packages('rjson') 503 | library('rjson') 504 | json <- getURL('https://www.kimonolabs.com/api/5gqzg2ws?apikey=NQEaiInc5MYvqqdD14pvzpHvpwkqsDQ3') 505 | obj <- fromJSON(json) 506 | print(obj) 507 | 508 | # wget 509 | 510 | Permite descargar ficheros de sitios 511 | 512 | # httrack 513 | 514 | # Inspección técnica de HTML 515 | 516 | - *Firebug* se ha convertido en la herramienta estándar 517 | - Chinche de la malva o zapatero, una extensión del navegador que permite analizar y descubrir todo lo necesario sobre la página web que estamos visitando para su modificación o interpretación. 518 | - Comenzó como una extensión muy utilizada por desarrolladores web para editar, mostrar errores y monitorear el funcionamiento de *JavaScript*, *CSS* y *HTML* en tiempo real y en cualquier página. 519 | - Permite también explorar el *DOM* (*Document Object Model* o modelo de objetos del documento) para crear selectores *CSS* en conjunción con *JavaScript* y así conseguir webs dinámicas. 520 | - Tanto es así que Mozilla Firefox tiene una versión integrada de Firebug, en analizador. 521 | - Si queremos experimentar un poco más, podemos descargar la extensión desde 522 | 523 | ## Firebug 524 | 525 | Una vez que hemos instalado la extesión de Firefox, podemos utilizarlo de dos manera: 526 | 527 | - Atajos de teclado: 528 | - `F12` abre y cierra Firebug 529 | - `CTRL + F12` abre Firebug en una ventana nueva 530 | - `CTRL + F12`, si lo tienes abierto en ventana nueva, lo colca integrado 531 | - `SHIFT + F12`, cierra la consola si la tienes abierta 532 | - Ratón: 533 | - Activamos la aplicación con el icono. 534 | - También podemos seleccionar cualquier parte de la web con el botón derecho y pinchar en `inspeccionar elemento` 535 | 536 | ## Consola 537 | 538 | En ambos casos trabajamos con una consola que nos muestra la información de la página, en concreto: 539 | 540 | - Consola, muestra información de errores del JavaScript de la página. Podemos introducir y ejecutar comandos. 541 | - *HTML*, muestra el *HTML* como nodos DOM de una jerarquía. Los nodos individuales pueden expandirse o contraerse para mostrar u ocultar los nodos hijos. También muestra el *box model* (modelo de caja) CSS para cada elemento seleccionado. 542 | - CSS, muestra todos los estilos CSS cargados y puedes introducir CSS y mofificarlos al momento. Hay una ventana que muestra todos los estilos cargados por nombre. 543 | - Script, muestra los archivos JS incluidos y se pueden inspeccionar y activar o desactivar por partes. 544 | - DOM, Muestra los objetos y propiedades DOM. 545 | - Net, puedes comprobar cuańto tarda cada recurso en cargar, muestra las cabeceras de peticiones y respuestas HTTP para cada recurso. 546 | 547 | # Google Drive 548 | 549 | - importHTML() 550 | - importFeed() 551 | - importXML() 552 | - importURL() 553 | - importData() 554 | - importRange() 555 | 556 | ## ImportHTML() 557 | 558 | - El método más fácil consiste en importar datos de una tabla o una lista a Google Drive con la función `IMPORTHTML` 559 | - Para ello tendremos que tener ciertas nociones de *HTML* 560 | - Permite importar contenido de tipos de elementos *HTML*, tablas y listados. 561 | - Afecta a los elementos `table` (tabla), `ul`, `ol` y `dl` (listados). 562 | - `ul`, que corresponde a *unordered list* o lista desordenada, la típica lista donde cada elemento aparece con un punto o un guión. 563 | - `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. 564 | - `dl`, corresponde con *description list*, listas de descripciones 565 | - `table`, corresponde con una tabla de datos tabulados. 566 | - 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: 567 | 568 | =IMPORTHTML("URL";"list|table";n) 569 | 570 | ## ImportXML 571 | 572 | - También podemos utilizar la función `IMPORTXML("url";"xpath_query")` para extraer otro tipo de información o acceder al contenido por `XPath`. 573 | - Para ayudarnos a ello, además de *Firebug*, podemos utilizar la extensión de Firefox [XPath Checker](https://addons.mozilla.org/en-US/firefox/addon/xpath-checker/) 574 | -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*, haremos: 575 | 576 | =IMPORTXML("URL";"//a/@href") 577 | 578 | - Pero podríamos elegir sólo los enlaces que tienen una determinada clase, lo que haríamos también con *XPath* de esta manera: 579 | 580 | =IMPORTXML("URL";"//a[@class='clase']") 581 | 582 | - 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: 583 | 584 | =IMPORTXML(celda1;celda2) 585 | 586 | - 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')` 587 | - 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` 588 | 589 | =IMPORTXML("URL"; "//div[starts-with(@class,'clase')]") 590 | 591 | Si quisiéramos los enlaces, añadiríamos al final `//@href`, ya que el enlace se encuentra en el atributo de `a`, `href` 592 | 593 | =IMPORTXML("URL"; "//div[starts-with(@class,'clase')]//@href") 594 | 595 | 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`: 596 | 597 | =CONCATENATE("URL",celda-resultados) 598 | 599 | Y luego estiramos esta función al resto de las celdas que lo requieran. 600 | 601 | ## Algunos ejemplos XPath útiles: 602 | 603 | - `//`, descarga todos los elementos de html que empiecen con `<` 604 | - `//a`, descarga todos los contenidos del elemento `a`, los enlaces, de la URL que decidamos. 605 | - `//a/@href`, descarga todos los contenidos del atributo `href` del elemento `a`, que corresponden con la URL del enlace. 606 | - `//input[@type`'text']/..=, descarga todos los elementos padre de los elementos de texto `input` 607 | - `count(//p)`, cuenta el número de elementos que le digamos, en este caso párrafos `p` 608 | - `//a[contains(@href, 'protesta')]/@href`, encuentra todos los enlaces que contienen la palabra `protesta` 609 | - `//div[not(@class`'left')]=, encuentra todos los `div` cuyas clases no sean `left` 610 | - `//img/@alt`, muestra todos los textos de los atributos `alt` de las imágenes `img` 611 | 612 | ## Ejemplo complejo 613 | 614 | =IMPORTXML("URL";"//div[@class='clase']//h3") 615 | 616 | Nos da todos los titulares `h3` que se encuentran dentro del `div` con clase =clase=n de los artículos de la *URL* 617 | 618 | # PDF 619 | 620 | ## Interroga a un *PDF* 621 | 622 | Diagrama propuesto por Nicolas Kayser-Brill 623 | 624 | ![img](/home/flow/Documentos/curro/unir/mineria-datos/temas/nkb-pdf.png) 625 | 626 | - ¿Es tu imagen un PDF? 627 | - Sí, entonces utiliza OCR para extraer datos 628 | - Google Drive, 629 | - No, entonces ¿puedes copiar el texto seleccionándolo y pegándolo en otro documento? 630 | - No, tendrás que usar otro software 631 | - Sí, entonces puedes usar: 632 | - [Tabula](http://tabula.technology), para extraer datos automáticamente. 633 | - *PDFtoExcelOnline*: subes un PDF y te envían por correo el XLS. 634 | - [smallpdf](http://smallpdf.com) 635 | 636 | ## Colaboración 637 | 638 | - Si todo lo anterior falla, se puede utilizar alguna herramienta colaborativa. 639 | - [Documentcloud](http://www.documentcloud.org), creada por miembxs de la comunidad de periodismo de datos. 640 | - [mTurk](https://www.mturk.com/mturk/welcome) de *Amazon*. 641 | - [Crowdcrafting](http://crowdcrafting.org/) 642 | 643 | ## Crowdcrafting: PDF Transcribe 644 | 645 | - [PDF Transcribe](http://crowdcrafting.org/app/pdftranscribe/) es el nombre de la aplicación de *PyBossa* que permite transcribir un *PDF* colaborativamente. 646 | - Utiliza la librería *Mozilla PDF.JS library* para cargar un archivo *PDF* externo y renderizarlo en la aplicación que se ejecuta en el navegador sin necesidad de terceros. 647 | - A su lado se extiende un formulario personalizado para extraer los datos que solicitamos de cada documento. 648 | - Se pueden añadir tantos campos como sean necesarios en el formulario para recopilar la información que necesitemos, explicándolo convenientemente. 649 | - Podemos asignar tareas a usuarios y completar de manera distribuida y colaborativa el proyecto de transcripción. 650 | 651 | ![img](//img10.imageshack.us/img10/5364/pdftranscribe1.png) 652 | 653 | ## Probar, probar, probar 654 | 655 | - ProPublica advierte en su guía para convertir PDF en documentos de texto que ninguna solución va a ser completa por la propia solución y/o por los documentos PDF. 656 | - Lo normal es combinar las técnicas y encontrar las opciones que más satisfagan. 657 | - Siempre se necesita una revisión manual o dos del trabajo realizado por las herramientas. 658 | 659 | ## pdftotext, xpdf 660 | 661 | *pdftotext* es una herramienta de código abierto que funciona en consola y convierte *PDF* a texto plano. 662 | 663 | Forma parte de [xpdf](http://www.foolabs.com/xpdf/download.html), un conjunto de aplicaciones para trabajar con documentos *PDF*. También se incluye como parte de *Poppler*, un proyecto derivado de *Xpdf*. 664 | 665 | Solo puede convertir un documento cada vez: 666 | 667 | pdftotext archivo.pdf 668 | 669 | Para especificar la primera página a convertir: 670 | 671 | pdftotext -f numero-primera-pagina-convertir 672 | 673 | O para especificar la última página: 674 | 675 | pdftotext -l numero-ultima-pagina-convertir 676 | 677 | Se puede especificar la resolución, en puntos por pulgada. El valor por defecto es 72. 678 | 679 | pdftotext -r resolucion-en-PPP 680 | 681 | O bien seleccionar un área, tomando como `coordenada-x` el área que selecciona desde la esquina superior izqda con `-x`: 682 | 683 | pdftotext -x coordenada-x 684 | 685 | Y desde la coordenada y con `-y` 686 | 687 | pdftotext -y coordenada-y 688 | 689 | También se puede especificar la anchura con `W` (*width*) del área en pixels. El valor por defecto es 0: 690 | 691 | pdftotext -W valor-ancho 692 | 693 | Y la altura con `H` (*height*) del área seleccionada en pixels. El valor por defecto es 0. 694 | 695 | pdftotext -H valor-alto 696 | 697 | Si queremos conservar el aspecto tanto como se pueda, hay que apuntar la opción `-layout`. El valor por defecto es `undo`, que fuerza el texto a mostrarse en texto corrido. 698 | 699 | pdftotext -layout 700 | 701 | Incluso podemos establecer un ancho fijo tabulado, con el valor de la anchura en puntos, lo cual fuerza el modo de disposición física, con la opción `-fixed`: 702 | 703 | pdftotext -fixed valor-ancho-en-puntos 704 | 705 | Por último, is queremos generar un archivo *HTML* que incluya la meta información, encaja el texto en elementos `
` y `
`, utilizaremos la opción `-htmlmeta` 706 | 707 | pdftotext -htmlmeta 708 | 709 | O bien la opción `-bbox` que genera un archivo *XHTML* que contiene caja de información de cada palabra. 710 | 711 | pdftotext -bbox 712 | 713 | Para especificar la codificación del formato de salida lo haremos con `enc`. Por defecto es *UTF-8*: 714 | 715 | pdftotext enc codificacion 716 | 717 | ## Ghostscript 718 | 719 | Es el lenguaje que entienden las impresoras. 720 | 721 | Se puede utilizar para reducir el tamaño de archivos *PDF*. Si tienes *Ghostscript* instalado (`gs`), puedes correr este comando en consola: 722 | 723 | gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -sOutputFile=nuevo_archivo.pdf original.pdf 724 | 725 | En las opciones de `-dPDFSETTINGS`, puedes optar por: 726 | 727 | - `/screen`. si quieres una baja resolución y un tamaño pequeño. 728 | - `/ebook`, selecciona resolución media y tamaño mediano. 729 | - `/printer` y `/prepress`, para resoluciones altas 730 | 731 | ## PDFtk 732 | 733 | - *PDFtk* permite realizar muchas operaciones con *PDF* 734 | - Necesitas el comando `pdftk` desde la terminal. 735 | - O bien o [pdf toolkit](http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/) 736 | 737 | ### Rotar documentos 738 | 739 | Puedes rotar por completo un *PDF* o páginas determinadas, en los puntos cardinales elegidos. Por ejemplo, rotar una página 90 grados en el sentido de las agujas del reloj: 740 | 741 | pdftk entrada.pdf cat 1east output salida.pdf 742 | 743 | Donde `1east` significa que la página `1` gira 90º al `East` (Este) 744 | 745 | Las opciones son: 746 | 747 | - `north`, 0 grados 748 | - `east` o `right`, 90º 749 | - `south` o `down`, 180º 750 | - `west` o `left`, 270º 751 | 752 | `left`, `right` and `down` hacen ajustes relativos a la rotación de la páginas. 753 | 754 | ### Dividir un PDF en varios 755 | 756 | Si queremos dividir (*split*) un *PDF* muy largo en varios documentos *PDF*, podemos utilizar la opción `burst` 757 | 758 | pdftk pdflargo.pdf burst 759 | 760 | Lo que dará como resultado tantos archivos *PDF* como páginas tenía el documento. 761 | 762 | ## ImageMagick 763 | 764 | *Imagemagick* es un conjunto de herramientas en consola para modificar y tratar imágenes, bien en el momento o bien integrado en un *script* en *bash*. 765 | Lo podemos utilizar para convertir imágenes en *PDF* y así manipular el documento como *PDF*. Utiliza el comando `convert` 766 | 767 | convert *.jpg +adjoin page-%d.pdf 768 | 769 | Donde `jpg` es el formato de la imagen, pero podríamos trabajar también con archivos `png` o `gif`. 770 | 771 | Si no nos aparece tal como queremos, quizás podamos jugar con los parámetros: 772 | 773 | convert -density 150 archivo.pdf -quality 90 salida.png prefijo 774 | 775 | Donde: 776 | 777 | - `-density` especifica el valor de la resolución en *PPP*. 778 | - `-quality` especifica la calidad, donde 100 significa `sin compresión` 779 | - `prefijo` indica el prefijo a utilizar al crear cada archivo de imagen. 780 | 781 | También podríamos hacer la conversión en un nuevo directorio: 782 | 783 | mkdir convertidas && for i in *.pdf; do convert -density 150 $i convertidas/$i; done 784 | 785 | Con la opción `-colorspace Gray` convertimos una imagen de color a escala de grises. 786 | 787 | ## Poppler-utils pdftoppm 788 | 789 | Con las utilidades *poppler-utils* manipulamos *PDF*. Su paquete *pdftoppm* permite convertir *PDF* a imágenes en formato *ppm*, *png* o *jpg*. 790 | 791 | pdftoppm -png file.pdf prefijo 792 | 793 | Lo que produce tantos *png* como páginas tiene, con el prefijo *prefix*. La resolución por defecto es 150 *ppp* *puntos por pulgada*. Para incrementar la resolución, se puede hacer con las opciones `rx` y `ry`. 794 | 795 | pdftoppm -rx 300 -ry 300 -png archivo.pdf prefijo 796 | 797 | Para imprimir solo una página, se utiliza la opción `singlefile`, y con la opción `n` se especifica el número de página. La primera página es la número 1. 798 | 799 | pdftoppm -f N -singlefile -png archivo.pdf prefijo 800 | 801 | ## pdfcrop 802 | 803 | 804 | texlive-extra-utils 805 | 806 | pdfcrop --margins '5 10 20 30' input.pdf output.pdf 807 | 808 | Automatizar archivos `PDF` de un directorio: 809 | 810 | ,#!/bin/bash 811 | 812 | for FILE in ./*.pdf; do 813 | pdfcrop --margins 5 "${FILE}" "${FILE-cropped}" 814 | done 815 | 816 | ## pdfjam 817 | 818 | Utilidad en línea de comandos para el paquete de LaTeX *pdfpages* 819 | 820 | pdfjam --keepinfo --trim "15mm 15mm 30mm 60mm" --clip true --suffix "cropped" 6_Abengoa.pdf 821 | 822 | ## PDF-Shuffler 823 | 824 | Aplicación gráfica (GTK) para Linux que ayuda a pegar, dividir, rotar o reorganizar las páginas a través de una interfaz gráfica. Es un frontend para *python-pyPdf* 825 | 826 | 827 | 828 | ## Briss 829 | 830 | Aplicación multiplataforma (*Linux*, *Windows* y *Mac OSX* para recortar archivos PDF. Una simple interaz nos permite definir la región. 831 | 832 | 833 | 834 | 835 | ## qpdf 836 | 837 | Para desencriptar un *PDF* encriptado 838 | 839 | qpdf --password='' --decrypt archivo-original.pdf archivo-desencriptado.pdf 840 | 841 | ## pyPdf 842 | 843 | Receta de Python 844 | 845 | python-pypdf2 - Pure-Python library built as a PDF toolkit (Python 2) 846 | python3-pypdf2 - Pure-Python library built as a PDF toolkit (Python 3) 847 | python-pypdf - PDF toolkit implemented solely in Python 848 | 849 | ## Rmagick 850 | 851 | - [Rmagick](http://rmagick.rubyforge.org/portfolio.html) es otra herramienta que recomiendan en el artículo de ProPublica para trabajar con imágenes desde la consola 852 | - También permite realizar dibujos en 2D. 853 | - Transformaciones: 854 | - Dibujos: 855 | - Efectos especiales: 856 | - Repositorio en GitHub: 857 | 858 | ## PDF Split and Merge 859 | 860 | - Si nos da un poco de respeto o no podemos acceder a una línea de comandos, podemos contar con [PDF Split and Merge](http://sourceforge.net/projects/pdfsam/%0A) 861 | - Se trata de una herramienta en modo gráfico (y también en línea de comandos) para separar, juntar, mezclar y rotar *PDF*. 862 | - Está disponible para *Windows*, *MacOSX* y *GNU/Linux* y el único requisito es que necesita del entorno virtual de *Java*. 863 | - Entre sus funcionalidades, destacan: 864 | - Pegar documentos *PDF* 865 | - Dividir documentos *PDF*, especificando el número de páginas 866 | - Dividir documentos *PDF*, especificando el nivel de los marcadores 867 | - Rotar *PDF* 868 | - Mezclar dos documentos *PDF*, componiendo uno nuevo que alterne una página de cada. 869 | - Componer visualmente un nuevo *PDF* arrastrando páginas de otros *PDF*. 870 | 871 | ## Herramientas Web 872 | 873 | - Zamzar, Cometdocs y Smallpdf son servicios web online. 874 | - Por tanto, el documento deja de estar en tu equipo y pasa por Inet hasta sus servidores. 875 | - Se suben los archivos ahí y o bien te devuelven una salida en un formato de texto o bien un correo electrónico con un enlace para que los puedas descargar. 876 | - [Zamzar](http://www.zamzar.com/) es un servicio web para realizar conversiones de todo tipo. 877 | - [Cometdocs](http://www.cometdocs.com/) es otro servicio web para realizar conversiones aunque también funciona como servicio de almacenamiento y para compartir archivos. Dispone de una versión escritorio para *Windows* e *iOS*. También dispone de una API como servicio de pago. 878 | - [smallpdf](http://smallpdf.com/) es otro servicio web que permite manipular y convertir *PDF* 879 | 880 | ## Tika 881 | 882 | [OKFN Labs](http://okfnlabs.org) tiene en fase beta un [servicio web](http://okfnlabs.org/blog/2015/02/21/documents-to-text.html) que permite convertir un gran número de tipos de archivo a `TXT`. 883 | 884 | El servicio web se encuentra en , y para comprobar su funcionamiento tan solo hemos de tener una imagen que contenga texto y lanzar la consulta, en *Mac*, *GNU/Linux* o *Cygwin*, desde la terminal: 885 | 886 | curl -T ruta_archivo_imagen http://beta.offenedaten.de:9998/tika 887 | 888 | En `STDOUT`, es decir, en la consola, se nos mostrará el texto que contiene la imagen. 889 | 890 | Si queremos guardarlo automáticamente en una archivo de texto para facilitar su revisión, podemos añadir una concatenación de tareas: 891 | 892 | curl -T ruta_archivo_imagen http://beta.offenedaten.de:9998/tika > ruta_archivo_a_revisar.txt 893 | 894 | - El proyecto lo realizó Matt Fullerton de [OKFNLabs](http://okfnlabs.org) a partir del servidor web de *Apache* *Tika Project*, que soporta *Tesseract*. 895 | - Ha creado una imagen *docker* por si quieres replicarlo en tu [propio servidor](https://registry.hub.docker.com/u/mattfullerton/tika-tesseract-docker/%0A) 896 | - Y también puedes construirla desde [GitHub](https://github.com/mattfullerton/tika-tesseract-docker) 897 | 898 | ## Good Tables 899 | 900 | - *Good Tables* es otro proyecto de [OKFNLabs](http://okfnlabs.org) que consiste en un paquete *Python* para validar datos tabulares. 901 | - Puede funcionar con simples *CSV* o en una tubería de procesos *ETL*. 902 | - Se trata de una versión alfa 903 | - Artículo sobre Good Tables, 904 | - Read the Docs, 905 | 906 | # Un caso singular: ProPublica 907 | 908 | - [ProPublica](http://propublica.org/) realiza grandes investigaciones de periodismo de datos. 909 | - Y tanto o más importante: lo documentan. 910 | - Un ejemplo concreto lo tuvieron con el proyecto [Dollars for Docs](https://projects.propublica.org/docdollars/) y cómo utilizaron [varias herramientas](http://www.propublica.org/nerds/item/image-to-text-ocr-and-imagemagick) 911 | - En este caso crearon la guía *Scraping for Journalism, A guide for Collecting Data* 912 | - [Recolección de datos](https://www.propublica.org/nerds/item/doc-dollars-guides-collecting-the-data) 913 | - [Tratamiento de imágenes](http://www.propublica.org/nerds/item/image-to-text-ocr-and-imagemagick) 914 | - [PDF scraping](http://www.propublica.org/nerds/item/turning-pdfs-to-text-doc-dollars-guide) 915 | 916 | ## El proceso 917 | 918 | Ante una tabla de datos en una imagen: 919 | 920 | 1. En un programa de tratamiento de imágenes, con líneas guía, crearon una cuadrícula donde el texto de cada celda pudiera posteriormente seleccionarse con la herramienta de selección rectangular. 921 | 2. Dividieron la imagen y crearon imágenes nuevas, una por cada celda con texto, identificándolas apropiadamente con el número de celda por fila (*row*) y por columna (*column*) correcto. 922 | 3. Para ello utilizaron distintas operaciones de *RMagick*. 923 | 4. Descartaron todo el espacio en blanco de los márgenes de la tabla con [bounding\_box](http://studio.imagemagick.org/RMagick/doc/image1.html#bounding_box), 924 | 5. Convirtieron la tabla a blanco y negro (escala de grises) para que el *OCR* funcione mejor. 925 | 6. Primero probaron con las opciones de *RMagick* `quantize` y `contrast`, pero como los resultados no fueron los esperados lo hicieron con *Photoshop*, que permite también operaciones por lotes. 926 | 7. Crearon una imagen con cada celda con un nombre que lo identificara su posición en la tabla por número de fila y número de columna. Así lograron 500 archivos de imagen. 927 | 8. Detectaron las líneas de la tabla para crear coordenadas de celdas con la opción `get_pixels`, sobre las que cortar la imagen de la tabla en imágenes de cada celda. 928 | 9. Realiza *OCR* con *tesseract*, integrado en el *script* con esta llamada (más adelante se ve el *script* completo donde se integra esta llamada): 929 | 930 | `tesseract /cell-files/#{j}x#{i}.tif /cell-files/#{j}x#{i}.txt ` 931 | 932 | 1. Construye la tabla de datos en modo texto con el texto resultante del paso anterior, también de manera automatizada incorporándolo al *script*: 933 | 934 | ,# abre el archivo que tesseract ha creado y almacena el texto en el array 935 | text_row << File.open("cell-files/#{j}x#{i}.txt", 'r').readlines.map{|line| line.strip}.join(" ") 936 | 937 | end 938 | 939 | \# une el array con los caracteres de tabulación y produce una salida de datos en una línea 940 | output_file.puts( text_row.join("\t")) 941 | 942 | 1. Limpieza de los datos, ya que *Tesseract* puede equivocarse en caracteres similares, como por ejemplo `0` de cero y `O` de o mayúscula. Por lo que probablemente no podamos dejar de hacer una comprobación manual, si bien en este proceso podemos implicar a más personas, bien a través de las citadas *Crowdcrafting* o *mTurk*. En este sentido, ProPublica utilizó *mTurk* y realizó esta [guía](http://www.propublica.org/article/propublicas-guide-to-mechanical-turk). 943 | 944 | ## PDFTables 945 | 946 | Servicio web creado por ScraperWiki, un servicio de *web scraping*, para extraer tablas de PDFs. Requiere crearse un usuario. Puedes descargar los resultados a través del navegador. Advierten que si usas muchos documentos, tendrás que convertirte en usuario de pago. 947 | 948 | 949 | # OCR 950 | 951 | El reconocimiento óptico de caracteres *OCR* (por sus siglas en inglés *Optical Character Recognition*) nos permite convertir imágenes que contienen texto en documentos de texto gracias a algoritmos automáticos que realizan ese reconocimiento. 952 | 953 | ## Google Drive 954 | 955 | - Google Drive realiza OCR sobre imágenes individuales en formato *jpg*, *png* o *gif* pero también en documentos *PDF* de una o más páginas 956 | - Google recomienda ciertas pautas para el uso de OCR: 957 | - Los archivos han de tener la más alta resolución, ya que así funcionará mejor OCR. Como medida de ejemplo, recomiendan que cada línea de texto sea de al menos diez píxeles de altura. 958 | - Es importante que estén orientados en horizontal de izquierda a derecha. Si no lo tienes así, utiliza las herramientas citadas anteriormente para resolverlo. 959 | - Los idiomas y conjuntos de caracteres que soporta con seguridad son *Latin*, el soporte de otros es experimental. Puedes elegir el idioma de los documentos en el menú. 960 | - Reconocen mejores resultados en fuentes comunes como *Arial* o *Times New Roman*. 961 | - La calidad de la imagen también es importante. Las imágenes con mayor contraste funcionan mejor, las que están movidas o borrosas peor. 962 | - El tamaño máximo para las imágenes es de 2 MB por imagen. 963 | - En los documentos *PDF* solo trabajará con las 10 primeras páginas, por lo que conviene dividir los documentos. 964 | - *Google OCR* pretende mantener el formato básico del texto, como son las negritas o las itálicas, el tamaño y el tipo de fuente y los saltos de línea, pero reconocen que detectar estos elementos es complicado y no siempre lo consiguen. 965 | - Otros contenidos estructurados como listas numeradas, listados estructurados, tablas, columnas de texto, pies de página y notas finales es probable que no sean reconocidos. 966 | 967 | ## Tesseract-ocr 968 | 969 | - [Tesseract](https://github.com/tesseract-ocr) se anuncia como las más completa y precisa solución de código abierto disponible para el reconocimiento óptico de caracteres. 970 | - Combinado con la librería de procesamiento de imágenes *Leptonica*, lee varios formatos de imagen y convierte texto de más de sesenta idiomas. 971 | - En 2006 Google retoma el proyecto y lo mejora. 972 | - Está disponible para *Windows*, *Mac OSX* y *GNU/Linux* en línea de comandos. 973 | - Cuenta con una licencia *Apache License 2.0*. 974 | 975 | Para utilizarlo en línea de comandos, podemos hacerlo de esta simple manera: 976 | 977 | tesseract imagen.png out 978 | 979 | Lo que producirá un archivo `out.txt` con el texto que ha conseguido reconocer de esa imagen. 980 | 981 | Podemos especificar el idioma con la opción `l` 982 | 983 | tesseract imagen.png out -l spa 984 | 985 | Donde `spa` corresponde a *Spanish*. Otros idiomas pueden ser: 986 | 987 | - `ara` para árabe 988 | - `cat` para catalán 989 | - `chi_sim` para chino simplificado 990 | - `chi_tra` para chino tradicional 991 | - `deu` para alemán 992 | - `eng` para inglés 993 | - `fra` para francés 994 | - `glg` para gallego 995 | - `ita` para italiano 996 | - `rus` para ruso. 997 | 998 | El listado completo lo puedes encontrar en 999 | 1000 | - Las instrucciones para la instalación están disponibles en . 1001 | - El manual completo con las distintas opciones y argumentos de entrada y salida está disponible en 1002 | - Tesseract-ocr, 1003 | 1004 | # Referencias bibliográficas :OK: 1005 | 1006 | - Aristarain, Manuel & Tigas, Mike & Merril, Jeremy B. (2014) *Scraping PDFs with Tabula*. URL: 1007 | 1008 | - Crucianelli, Sandra. (2013) *Herramientas digitales para periodistas*. Centro Knight para el Periodismo en las Américas de la Universidad de la Universidad de Texas. URL: 1009 | 1010 | - García Santiago, Lola. (2003) *Extraer y visualizar información en Internet: el Web Mining*. Gijón: Ediciones Trea 1011 | 1012 | - Gray, Jonathan & Bounegru, Liliana & Chambers, Lucy. (2012) *Data Journalism Handbook*. European Journalism Centre y Open Knowledge Foundation. URL: 1013 | 1014 | - Kayser-Brill, Nicolas. (2014) *Data wants to be free! (and clean)*. Medialab-Prado. URL: 1015 | 1016 | - Méndez Rodriguez, Eva Mª. (2002) *Metadatos y Recuperación de información: estándares, problemas y aplicabilidad en bibliotecas digitales*. Gijón: Trea 1017 | 1018 | - Nguyen, Dan. (2010) *Chapter 3: Turning PDFs to Text*. Propublica, Journalism in the Public Interest. URL: 1019 | 1020 | - Nguyen, Dan. (2010) *Chapter 5: Getting Text Out of an Image-Only PDF*. ProPublica, Journalism in the Public Interest. URL: 1021 | 1022 | - Schoolofdata, (2014) *Obteniendo datos de los PDF*. Web: School of Data. URL: 1023 | 1024 | # Manuales 1025 | 1026 | - Cómo utilizar *Google OCR*, 1027 | - Introducción al scraping de *PDF*, 1028 | -------------------------------------------------------------------------------- /Readme.org: -------------------------------------------------------------------------------- 1 | #+CATEGORY: curro, villanueva, periodismodatos 2 | #+TAGS: tabula, ocr, google. drive, scraping, kimono 3 | #+DESCRIPTION: Herramientas de scraping de PDF y Web 4 | #+AUTHOR: Adolfo Antón Bravo 5 | #+EMAIL: adolflow@gmail.com 6 | #+TITLE: Scraping: PDF y Web 7 | #+DATE: [2015-12-16 mié 16:00] 8 | 9 | #+LATEX_HEADER: \usepackage[english]{babel} 10 | #+LATEX_HEADER: \addto\captionsenglish{\renewcommand{\contentsname}{{\'I}ndice}} 11 | #+OPTIONS: ^:nil num:nil 12 | 13 | #+OPTIONS: reveal_center:t reveal_progress:t reveal_history:nil reveal_control:t 14 | #+OPTIONS: reveal_mathjax:t reveal_rolling_links:t reveal_keyboard:t reveal_overview:t num:nil 15 | #+OPTIONS: reveal_width:1200 reveal_height:800 16 | #+REVEAL_MARGIN: 0.1 17 | #+REVEAL_MIN_SCALE: 0.5 18 | #+REVEAL_MAX_SCALE: 2.5 19 | #+REVEAL_TRANS: linear 20 | #+REVEAL_THEME: sky 21 | #+REVEAL_HLEVEL: 2 22 | #+REVEAL_HEAD_PREAMBLE: 23 | #+REVEAL_POSTAMBLE:

Creado por adolflow.

24 | #+REVEAL_PLUGINS: (highlight notes) 25 | #+REVEAL_EXTRA_CSS: file:///home/flow/Documentos/software/reveal.js/css/reveal.css 26 | #+REVEAL_ROOT: file:///home/flow/Documentos/software/reveal.js/ 27 | 28 | Módulo de periodismo de datos de /scraping/ donde aprenderemos cosas directamente relacionadas: 29 | 30 | - Web /scraping/ 31 | - PDF /scraping/ 32 | - Nociones de programación 33 | - Detectar y estructurar información localizada en web o en otros formatos para poder analizarla e interpretarla. 34 | - Volcar y formatear datos de diferentes orígenes para poder gestionarlos. 35 | 36 | Pero también otras cuestiones directamente relacionadas como: 37 | 38 | - Aprender a instalarnos programas adecuadamente 39 | - Resolución de problemas 40 | - Manejo de versiones 41 | - Github 42 | - Tecnologías web 43 | - Empezar a practicar con lenguajes de programación 44 | 45 | * Necesidades técnicas 46 | 47 | - Navegadores [[http://getfirefox.com/][Firefox]] (o derivados) y [[https://www.google.es/chrome/browser/desktop/][Chrome]] (o derivados) 48 | - Editor de textos con indentado y resaltado de sintaxis, [[http://infotics.es/2015/11/11/editor-de-textos/][elige el que más te guste]] 49 | - Extensiones del navegador: [[http://getfirebug.com/][Firebug]], [[https://addons.mozilla.org/En-uS/firefox/addon/xpath-checker/][Xpath Checker]], [[http://www.tineye.com][Tineye]] 50 | - Cuenta Google Drive. 51 | - Programas de copia, descarga, spiders o crawling como [[https://www.httrack.com/][httrack]] o [[http://www.downthemall.net/][Downthemall]]. 52 | - Programas de web scraping como [[https://www.outwit.com/][Outwit]], [[http://import.io][Import.io]] y [[http://kimonolabs.com][kimono]]. 53 | - Programas de tratamiento de PDF como [[http://www.foolabs.com/xpdf/][xpdf]]. 54 | - La terminal, también es posible desde Windows con [[https://www.cygwin.com/][cygwin]] 55 | - Python, Ruby y R 56 | 57 | 58 | * La Web como fuente de datos 59 | 60 | - La web es un fuente de datos inagotable 61 | - De hecho, se puede considerar una gran base de datos. 62 | - Se puede acceder a servicios web anónimos, con perfiles, buscadores generales y específicos. 63 | - El buscador es un software que recopila e indexa archivos almacenados en servidores web y recupera la información conforme a algunos criterios específicos. 64 | ** Recopilar datos 65 | - La manera más sencilla de extraer datos de una página web consiste en seleccionar el texto, copiarlo y pegarlo allí donde queremos luego trabajar con ello. 66 | - Si se tratan de datos que se encuentran dispuestos en tablas, los podemos copiar y pegar en nuestra aplicación de hoja de cálculo favorito. 67 | - Es la forma más fácil pero también *manual*. 68 | - Si queremos *automatizar* esa tarea, o incluso *si no nos deja hacerlo manualmente*, tenemos que optar por otras opciones. 69 | - Las opciones más fáciles pasan por que los datos estén bien estructurados, un HTML bien formado 70 | - Se habla de recopilación de datos, /crawling/ o /spiding/ cuando nos descargamos sitios completos. 71 | - Se habla de /scraping/ cuando rascas de aquí y de allá. 72 | 73 | ** Búsqueda avanzada 74 | 75 | - Se puede utilizar búsqueda avanzada en los principales buscadores 76 | - /Google/, /Yahoo!/, /duckduckgo/, /Yandex/ o /Bing/ 77 | - También están los [[https://support.google.com/websearch/answer/2466433][operadores de búsqueda]]: permiten filtrar las búsquedas. 78 | - Un listado no oficial lo encontrais en [[http://www.googleguide.com/advanced_operators_reference.html][googleguide]] 79 | 80 | ** Ejemplo con operador =site:= de Google 81 | 82 | - Los operadores de búsqueda nos permiten acotar y especificar más los resultados. 83 | - Se puede buscar una palabra específica en un dominio concreto con =site:dominio= 84 | - Por ejemplo, busquemos la palabra *inmigración* en el sitio de [[https://www.google.es/?gfe_rd=cr&ei=QVl-VoOmOtGp8weIvqSwBg#q=site:elpais.com+inmigraci%25C3%25B3n][elpais.com]] 85 | - El resultado no varía en función de nuestro perfil o nuestra navegación ya que es sobre un sitio concreto. 86 | - Sí que puede variar desde que he realizado la búsqueda hasta que lo buscáis. 87 | 88 | La búsqueda devuelve 55200 resultados. 89 | 90 | #+BEGIN_SRC google 91 | site:elpais.com inmigración 92 | #+END_SRC 93 | 94 | ** Operador lógico /AND/ 95 | 96 | - Cuando buscamos una palabra buscamos unos caracteres escritos de esa manera determinada. 97 | - Si buscamos más de una palabra, comienzan a actuar operadores lógicos. 98 | - Los operadores se utilizan para afinar aun más la búsqueda. 99 | - El operador por defecto cuando se buscan dos palabras es es =+=, =AND= o =Y=. 100 | - En Google se utiliza =+=, no los otros. 101 | - Eso quiere decir que se buscan documentos que contengan esas dos palabras. 102 | 103 | La búsqueda de =inmigración ilegal= devuelve los mismos resultados, 6680, que =inmigración + ilegal= 104 | 105 | #+BEGIN_SRC google 106 | site:elpais.com inmigración ilegal 107 | #+END_SRC 108 | 109 | ** Operador lógico /OR/ 110 | - Otro operador muy utilizado es =OR=, =O= o =|= 111 | - En Google se utilizan =OR= y =|= 112 | - Busca documentos donde aparecen una u otra palabra. 113 | 114 | Si buscamos =inmigración OR ilegal= da los mismos resultados que si buscamos =inmigración | ilegal=, 16700 resultados: 115 | 116 | #+BEGIN_SRC google 117 | site:elpais.com inmigración OR ilegal 118 | #+END_SRC 119 | 120 | ** Palabras reservadas 121 | 122 | - Los operadores lógicos nos introducen en el concepto de las /palabras reservadas/. 123 | - Las palabras reservadas se dan en todos los lenguajes informáticos y son palabras que utiliza el propio lenguaje. 124 | - Son palabras o caracteres reservados =AND=, =OR=, =+=, =-=, =|=, etc. 125 | - Lo cual nos lleva al concepto de /literales/ 126 | - Si queremos utilizar esas palabras reservadas como palabra a buscar, deberemos entrecomillarlas. 127 | 128 | Lo cual buscará documentos donde aparezcan las tres palabras: =spain=, =or= y =greece= 129 | 130 | #+BEGIN_SRC google 131 | site:theguardian.com spain "or" greece 132 | #+END_SRC 133 | 134 | 135 | ** Búsqueda literal 136 | 137 | - La búsqueda literal sirve para encontrar expresiones específicas. 138 | - Los literales se denominan también en programación /strings/ o /cadenas de caracteres/. 139 | - Por ejemplo, la búsqueda de =violencia de género en madrid= encuentra 330 resultados porque hay 330 documentos donde aparece esa expresión tal cual. 140 | 141 | Si queremos que aparezca =violencia de género= y también =madrid=, pero sin estar juntos en la expresión, devuelve 20200 resultados. 142 | 143 | #+BEGIN_SRC google 144 | site:elpais.com "violencia de género" madrid 145 | #+END_SRC 146 | 147 | ** Operador menos 148 | - Si el operador =+= se utiliza como sinónimo de =OR=, el operador menos reduce los resultados de la búsqueda. 149 | - Con el operador =-= elegimos palabras que no queremos que aparezcan acompañadas de otras. 150 | - Observad que el signo de menos debe estar pegado al texto. 151 | - Seguimos con el ejemplo anterior y *concatenamos operadores* 152 | - Cuántas veces aparece "violencia de género" pero no aparece =2014=, =2011= y =2010=, para que no aparezcan las noticias de esos años, aparecen 9 resultados. 153 | 154 | Incluso se combina con el operador =site:=: 155 | 156 | #+BEGIN_SRC google 157 | "violencia de género en españa" -site:wikipedia.org -2014 -2011 -2010 158 | #+END_SRC 159 | 160 | ** Operador comodín 161 | - El asterisco encuentra cualquier cosa en medio de una cadena de caracteres. 162 | - Si queremos buscar /violencia de género/, /violencia a las mujeres/ y /violencia contra las mujeres/, podemos emplear el operador el operador =|= 163 | 164 | Y apoyarnos en el operador comodín =*= 165 | 166 | #+BEGIN_SRC google 167 | site:elpais.com "violencia * mujeres|género" 168 | #+END_SRC 169 | 170 | 171 | ** Debemos saber que 172 | 173 | - Las búsquedas en estos buscadores no son /case sensitive/, es decir, no distinguen entre minúsculas y mayúsculas. 174 | - Si buscamos "violencia de género" obtendremos los mismo resultados que si buscamos "VIOLENCIA DE GÉNERO" 175 | - el uso de estos operadores implica el uso de *expresiones o palabras reservadas* 176 | - Las palabras reservadas son las que el buscador entiende como propias de su vocabulario. 177 | - Para utilizar palabras reservadas en la búsqueda debemos entrecomillarlas. 178 | - Las comillas también se utilizan para buscar literales, expresiones exactas. 179 | 180 | ** Resumen operadores lógicos 181 | 182 | - El operador de restricción =+=, es similar a =AND= 183 | - El operador de restricción =-=, es similar a =NOT= en otros tipos de búsqueda. 184 | - El operador =OR=, donde esté cualquiera de los dos términos, o =|= 185 | - =""=, se entrecomilla el texto exacto que queremos buscar, búsqueda literal. 186 | - Si no queremos aprender estas reglas, podemos usar el buscador avanzado de Google que ofrece una interfaz gráfica en forma de formulario. 187 | http://www.google.com/advanced_search 188 | 189 | 190 | 191 | ** Operadores de tipos de archivo 192 | - Otro operador de búsqueda de google es el operador de tipos de archivo. 193 | - Se puede buscar documentos que estén en un determinado formato de archivo en un sitio determinado 194 | - O se pueden buscar palabras que estén en un documento con un formato determinado. 195 | - O concatenar aun más con el operador de sitio y el de tipo de archivo. 196 | 197 | *** Búsqueda en sitio concreto y tipo de archivo concreto 198 | 199 | Busca documentos que estén en formato =xls= en =elpais.com= 200 | 201 | #+BEGIN_SRC google 202 | filetype:xls site:elpais.com 203 | #+END_SRC 204 | 205 | *** Búsqueda de literales en tipo de archivo concreto 206 | 207 | Busca literales =violencia de género= que estén en un documento con un formato =csv= 208 | 209 | #+BEGIN_SRC google 210 | filetype:csv "violencia de género" 211 | #+END_SRC 212 | 213 | *** Búsqueda de literales en tipo de archivo en sitio concreto 214 | 215 | Busca literales =violencia de género= en archivos =csv= en el sitio del =ine.es= 216 | 217 | #+BEGIN_SRC google 218 | filetype:csv site:ine.es "violencia de género" 219 | #+END_SRC 220 | 221 | ** Operadores de búsqueda 222 | - El listado completo de operadores de búsqueda disponible se encuentra en [[https://support.google.com/websearch/answer/2466433?hl=en][Google]]. 223 | 224 | *** =link:= 225 | =link:= encuentra páginas que enlazan a cierta página. 226 | 227 | #+BEGIN_SRC google 228 | link:okfn.es 229 | #+END_SRC 230 | 231 | *** =related:= 232 | =related:= encuentra páginas similares a una de tu elección. 233 | 234 | #+BEGIN_SRC google 235 | related:okfn.es 236 | #+END_SRC 237 | 238 | *** =info:= 239 | =info:= obtiene información sobre una página web, incluida la versión cacheada de la página, páginas similares y páginas que enlazan con el sitio. 240 | 241 | #+BEGIN_SRC google 242 | info:okfn.es 243 | #+END_SRC 244 | 245 | *** =cache:= 246 | 247 | =cache:= muestra la página la última vez que Google visitó la página. 248 | 249 | #+BEGIN_SRC google 250 | cache:okfn.es 251 | #+END_SRC 252 | 253 | ** Desafíos 254 | - Busca patrones en la información, los datos o la estructura de las páginas: 255 | 256 | - Estructura de páginas estructurada: 257 | http://www.ejercito.mde.es/unidades/Cordoba/index.html 258 | - Una tabla en una web 259 | https://en.wikipedia.org/wiki/List_of_Spanish_provinces_by_sequence_or_length_of_coastline 260 | - Tablas páginadas con /URLs/ distintas 261 | http://www.bbc.co.uk/food/recipes/ 262 | 263 | * Otras utilidades 264 | Veremos algunas utilidades que nos pueden ayudar de una u otra manera: 265 | - /Bitly/ 266 | - /Twitter/ 267 | - /Archive.org/ 268 | - /Wayback Machine/ 269 | - Código fuente 270 | - /TinEye/ 271 | - Otras: /Readability/, /Downthemall/. 272 | ** Bit.ly 273 | - El servicio de /urls/ cortas nos puede ayudar a saber cuántas veces se ha compartido un determinado enlace. 274 | - Tenemos que ir a http://bit.ly e introducir la /URL/ que nos interesa. 275 | - Si ya se ha utilizado, aparecerá una /URL/ corta y podremos ver esa información escribiendo la URL seguida del símbolo =+=. 276 | - Así vemos las estadísticas completas de la página, da una idea de lo popular que era la página y de lo que fue utilizado por las redes sociales como /Twitter/ o /Facebook/. 277 | ** Twitter 278 | - Con /Twitter/ hacemos algo parecido a /Bit.ly/ 279 | - No vamos a poder disfrutar del mismo nivel de estadísticas. 280 | - Se trata de buscar en el buscador de Twitter un enlace que nos interese y mostrará las últimas veces que se ha compartido. 281 | - No guarda un histórico de todo el tiempo. 282 | ** La máquina del tiempo de archive.org 283 | - La herramientas [[http://archive.org/web/web.php][Wayback Machine]] de [[http://www.archive.org][Internet Archive]] guarda pantallazos periódicos de las webs 284 | - 456 mil millones de páginas en total que puedes consultar desde su buscador. 285 | - Una vez encontrada esa página, ese dominio, podemos ver en una línea de tiempo los distintos instantes que ha guardado la máquina y ver qué aspecto tenía. 286 | - No guarda muchas imágenes o estilos, por cuestiones de espacio, pero nos puede dar alguna sorpresa. 287 | 288 | ** Código fuente HTML 289 | - A menudo en el código fuente los programadores han realizado comentarios o han ocultado algo que podía estar en otro momento y que ahora no conviene. 290 | - No hace falta saber de /HTML/ pero sí que hay que saber dónde buscar. 291 | - Los comentarios, contenido que el navegador no muestra, se encuentran entre los signos de == cierre de comentario. 292 | - Por ejemplo, en la página de [[http://theguardian.co.uk][The Guardian]] ahora ponen que están contratando programadores. 293 | 294 | ** TinEye 295 | - TinEye permite controlar el uso de las imágenes en un sitio web 296 | - Nos pueda dar pistas sobre el origen, la fuente, otros usos de esa imagen... 297 | - Se puede subir una imagen o bien escribir una /URL/, ya sea de la imagen o de la página web que contiene esa imagen 298 | - Es capaz de mostrar unos resultados que pueden ser curiosos.. Por ejemplo, cuando se produce un acontecimiento importante, se suelen utilizar las mismas imágenes para ilustrarlo. 299 | - Con TinEye podemos ver en qué medios se están utilizando esas imágenes y cuándo lo hicieron, por lo que podemos saber quién lo hizo primero y crear una línea temporal del uso de la imagen. 300 | - Tiene extensiones para Firefox, Opera, Chrome o Safari. http://www.tineye.com 301 | - Ejemplo: https://www.tineye.com/search/1dc12635c9e2e21a53002ef0ce9ac0e458d59492/ 302 | 303 | ** Otras 304 | 305 | - [[http://www.readability.com][Readability]], servicio web que ayuda a extraer texto de la página web. Dispone de extensión para Firefox. 306 | - [[http://www.downthemall.net/][DownThemAll]], extensión que permite la descarga de varios archivos a la vez. 307 | * Outwit Hub 308 | - Outwit Hub, software y extensión para el navegador que contiene varias utilidades de reconocimiento y extracción de contenidos web y de organizar las colecciones de datos. 309 | - Busca automáticamente a través de páginas. 310 | - La primera vista en el marco de la izquierda es =Página=, mientras que los otros objetos son: =links=, =images=, =data= 311 | - OutWit considera la página web como elementos de datos, por lo que si nos ponemos sobre el objeto =images=, seleccionaremos todas las imágenes. 312 | ** Conceptos Outwit 313 | Hay tres conceptos en OutWit Hub: 314 | 315 | 1. Una cesta de la compra llamada /catch/ o la /cesta/, discpuesto al pie de la página para recoger todo lo que queramos. 316 | 2. Podemos filtrar la información por cada tipo de datos y recogerla en nuestra cesta. 317 | 3. Puedes navegar a lo largo de varias páginas con el botón de paginación. 318 | ** Vistas Outwit 319 | Las vistas que muestra /OutWit/ son: 320 | 321 | - /Página/, actual. Muestra imágenes, enlaces, correos electrónicos, textos, rss, enlaces de noticias y otros datos que pueden extraerse de la página. 322 | - /Imágenes/, que aparecen en la página actual. Se pueden filtrar, ordenar y copiar en la cesta. 323 | - /Enlaces/, que aparecen en la página actual. Se pueden filtrar, ordenar y copiar en la cesta. 324 | - /Correos electrónicos/, que aparecen en la página. ídem. 325 | - /Texto/, muestra el texto de la página. 326 | - /RSS/, en caso de que los hubiera. 327 | - /Tablas/, extrae el contenido de la tabla y se le puede aqplicar las operaciones típicas. 328 | - /Listas/, extrae el contenido de las listas. 329 | - /Scraper/, aplica un escrapeador previamente cargado a la página. 330 | - /Source/, muestra el HTML de la página. 331 | 332 | ** Filtros Outwit 333 | Los filtros de control de los que dispone: 334 | 335 | - Ocultar local, si activas esta caja de control, la vista solo mostrará los enlaces salientes o las imágenes externas, y se ocultaán los elementos locales. 336 | - Ocultar caché, cuando esta casilla esté activa, las URLs cacheadas no se mostrarán. 337 | - Documentos, cuando esta casilla esté marcada, sólo se mostrarán las URLs que correspondan con docuementos: pdf, doc, xls, etc. 338 | - /Script/, si está marcada esta casilla, se mostrarán las imágenes que vengan de scripts y el resto se ocultarán. 339 | - /Style/, si se marca se ocultarán las imágenes que no vengan de CSS. 340 | - Background, muestra las imágenes utilizadas como fondo si está marcada. 341 | 342 | ** Navegación Outwit 343 | Cuando hay más de una página que cargar, cuenta con algunas opciones: 344 | - /Next/, carga la página siguiente de la serie 345 | - /Browse/, busca automáticamente a través de todas las páginas de una serie. 346 | - /Dig/, puede explorar todos los enlaces de la página. Si pinchamos en /Dig/, en el menú podemos establecer la profundidad de la búsqueda. Si marcamos =depth \= 0=, buscará por todos los enlaces de la página pero si modificamos el valor a =1=, explorará también todos los enlaces de las páginas visitadas. 347 | - /Site Home/, carga la página principal del sitio. 348 | - /Slideshow/, muestra las imágenes de la página como un carrusel. 349 | 350 | ** Resultados 351 | - Los datos se pueden exportar a CSV, TSV, HTML, XLS o crear scripts SQL para guardarlos en bases de datos. 352 | - En la versión de pago también se pueden programar tareas. 353 | - Se suele adoptar como estándar de tiempo entre petición y petición la de 2 segundos de retraso. 354 | - Si nos encontramos con contenido generado dinámicamente a través de javascript, será mejor que recopilemos los datos manualmente o que aprendemos otra técnica. 355 | 356 | ** Enlaces Outwit 357 | - Extensión, http://www.outwit.com/products/hub/license.php 358 | - Add-on Firefox, https://addons.mozilla.org/en-US/firefox/addon/outwit-hub/ 359 | - Vídeo, https://www.youtube.com/watch?v=ffoXpBlHZpo 360 | 361 | * Import.io 362 | - Import.io es una herramienta para la extracción de datos de páginas web. 363 | - No se necesita ningún aprendizaje de lenguajes de programación. 364 | - Para probarla podemos hacerlo a través de https://magic.import.io 365 | - Podemos [[http://support.import.io/knowledgebase/articles/190281-how-do-i-install-import-io][descargárnosla de la web]] 366 | - En http://magic.import.io pones la /URL/ que deseas probar y pulsas el botón "GET DATA". 367 | - Nos aparecen los datos tabulados en una tabla. 368 | - Eliminamos columnas que no queramos pinchando en la =(x)= que aparece. 369 | - Si queremos guardar la información que aparece, tendremos que dar a =Extract Data= 370 | - En la parte de abajo de la página salen tres botones. 371 | - Uno es por si lo que ha encontrado import.io no es lo que queríamos. 372 | - Si queremos descargarnos los datos para jugar con ellos, /Download CSV/ 373 | - Pero también podemos crear una /API/, si estamos registrados. 374 | 375 | * Kimonolabs 376 | - Herramienta de /scraping/ que convierte web en API. 377 | - Se utiliza como [[https://chrome.google.com/webstore/detail/kimono/deoaddaobnieaecelinfdllcgdehimih?hl%3Des%0A][extensión]] en Chrome/Chromium o atajo a los marcadores en Firefox. 378 | - Una vez que estamos registrados en Kimono, podremos comenzar a crear nuestra propia API de cualquier sitio web apuntando al botón de Kimono. 379 | - Una de las características de Kimono y que lo hacen muy atractivo es el hecho de crear una API sobre la base de cualquier web. 380 | - La /API/ nos ofrece una forma de interactuar con el contenido de esa web de forma automática, por lo que podemos crear nuestra propia web o aplicación con nuestro propio /HTML/, /CSS/ y/o /JavaScript/ y poner el contenido de esa /API/, normalmente en formato /JSON/. 381 | ** Codesamples 382 | 383 | *** Curl 384 | #+BEGIN_SRC sh 385 | curl --include --request GET "https://www.kimonolabs.com/api/5gqzg2ws?apikey=NQEaiInc5MYvqqdD14pvzpHvpwkqsDQ3" 386 | 387 | #+END_SRC 388 | *** R 389 | 390 | #+BEGIN_SRC R 391 | library('bitops') 392 | library('RCurl') 393 | install.packages('rjson') 394 | library('rjson') 395 | json <- getURL('https://www.kimonolabs.com/api/5gqzg2ws?apikey=NQEaiInc5MYvqqdD14pvzpHvpwkqsDQ3') 396 | obj <- fromJSON(json) 397 | print(obj) 398 | 399 | 400 | 401 | #+END_SRC 402 | * wget 403 | Permite descargar ficheros de sitios 404 | * httrack 405 | * Inspección técnica de HTML 406 | 407 | - /Firebug/ se ha convertido en la herramienta estándar 408 | - Chinche de la malva o zapatero, una extensión del navegador que permite analizar y descubrir todo lo necesario sobre la página web que estamos visitando para su modificación o interpretación. 409 | - Comenzó como una extensión muy utilizada por desarrolladores web para editar, mostrar errores y monitorear el funcionamiento de /JavaScript/, /CSS/ y /HTML/ en tiempo real y en cualquier página. 410 | - Permite también explorar el /DOM/ (/Document Object Model/ o modelo de objetos del documento) para crear selectores /CSS/ en conjunción con /JavaScript/ y así conseguir webs dinámicas. 411 | - Tanto es así que Mozilla Firefox tiene una versión integrada de Firebug, en analizador. 412 | - Si queremos experimentar un poco más, podemos descargar la extensión desde http://www.getfirebug.com 413 | 414 | ** Firebug 415 | Una vez que hemos instalado la extesión de Firefox, podemos utilizarlo de dos manera: 416 | 417 | - Atajos de teclado: 418 | - =F12= abre y cierra Firebug 419 | - =CTRL + F12= abre Firebug en una ventana nueva 420 | - =CTRL + F12=, si lo tienes abierto en ventana nueva, lo colca integrado 421 | - =SHIFT + F12=, cierra la consola si la tienes abierta 422 | - Ratón: 423 | - Activamos la aplicación con el icono. 424 | - También podemos seleccionar cualquier parte de la web con el botón derecho y pinchar en =inspeccionar elemento= 425 | 426 | ** Consola 427 | En ambos casos trabajamos con una consola que nos muestra la información de la página, en concreto: 428 | - Consola, muestra información de errores del JavaScript de la página. Podemos introducir y ejecutar comandos. 429 | - /HTML/, muestra el /HTML/ como nodos DOM de una jerarquía. Los nodos individuales pueden expandirse o contraerse para mostrar u ocultar los nodos hijos. También muestra el /box model/ (modelo de caja) CSS para cada elemento seleccionado. 430 | - CSS, muestra todos los estilos CSS cargados y puedes introducir CSS y mofificarlos al momento. Hay una ventana que muestra todos los estilos cargados por nombre. 431 | - Script, muestra los archivos JS incluidos y se pueden inspeccionar y activar o desactivar por partes. 432 | - DOM, Muestra los objetos y propiedades DOM. 433 | - Net, puedes comprobar cuańto tarda cada recurso en cargar, muestra las cabeceras de peticiones y respuestas HTTP para cada recurso. 434 | 435 | * Google Drive 436 | 437 | - importHTML() 438 | - importFeed() 439 | - importXML() 440 | - importURL() 441 | - importData() 442 | - importRange() 443 | ** ImportHTML() 444 | - El método más fácil consiste en importar datos de una tabla o una lista a Google Drive con la función =IMPORTHTML= 445 | - Para ello tendremos que tener ciertas nociones de /HTML/ 446 | - Permite importar contenido de tipos de elementos /HTML/, tablas y listados. 447 | - Afecta a los elementos =table= (tabla), =ul=, =ol= y =dl= (listados). 448 | - =ul=, que corresponde a /unordered list/ o lista desordenada, la típica lista donde cada elemento aparece con un punto o un guión. 449 | - =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. 450 | - =dl=, corresponde con /description list/, listas de descripciones 451 | - =table=, corresponde con una tabla de datos tabulados. 452 | - 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: 453 | 454 | #+BEGIN_SRC google 455 | =IMPORTHTML("URL";"list|table";n) 456 | #+END_SRC 457 | 458 | ** ImportXML 459 | 460 | - También podemos utilizar la función =IMPORTXML("url";"xpath_query")= para extraer otro tipo de información o acceder al contenido por =XPath=. 461 | - Para ayudarnos a ello, además de /Firebug/, podemos utilizar la extensión de Firefox [[https://addons.mozilla.org/en-US/firefox/addon/xpath-checker/][XPath Checker]] 462 | -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/, haremos: 463 | 464 | #+BEGIN_SRC google 465 | =IMPORTXML("URL";"//a/@href") 466 | 467 | #+END_SRC 468 | 469 | - Pero podríamos elegir sólo los enlaces que tienen una determinada clase, lo que haríamos también con /XPath/ de esta manera: 470 | 471 | #+BEGIN_SRC google 472 | =IMPORTXML("URL";"//a[@class='clase']") 473 | 474 | #+END_SRC 475 | 476 | - 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: 477 | 478 | #+BEGIN_SRC google 479 | =IMPORTXML(celda1;celda2) 480 | #+END_SRC 481 | 482 | - 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')= 483 | - 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= 484 | 485 | #+BEGIN_SRC google 486 | =IMPORTXML("URL"; "//div[starts-with(@class,'clase')]") 487 | #+END_SRC 488 | 489 | Si quisiéramos los enlaces, añadiríamos al final =//@href=, ya que el enlace se encuentra en el atributo de =a=, =href= 490 | 491 | #+BEGIN_SRC google 492 | =IMPORTXML("URL"; "//div[starts-with(@class,'clase')]//@href") 493 | 494 | #+END_SRC 495 | 496 | 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=: 497 | 498 | #+BEGIN_SRC google 499 | =CONCATENATE("URL",celda-resultados) 500 | 501 | #+END_SRC 502 | 503 | Y luego estiramos esta función al resto de las celdas que lo requieran. 504 | 505 | ** Algunos ejemplos XPath útiles: 506 | - =//=, descarga todos los elementos de html que empiecen con =<= 507 | - =//a=, descarga todos los contenidos del elemento =a=, los enlaces, de la URL que decidamos. 508 | - =//a/@href=, descarga todos los contenidos del atributo =href= del elemento =a=, que corresponden con la URL del enlace. 509 | - =//input[@type='text']/..=, descarga todos los elementos padre de los elementos de texto =input= 510 | - =count(//p)=, cuenta el número de elementos que le digamos, en este caso párrafos =p= 511 | - =//a[contains(@href, 'protesta')]/@href=, encuentra todos los enlaces que contienen la palabra =protesta= 512 | - =//div[not(@class='left')]=, encuentra todos los =div= cuyas clases no sean =left= 513 | - =//img/@alt=, muestra todos los textos de los atributos =alt= de las imágenes =img= 514 | ** Ejemplo complejo 515 | 516 | #+BEGIN_SRC google 517 | =IMPORTXML("URL";"//div[@class='clase']//h3") 518 | #+END_SRC 519 | 520 | Nos da todos los titulares =h3= que se encuentran dentro del =div= con clase =clase=n de los artículos de la /URL/ 521 | 522 | 523 | 524 | * PDF 525 | ** Interroga a un /PDF/ 526 | Diagrama propuesto por Nicolas Kayser-Brill 527 | 528 | file:///home/flow/Documentos/curro/unir/mineria-datos/temas/nkb-pdf.png 529 | 530 | 531 | - ¿Es tu imagen un PDF? 532 | - Sí, entonces utiliza OCR para extraer datos 533 | - Google Drive, https://support.google.com/drive/answer/176692?hl=en 534 | - No, entonces ¿puedes copiar el texto seleccionándolo y pegándolo en otro documento? 535 | - No, tendrás que usar otro software 536 | - Sí, entonces puedes usar: 537 | - [[http://tabula.technology][Tabula]], para extraer datos automáticamente. 538 | - /PDFtoExcelOnline/: subes un PDF y te envían por correo el XLS. http://pdftoexcelonline.com 539 | - [[http://smallpdf.com][smallpdf]] 540 | 541 | ** Colaboración 542 | - Si todo lo anterior falla, se puede utilizar alguna herramienta colaborativa. 543 | - [[http://www.documentcloud.org][Documentcloud]], creada por miembxs de la comunidad de periodismo de datos. 544 | - [[https://www.mturk.com/mturk/welcome][mTurk]] de /Amazon/. 545 | - [[http://crowdcrafting.org/][Crowdcrafting]] 546 | 547 | ** Crowdcrafting: PDF Transcribe 548 | - [[http://crowdcrafting.org/app/pdftranscribe/][PDF Transcribe]] es el nombre de la aplicación de /PyBossa/ que permite transcribir un /PDF/ colaborativamente. 549 | - Utiliza la librería /Mozilla PDF.JS library/ para cargar un archivo /PDF/ externo y renderizarlo en la aplicación que se ejecuta en el navegador sin necesidad de terceros. 550 | - A su lado se extiende un formulario personalizado para extraer los datos que solicitamos de cada documento. 551 | - Se pueden añadir tantos campos como sean necesarios en el formulario para recopilar la información que necesitemos, explicándolo convenientemente. 552 | - Podemos asignar tareas a usuarios y completar de manera distribuida y colaborativa el proyecto de transcripción. 553 | 554 | http://img10.imageshack.us/img10/5364/pdftranscribe1.png 555 | #+CAPTION: Ventana de la app de transcripción de PDF con Crowdcrafting 556 | 557 | ** Probar, probar, probar 558 | 559 | - ProPublica advierte en su guía para convertir PDF en documentos de texto que ninguna solución va a ser completa por la propia solución y/o por los documentos PDF. 560 | - Lo normal es combinar las técnicas y encontrar las opciones que más satisfagan. 561 | - Siempre se necesita una revisión manual o dos del trabajo realizado por las herramientas. 562 | 563 | ** pdftotext, xpdf 564 | - /pdftotext/ es una herramienta de código abierto 565 | - Funciona en consola 566 | - Convierte archivos /PDF/ a texto plano. 567 | - Forma parte de /xpdf/, un conjunto de aplicaciones para trabajar con documentos PDF. También se incluye como parte de /Poppler/, un proyecto derivado de /Xpdf/. 568 | 569 | Solo puede convertir un documento cada vez: 570 | 571 | #+BEGIN_SRC sh 572 | pdftotext archivo.pdf 573 | 574 | #+END_SRC 575 | 576 | http://www.foolabs.com/xpdf/download.html 577 | 578 | - Para especificar la primera página a convertir: 579 | #+BEGIN_SRC sh 580 | pdftotext -f numero-primera-pagina-convertir 581 | 582 | #+END_SRC 583 | 584 | - Especifica la última página a convertir: 585 | #+BEGIN_SRC sh 586 | pdftotext -l numero-ultima-pagina-convertir 587 | 588 | #+END_SRC 589 | 590 | *** Opciones 591 | 592 | - Especifica la resolución, en puntos por pulgada. El valor por defecto es 72. 593 | 594 | #+BEGIN_SRC sh 595 | pdftotext -r resolucion-en-PPP 596 | 597 | #+END_SRC 598 | 599 | - Especifica la coordenada x del área que selecciona desde la esquina superior izqda: 600 | #+BEGIN_SRC sh 601 | pdftotext -x coordenada-x 602 | 603 | #+END_SRC 604 | - Especifica coordenada y del área que selecciona desde la esquina superior izqda: 605 | 606 | #+BEGIN_SRC sh 607 | pdftotext -y coordenada-y 608 | 609 | #+END_SRC 610 | 611 | - Especifica la anchura (la =W= es por /width/) del área en pixels. El valor por defecto es 0: 612 | #+BEGIN_SRC sh 613 | $ pdftotext -W valor-ancho 614 | 615 | #+END_SRC 616 | 617 | - Especifica la altura (la =H= es por /height/) del área seleccionada en pixels. El valor por defecto es 0. 618 | #+BEGIN_SRC sh 619 | pdftotext -H valor-alto 620 | 621 | #+END_SRC 622 | 623 | - Si queremos conservar el aspecto tanto como se pueda, hay que apuntar la opción =-layout=. El valor por defecto es =undo=, que fuerza el texto a mostrarse en texto corrido. 624 | 625 | #+BEGIN_SRC sh 626 | pdftotext -layout 627 | 628 | #+END_SRC 629 | 630 | - Ancho fijo tabulado, con el valor de la anchura en puntos, lo cual fuerza el modo de disposición física: 631 | 632 | #+BEGIN_SRC sh 633 | pdftotext -fixed valor-ancho-en-puntos 634 | 635 | #+END_SRC 636 | 637 | - Generación de archivo /HTML/ que incluya la meta información, encaja el texto en elementos =
= y =
= 638 | #+BEGIN_SRC sh 639 | pdftotext -htmlmeta 640 | 641 | #+END_SRC 642 | 643 | - Con la opción =-bbox= se genera un archivo /XHTML/ que contiene caja de información de cada palabra. 644 | 645 | #+BEGIN_SRC sh 646 | pdftotext -bbox 647 | 648 | #+END_SRC 649 | 650 | - Si queremos especificar la codificación del formato de salida. Por defecto es /UTF-8/: 651 | 652 | #+BEGIN_SRC sh 653 | pdftotext enc codificacion 654 | 655 | #+END_SRC 656 | 657 | ** Ghostscript 658 | 659 | - Es el lenguaje que entienden las impresoras. 660 | - Se puede utilizar para reducir el tamaño de archivos /PDF/ 661 | - Si tienes /Ghostscript/ instalado (=gs=), puedes correr este comando en consola: 662 | #+BEGIN_SRC sh 663 | gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -sOutputFile=nuevo_archivo.pdf original.pdf 664 | #+END_SRC 665 | 666 | En las opciones de =-dPDFSETTINGS=, puedes optar por: 667 | - =/screen=. si quieres una baja resolución y un tamaño pequeño. 668 | - =/ebook=, selecciona resolución media y tamaño mediano. 669 | - =/printer= y =/prepress=, para resoluciones altas 670 | 671 | ** PDFtk 672 | 673 | - PDFtk permite realizar muchas operaciones con /PDF/ 674 | - Necesitas el comando =pdftk= desde la terminal. 675 | - O bien o [[http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/][pdf toolkit]] http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/ 676 | 677 | *** Rotar documentos 678 | 679 | - Para rotar por completo un /PDF/ o páginas determinadas, en los puntos cardinales elegidos. 680 | - Por ejemplo, para rotar una página 90 grados en el sentido de las agujas del reloj: 681 | #+BEGIN_SRC sh 682 | pdftk entrada.pdf cat 1east output salida.pdf 683 | 684 | #+END_SRC 685 | 686 | - Donde =1east= significa que la página =1= gira 90º al =East= (Este) 687 | 688 | Las opciones son: 689 | - =north=, 0 grados 690 | - =east= o =right=, 90º 691 | - =south= o =down=, 180º 692 | - =west= o =left=, 270º 693 | =left=, =right= and =down= hacen ajustes relativos a la rotación de la páginas. 694 | 695 | *** Dividir un PDF en varios 696 | 697 | - Si queremos dividir (/split/) un /PDF/ muy largo en varios documentos /PDF/, podemos utilizar la opción =burst= 698 | #+BEGIN_SRC sh 699 | pdftk pdflargo.pdf burst 700 | #+END_SRC 701 | 702 | Lo que dará como resultado tantos archivos /PDF/ como páginas tenía el documento. 703 | 704 | ** ImageMagick 705 | 706 | - /Imagemagick/ es un conjunto de herramientas en consola para modificar y tratar imágenes, bien en el momento o bien integrado en un /script/ en /bash/. 707 | - Lo podemos utilizar para convertir imágenes en /PDF/ y así manipular el documento como /PDF/. 708 | - Utiliza el comando =convert= 709 | 710 | Convert: 711 | 712 | #+BEGIN_SRC sh 713 | convert *.jpg +adjoin page-%d.pdf 714 | #+END_SRC 715 | Donde =jpg= es el formato de la imagen, pero podríamos trabajar también con archivos =png= o =gif=. 716 | 717 | Si no nos aparece tal como queremos, quizás podamos jugar con los parámetros: 718 | 719 | #+BEGIN_SRC sh 720 | convert -density 150 archivo.pdf -quality 90 salida.png prefijo 721 | 722 | #+END_SRC 723 | 724 | Donde: 725 | - =-density= especifica el valor de la resolución en /PPP/. 726 | - =-quality= especifica la calidad, donde 100 significa =sin compresión= 727 | - =prefijo= indica el prefijo a utilizar al crear cada archivo de imagen. 728 | 729 | También podríamos hacer la conversión en un nuevo directorio: 730 | #+BEGIN_SRC sh 731 | mkdir convertidas && for i in *.pdf; do convert -density 150 $i convertidas/$i; done 732 | #+END_SRC 733 | 734 | Con la opción =-colorspace Gray= convertimos una imagen de color a escala de grises. 735 | 736 | ** Poppler-utils pdftoppm 737 | 738 | - Con las utilidades /poppler-utils/ manipulamos /PDF/ 739 | - Su paquete /pdftoppm/ permite convertir /PDF/ a imágenes en formato /ppm/, /png/ o /jpg/. 740 | 741 | #+BEGIN_SRC sh 742 | pdftoppm -png file.pdf prefijo 743 | #+END_SRC 744 | 745 | - Lo que produce tantos /png/ como páginas tiene, con el prefijo /prefix/. 746 | - La resolución por defecto es 150 /ppp/ /puntos por pulgada/. 747 | 748 | Para incrementar la resolución, se puede hacer con las opciones =rx= y =ry=. 749 | 750 | #+BEGIN_SRC sh 751 | pdftoppm -rx 300 -ry 300 -png archivo.pdf prefijo 752 | #+END_SRC 753 | 754 | Para imprimir solo una página, se utiliza la opción =singlefile=, y con la opción =n= se especifica el número de página. La primera página es la número 1. 755 | 756 | #+BEGIN_SRC sh 757 | pdftoppm -f N -singlefile -png archivo.pdf prefijo 758 | #+END_SRC 759 | 760 | ** pdfcrop 761 | 762 | https://sourceforge.net/projects/pdfcrop/files/ 763 | texlive-extra-utils 764 | 765 | #+BEGIN_SRC sh 766 | pdfcrop --margins '5 10 20 30' input.pdf output.pdf 767 | 768 | #+END_SRC 769 | 770 | Automatizar archivos =PDF= de un directorio: 771 | 772 | #+BEGIN_SRC sh 773 | ,#!/bin/bash 774 | 775 | for FILE in ./*.pdf; do 776 | pdfcrop --margins 5 "${FILE}" "${FILE-cropped}" 777 | done 778 | 779 | #+END_SRC 780 | 781 | ** pdfjam 782 | 783 | Utilidad en línea de comandos para el paquete de LaTeX /pdfpages/ 784 | 785 | #+BEGIN_SRC sh 786 | pdfjam --keepinfo --trim "15mm 15mm 30mm 60mm" --clip true --suffix "cropped" 6_Abengoa.pdf 787 | 788 | #+END_SRC 789 | ** PDF-Shuffler 790 | 791 | Aplicación gráfica (GTK) para Linux que ayuda a pegar, dividir, rotar o reorganizar las páginas a través de una interfaz gráfica. Es un frontend para /python-pyPdf/ 792 | 793 | https://sourceforge.net/projects/pdfshuffler/ 794 | 795 | ** Briss 796 | 797 | Aplicación multiplataforma (/Linux/, /Windows/ y /Mac OSX/ para recortar archivos PDF. Una simple interaz nos permite definir la región. 798 | 799 | http://briss.sourceforge.net/ 800 | https://sourceforge.net/projects/briss/files/ 801 | 802 | ** qpdf 803 | 804 | Para desencriptar un /PDF/ encriptado 805 | 806 | #+BEGIN_SRC sh 807 | qpdf --password='' --decrypt archivo-original.pdf archivo-desencriptado.pdf 808 | #+END_SRC 809 | 810 | ** pyPdf 811 | 812 | Receta de Python 813 | http://code.activestate.com/recipes/576837-crop-pdf-file-with-pypdf/ 814 | python-pypdf2 - Pure-Python library built as a PDF toolkit (Python 2) 815 | python3-pypdf2 - Pure-Python library built as a PDF toolkit (Python 3) 816 | python-pypdf - PDF toolkit implemented solely in Python 817 | 818 | ** Rmagick 819 | 820 | - [[http://rmagick.rubyforge.org/portfolio.html][Rmagick]] es otra herramienta que recomiendan en el artículo de ProPublica para trabajar con imágenes desde la consola 821 | - También permite realizar dibujos en 2D. 822 | - Transformaciones: http://rmagick.rubyforge.org/portfolio.html 823 | - Dibujos: http://rmagick.rubyforge.org/portfolio3.html 824 | - Efectos especiales: http://rmagick.rubyforge.org/portfolio2.html 825 | - Repositorio en GitHub: http://github.com/rmagick/rmagick 826 | 827 | ** PDF Split and Merge 828 | 829 | - Si nos da un poco de respeto o no podemos acceder a una línea de comandos, podemos contar con [[http://sourceforge.net/projects/pdfsam/%0A][PDF Split and Merge]] 830 | - Se trata de una herramienta en modo gráfico (y también en línea de comandos) para separar, juntar, mezclar y rotar /PDF/. 831 | - Está disponible para /Windows/, /MacOSX/ y /GNU/Linux/ y el único requisito es que necesita del entorno virtual de /Java/. 832 | - Entre sus funcionalidades, destacan: 833 | - Pegar documentos /PDF/ 834 | - Dividir documentos /PDF/, especificando el número de páginas 835 | - Dividir documentos /PDF/, especificando el nivel de los marcadores 836 | - Rotar /PDF/ 837 | - Mezclar dos documentos /PDF/, componiendo uno nuevo que alterne una página de cada. 838 | - Componer visualmente un nuevo /PDF/ arrastrando páginas de otros /PDF/. 839 | 840 | ** Herramientas Web 841 | 842 | - Zamzar, Cometdocs y Smallpdf son servicios web online. 843 | - Por tanto, el documento deja de estar en tu equipo y pasa por Inet hasta sus servidores. 844 | - Se suben los archivos ahí y o bien te devuelven una salida en un formato de texto o bien un correo electrónico con un enlace para que los puedas descargar. 845 | - [[http://www.zamzar.com/][Zamzar]] es un servicio web para realizar conversiones de todo tipo. 846 | - [[http://www.cometdocs.com/][Cometdocs]] es otro servicio web para realizar conversiones aunque también funciona como servicio de almacenamiento y para compartir archivos. Dispone de una versión escritorio para /Windows/ e /iOS/. También dispone de una API como servicio de pago. 847 | - [[http://smallpdf.com/][smallpdf]] es otro servicio web que permite manipular y convertir /PDF/ 848 | 849 | ** Tika 850 | 851 | [[http://okfnlabs.org][OKFN Labs]] tiene en fase beta un [[http://okfnlabs.org/blog/2015/02/21/documents-to-text.html][servicio web]] que permite convertir un gran número de tipos de archivo a =TXT=. 852 | 853 | El servicio web se encuentra en http://beta.offenedaten.de:9998/tika, y para comprobar su funcionamiento tan solo hemos de tener una imagen que contenga texto y lanzar la consulta, en /Mac/, /GNU/Linux/ o /Cygwin/, desde la terminal: 854 | 855 | #+BEGIN_SRC sh 856 | curl -T ruta_archivo_imagen http://beta.offenedaten.de:9998/tika 857 | #+END_SRC 858 | 859 | En =STDOUT=, es decir, en la consola, se nos mostrará el texto que contiene la imagen. 860 | 861 | Si queremos guardarlo automáticamente en una archivo de texto para facilitar su revisión, podemos añadir una concatenación de tareas: 862 | 863 | #+BEGIN_SRC sh 864 | curl -T ruta_archivo_imagen http://beta.offenedaten.de:9998/tika > ruta_archivo_a_revisar.txt 865 | #+END_SRC 866 | 867 | - El proyecto lo realizó Matt Fullerton de [[http://okfnlabs.org][OKFNLabs]] a partir del servidor web de /Apache/ /Tika Project/, que soporta /Tesseract/. 868 | - Ha creado una imagen /docker/ por si quieres replicarlo en tu [[https://registry.hub.docker.com/u/mattfullerton/tika-tesseract-docker/%0A][propio servidor]] 869 | - Y también puedes construirla desde [[https://github.com/mattfullerton/tika-tesseract-docker][GitHub]] 870 | 871 | ** Good Tables 872 | 873 | - /Good Tables/ es otro proyecto de [[http://okfnlabs.org][OKFNLabs]] que consiste en un paquete /Python/ para validar datos tabulares. 874 | - Puede funcionar con simples /CSV/ o en una tubería de procesos /ETL/. 875 | - Se trata de una versión alfa 876 | - Artículo sobre Good Tables, http://okfnlabs.org/blog/2015/02/20/introducing-goodtables.html 877 | - Read the Docs, https://goodtables.readthedocs.org/en/latest/ 878 | 879 | * Un caso singular: ProPublica 880 | - [[http://propublica.org/][ProPublica]] realiza grandes investigaciones de periodismo de datos. 881 | - Y tanto o más importante: lo documentan. 882 | - Un ejemplo concreto lo tuvieron con el proyecto [[https://projects.propublica.org/docdollars/][Dollars for Docs]] y cómo utilizaron [[http://www.propublica.org/nerds/item/image-to-text-ocr-and-imagemagick][varias herramientas]] 883 | - En este caso crearon la guía /Scraping for Journalism, A guide for Collecting Data/ 884 | - [[https://www.propublica.org/nerds/item/doc-dollars-guides-collecting-the-data][Recolección de datos]] 885 | - [[http://www.propublica.org/nerds/item/image-to-text-ocr-and-imagemagick][Tratamiento de imágenes]] 886 | - [[http://www.propublica.org/nerds/item/turning-pdfs-to-text-doc-dollars-guide][PDF scraping]] 887 | 888 | ** El proceso 889 | Ante una tabla de datos en una imagen: 890 | 1. En un programa de tratamiento de imágenes, con líneas guía, crearon una cuadrícula donde el texto de cada celda pudiera posteriormente seleccionarse con la herramienta de selección rectangular. 891 | 2. Dividieron la imagen y crearon imágenes nuevas, una por cada celda con texto, identificándolas apropiadamente con el número de celda por fila (/row/) y por columna (/column/) correcto. 892 | 3. Para ello utilizaron distintas operaciones de /RMagick/. 893 | 4. Descartaron todo el espacio en blanco de los márgenes de la tabla con [[http://studio.imagemagick.org/RMagick/doc/image1.html#bounding_box][bounding_box]], 894 | 5. Convirtieron la tabla a blanco y negro (escala de grises) para que el /OCR/ funcione mejor. 895 | 6. Primero probaron con las opciones de /RMagick/ =quantize= y =contrast=, pero como los resultados no fueron los esperados lo hicieron con /Photoshop/, que permite también operaciones por lotes. 896 | 7. Crearon una imagen con cada celda con un nombre que lo identificara su posición en la tabla por número de fila y número de columna. Así lograron 500 archivos de imagen. 897 | 8. Detectaron las líneas de la tabla para crear coordenadas de celdas con la opción =get_pixels=, sobre las que cortar la imagen de la tabla en imágenes de cada celda. 898 | 9. Realiza /OCR/ con /tesseract/, integrado en el /script/ con esta llamada (más adelante se ve el /script/ completo donde se integra esta llamada): 899 | 900 | #+BEGIN_SRC ruby 901 | `tesseract /cell-files/#{j}x#{i}.tif /cell-files/#{j}x#{i}.txt ` 902 | #+END_SRC 903 | 904 | 10. Construye la tabla de datos en modo texto con el texto resultante del paso anterior, también de manera automatizada incorporándolo al /script/: 905 | 906 | #+BEGIN_SRC ruby 907 | ,# abre el archivo que tesseract ha creado y almacena el texto en el array 908 | text_row << File.open("cell-files/#{j}x#{i}.txt", 'r').readlines.map{|line| line.strip}.join(" ") 909 | 910 | end 911 | 912 | \# une el array con los caracteres de tabulación y produce una salida de datos en una línea 913 | output_file.puts( text_row.join("\t")) 914 | 915 | #+END_SRC 916 | 917 | 11. Limpieza de los datos, ya que /Tesseract/ puede equivocarse en caracteres similares, como por ejemplo =0= de cero y =O= de o mayúscula. Por lo que probablemente no podamos dejar de hacer una comprobación manual, si bien en este proceso podemos implicar a más personas, bien a través de las citadas /Crowdcrafting/ o /mTurk/. En este sentido, ProPublica utilizó /mTurk/ y realizó esta [[http://www.propublica.org/article/propublicas-guide-to-mechanical-turk][guía]]. 918 | 919 | 920 | ** PDFTables 921 | Servicio web creado por ScraperWiki, un servicio de /web scraping/, para extraer tablas de PDFs. Requiere crearse un usuario. Puedes descargar los resultados a través del navegador. Advierten que si usas muchos documentos, tendrás que convertirte en usuario de pago. 922 | https://pdftables.com/ 923 | 924 | * OCR 925 | 926 | El reconocimiento óptico de caracteres /OCR/ (por sus siglas en inglés /Optical Character Recognition/) nos permite convertir imágenes que contienen texto en documentos de texto gracias a algoritmos automáticos que realizan ese reconocimiento. 927 | 928 | ** Google Drive 929 | 930 | - Google Drive realiza OCR sobre imágenes individuales en formato /jpg/, /png/ o /gif/ pero también en documentos /PDF/ de una o más páginas 931 | - Google recomienda ciertas pautas para el uso de OCR: 932 | - Los archivos han de tener la más alta resolución, ya que así funcionará mejor OCR. Como medida de ejemplo, recomiendan que cada línea de texto sea de al menos diez píxeles de altura. 933 | - Es importante que estén orientados en horizontal de izquierda a derecha. Si no lo tienes así, utiliza las herramientas citadas anteriormente para resolverlo. 934 | - Los idiomas y conjuntos de caracteres que soporta con seguridad son /Latin/, el soporte de otros es experimental. Puedes elegir el idioma de los documentos en el menú. 935 | - Reconocen mejores resultados en fuentes comunes como /Arial/ o /Times New Roman/. 936 | - La calidad de la imagen también es importante. Las imágenes con mayor contraste funcionan mejor, las que están movidas o borrosas peor. 937 | - El tamaño máximo para las imágenes es de 2 MB por imagen. 938 | - En los documentos /PDF/ solo trabajará con las 10 primeras páginas, por lo que conviene dividir los documentos. 939 | - /Google OCR/ pretende mantener el formato básico del texto, como son las negritas o las itálicas, el tamaño y el tipo de fuente y los saltos de línea, pero reconocen que detectar estos elementos es complicado y no siempre lo consiguen. 940 | - Otros contenidos estructurados como listas numeradas, listados estructurados, tablas, columnas de texto, pies de página y notas finales es probable que no sean reconocidos. 941 | 942 | ** Tesseract-ocr 943 | - [[https://github.com/tesseract-ocr][Tesseract]] se anuncia como las más completa y precisa solución de código abierto disponible para el reconocimiento óptico de caracteres. 944 | - Combinado con la librería de procesamiento de imágenes /Leptonica/, lee varios formatos de imagen y convierte texto de más de sesenta idiomas. 945 | - En 2006 Google retoma el proyecto y lo mejora. 946 | - Está disponible para /Windows/, /Mac OSX/ y /GNU/Linux/ en línea de comandos. 947 | - Cuenta con una licencia /Apache License 2.0/. 948 | 949 | Para utilizarlo en línea de comandos, podemos hacerlo de esta simple manera: 950 | #+BEGIN_SRC sh 951 | tesseract imagen.png out 952 | #+END_SRC 953 | 954 | Lo que producirá un archivo =out.txt= con el texto que ha conseguido reconocer de esa imagen. 955 | 956 | Podemos especificar el idioma con la opción =l= 957 | #+BEGIN_SRC sh 958 | tesseract imagen.png out -l spa 959 | #+END_SRC 960 | 961 | Donde =spa= corresponde a /Spanish/. Otros idiomas pueden ser: 962 | - =ara= para árabe 963 | - =cat= para catalán 964 | - =chi_sim= para chino simplificado 965 | - =chi_tra= para chino tradicional 966 | - =deu= para alemán 967 | - =eng= para inglés 968 | - =fra= para francés 969 | - =glg= para gallego 970 | - =ita= para italiano 971 | - =rus= para ruso. 972 | 973 | El listado completo lo puedes encontrar en https://tesseract-ocr.googlecode.com/svn/trunk/doc/tesseract.1.html#_languages 974 | - Las instrucciones para la instalación están disponibles en https://code.google.com/p/tesseract-ocr/wiki/ReadMe. 975 | - El manual completo con las distintas opciones y argumentos de entrada y salida está disponible en https://tesseract-ocr.googlecode.com/svn/trunk/doc/tesseract.1.html 976 | - Tesseract-ocr, https://code.google.com/p/tesseract-ocr/ 977 | 978 | * Referencias bibliográficas :OK: 979 | 980 | - Aristarain, Manuel & Tigas, Mike & Merril, Jeremy B. (2014) /Scraping PDFs with Tabula/. URL: https://s3.amazonaws.com/media.miketigas.com/files/20140627/20140627-tabula-IRE2014-withnotes.pdf 981 | 982 | - Crucianelli, Sandra. (2013) /Herramientas digitales para periodistas/. Centro Knight para el Periodismo en las Américas de la Universidad de la Universidad de Texas. URL: https://knightcenter.utexas.edu/books/HDPP.pdf 983 | 984 | - García Santiago, Lola. (2003) /Extraer y visualizar información en Internet: el Web Mining/. Gijón: Ediciones Trea 985 | 986 | - Gray, Jonathan & Bounegru, Liliana & Chambers, Lucy. (2012) /Data Journalism Handbook/. European Journalism Centre y Open Knowledge Foundation. URL: http://datajournalismhandbook.org/ 987 | 988 | - Kayser-Brill, Nicolas. (2014) /Data wants to be free! (and clean)/. Medialab-Prado. URL: http://bit.ly/free-clean 989 | 990 | - Méndez Rodriguez, Eva Mª. (2002) /Metadatos y Recuperación de información: estándares, problemas y aplicabilidad en bibliotecas digitales/. Gijón: Trea 991 | 992 | - Nguyen, Dan. (2010) /Chapter 3: Turning PDFs to Text/. Propublica, Journalism in the Public Interest. URL: https://www.propublica.org/nerds/item/turning-pdfs-to-text-doc-dollars-guide 993 | 994 | - Nguyen, Dan. (2010) /Chapter 5: Getting Text Out of an Image-Only PDF/. ProPublica, Journalism in the Public Interest. URL: https://www.propublica.org/nerds/item/image-to-text-ocr-and-imagemagick 995 | 996 | - Schoolofdata, (2014) /Obteniendo datos de los PDF/. Web: School of Data. URL: http://es.schoolofdata.org/obteniendo-datos-de-los-pdfs/ 997 | 998 | 999 | 1000 | 1001 | * Manuales 1002 | - Cómo utilizar /Google OCR/, https://www.youtube.com/watch?v=DPJJON26Do4 1003 | - Introducción al scraping de /PDF/, http://www.irekia.euskadi.eus/es/news/11703-introduccion-google-refine-curso-periodismo-datos 1004 | 1005 | 1006 | 1007 | 1008 | --------------------------------------------------------------------------------