Captura de dades mitjançant web scraping

benvolguts / benvolgudes,

hem vist que, idealment, hem de poder accedir a les dades mitjançant un fitxer tipus CSV o XML, o bé mitjançant una API que ens retorni la informació desitjada a partir d’uns paràmetres de cerca.

De vegades no sempre és possible fer-ho, però, ja que la informació només es publica a la web en formats pensats pels humans, incloent-hi la navegació per les diferents pàgines web que la composen, i no està pensada per poder automatitzar el procés i descarregar tota la informació desitjada amb un sol click. Un exemple és la pàgina web d’IDESCAT, repleta d’informació molt interessant però que, malauradament, no sempre podem descarregar.

La tècnica coneguda com web scraping està pensada per a extreure informació de webs de forma automàtica o semi-automàtica. Al cap i a la fi, si nosaltres com a humans podem recórrer una web i anar descarregant allò que ens interessa, perquè no podem programar una petita aplicació o script que ho faci per nosaltres? La idea de web scrapping és veure si la informació publicada a la web té una certa estructura per aprofitar-la i automatitzar les descàrregues.

En el debat anterior ja s’han esmentat algunes eines com ara Scrapy que permeten automatitzar aquest procés a partir del coneixement de l’estructura interna d’una pàgina HTML: si aquesta està ben dissenyada i les dades segueixen un cert ordre, és possible inspeccionar (amb el propi navegador, p.e. amb Chrome és l’opció “Inspeccionar Elemento”) on es situa dins del document HTML cada element de la pàgina i aprofitar aquesta informació per extraure tots els elements d’una taula, per exemple. Un altre opció més casolana que mostrarem a continuació consisteix a intentar reproduir els passos que faríem com a persones navegant per una pàgina web.

Hem preparat un petit vídeo que mostra com jugar amb les URLs de la web d’IDESCAT per a descarregar totes les dades sobre els noms dels nadons que neixen a Catalunya d’un sol cop un conjunt molt interessant i d’especial utilitat per als futurs pares. Realment el vídeo mostra quins són els paràmetres que utilitza la pròpia web per accedir a la informació quan l’usuari navega per les pàgines web i canvia els valors que se li ofereixen mitjançant els diferents mecanismes de navegació (botons, desplegables, enllaços, etc.). Aleshores, si descobrim aquests paràmetres seria possible programar un petit script que capturi totes aquestes pàgines web i les processi, quedant-se només amb la informació desitjada. El vídeo només mostra com accedir a cadascuna de les pàgines de la web d’IDESCAT canviant uns certs paràmetres, però el procés complet de web scrapping seria el següent:

  1. Esbrinar l’estructura i paràmetres de les pàgines web que contenen la informació desitjada.
  2. Programar uns petits scripts que capturin totes les pàgines web en format HTML. Això és el que es coneix habitualment com a “bot” (qui la tradueix al català?).
  3. Fer un altre script que sigui capaç de processar les pàgines web descarregades i extraure la informació desitjada, generant un fitxer CSV o similar.

Els punts (2.) i (3.) exigeixen ja un cert nivell de programació i queden fora de l’abast del curs però de totes formes, si teniu cap comentari o dubtes al respecte no dubteu a fer-lo!

Us proposo el següent:

1) Visualitzeu el vídeo i jugueu vosaltres mateixos amb les URLs d’IDESCAT amb el mateix conjunt (els noms dels nadons nascuts a Catalunya) o bé d’altres, descobrint quins són els paràmetres de cerca i els valors que poden agafar.

2) Penseu que és un procediment “legal”? Al cap i a la fi tota la informació està publicada a Internet, no? Quin problema hi ha en programar un bot per a recórrer una web total o parcialment? Podem perjudicar (en diferents sentits) al propietari de la web?

3) Sense ànim de polemitzar amb IDESCAT 🙂 Quines raons poden tenir per no publicar la informació en un sol fitxer i/o oferir una API per accedir-hi? Potser hi ha alguna raó que tingui relació amb el punt (2)?

Vinga, espero els vostres comentaris al respecte!

Salutacions

Julià

VN:F [1.9.22_1171]
Rating: 7.5/10 (2 votes cast)
Captura de dades mitjançant web scraping, 7.5 out of 10 based on 2 ratings

27 pensaments a “Captura de dades mitjançant web scraping”

  1. Parlem de legal-llei o legal-ètic? desconec si existeix regulació sobre l’scraping, però a nivell ètic potser sí que no és tan legal. Si provoquem un gran número de peticions pesades podem fer caure el servidor (més o menys, serà el que es fa quan s’ataca a google, CIA o d’altres webs massivament per hackers/trolls, suposo).
    Sobre una possible API a IDESCAT, trobo que és una web amb gran densitat d’informació i s’ha de saber molt bé el que es busca, suposo que no la tenen per a evitar grans peticions, però també podrien tenir una basada en certs paràmetres excloents entre ells, per a evitar-ho, no? (de fet, al món informàtic, tot es pot fer).

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
  2. Hola,

    Penso que legal obtenir les dades ho és, entre altres coses perquè es publiquen amb llicència Creative Commons Reconeixement, tal com indica el web. Si aquesta obtenció no es fa bé però, pot causar problemes al servidor que potser podrien comportar problemes legals en cas de ser interpretats com un atac i ser denunciats (?).

    Suposo que si no es publiquen totes les dades i no es proporciona una API és per temes d’espai, d’ample de banda, de rendiment,… Potser quan una administració publica dades obertes hauria de destinar una infraestructura per fer-ho, dimensionada per aguantar la concurrència de consultes.

    VA:F [1.9.22_1171]
    Rating: 3.0/5 (1 vote cast)
  3. Voldria comentar un altre exemple de web scraping. Conec un amic que té una botiga electrònica i vol carregar els productes de forma automatitzada, almenys tant com pugui. Podem parlar de centenars, potser d’un miler de productes, de diversos fabricants, amb informació del nom, de la descripció, imatges associades (de diverses mides), etc.

    Els fabricants per norma general no li proporcionen aquestes dades de forma electrònica. Com a molt li passen un full de càlcul amb informació dels productes però, sense les imatges ni altres dades que no vénen al cas.

    Per no haver d’introduir manualment els productes a la botiga es genera fitxers CSV utilitzant Mozenda. Fa scraping del web dels fabricants i obté totes les dades dels productes, inclosa la URL de les seves imatges. Aquests CSV els carrega després a la botiga electrònica -no sense problemes- i s’estalvia molta feina.

    Tot i que està venent productes d’aquests fabricants està descarregant-se informació, concretament imatges (quan s’importen a la botiga) de les quals a priori no té dret d’ús. Filant prim, legalment no ho està fent bé, tot i que tot plegat està orientat a que el fabricant guanyi diners.

    VA:F [1.9.22_1171]
    Rating: 5.0/5 (2 votes cast)
  4. Creo que es legal y ético descargar estos datos, aunque estoy de acuerdo con javiguar que no deberían hacerse peticiones que puedan hacer caer el servidor de la web.

    En cuanto al porqué no ofrecen la totalidad de los datos tengo una duda. Cobra el IDESCAT por peticiones de datos a medida?.

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
  5. Hola, bona nit,

    Trobo especialment interessant aquest aspecte perquè avui en dia disposem d’eines molt potents per extreure dades de la informació publicada en format web. En aquest sentit permeteu-me recomanar-vos (si voleu fer alguna prova) un software lliure anomenat R que disposa d’eines molt potents en aquest sentit. Us passo un enllaç per si algú té interès en aquesta opció:

    http://www.programmingr.com/content/webscraping-using-readlines-and-rcurl/

    Salutacions,
    Ernest

    VA:F [1.9.22_1171]
    Rating: 5.0/5 (1 vote cast)
  6. Els continguts d’aquesta setmana són d’aquells amb els que et fiques les mans al cap: a l’adonar-te de totes les coses que desconeixes, i al veure totes les possibilitats que hi ha.

    Tornant al tema, penso que, com s’ha esmentat, és més aviat un tema de logística, i de recursos. S’hauria de processar aquesta informació, i per això, es necessita personal i recursos, amb la qual cosa, imagino que el motiu pel qual no es facilita aquesta informació, és per aquests motius.
    Ara bé, com veiem, amb una bona planificació, no seria tant costós. Podrien fer-se scrapping ells mateixos, donat l’estructura de la seva web, i oferir aquesta informació!

    VA:F [1.9.22_1171]
    Rating: 4.5/5 (2 votes cast)
    1. hola, Sergi

      bé, sabem del cert que IDESCAT està treballant en una API i que segurament aquest exemple no el podrem tornar a posar, però crec que i·lustra bé el problema

      en aquest cas, ningú pot dir que IDESCAT no publica dades en obert, el tema és si ho fa més pensant en tercers i, concretament, quin tipus de tercers: públic en general? desenvolupadors? aplicacions?

      salutacions

      Julià

      VN:F [1.9.22_1171]
      Rating: 5.0/5 (1 vote cast)
      1. És clar! La problemàtica és com enfocar-ho, ja que si es vol satisfer a tots els tipus de públics, pot ser molt i molt costós, però segur que amb el temps, a part de l’API, aniran oferint més serveis!

        VA:F [1.9.22_1171]
        Rating: 0.0/5 (0 votes cast)
    2. Totalment d’acord amb en Sergi que el tema de l’IDESCAT és simplement un aspecte de logística i que segurament aviat aniran oferint més formats, dades i en definitiva facilitats per al tractament de les dades obertes. És comprensible que l’Institut d’Estadística vulgui millorar els continguts i serveis que ofereixen, una tendència a la inversa no tindria sentit.

      Ni cal dir que comparteixo també l’opinió que Déu-ni-do si s’estan ampliant i mostrant eines al curs, jo desconeixia l’escraping i m’ho estic mirant amb interès perquè podria servir-me a la meva feina del dia a dia. Conèixer eines et possibilita oportunitats d’aplicació, sens dubte.

      VA:F [1.9.22_1171]
      Rating: 4.0/5 (1 vote cast)
  7. Companys, deixeu-me ser una mica radical en el plantejament del web-scraping contra els servidors d’IDESCAT

    1.- Dades d’un organisme públic?
    Si no van contra el dret a l’intimitat de les persones, han de ser del tot obertes i legals de 5R’s.

    2.- Programar un bot “a sac”, encara que el fem malament perquè no sabem programar i rebenten els servidors d’IDESCAT?
    Endavant amb els bots. No es raonable que una administració pública no posi a disposició les dades públiques en un nivell de tres estrelles mínim.
    No ens podem permetre un serveis en línia d’una administració pública tècnicament febles i sense estar preparats per la interacció amb tot tipus d’administrats. L’administració ha de tenir un paper tractor de l’indústria de les TIC que aconsegueixi solucions dels seus proveïdors de les que se n’aprofiti el sector privat, millorant els serveis d’e-commerce i, per què no, l’obertura de dades del propi sector privat.

    3.- IDESCAT no publica la informació en un sol fitxer ni ofereix una API per accedir-hi?
    Respon a retallades pressupostàries? La manca de recursos que no els permeten duplicar capacitats per deixar una rèplica de públic accés? Doncs bots a sac i el que convingui (i a mirar d’ensorrar el sistema :-)).
    L’experiència demostra que els recursos es troben i els pedaços desapareixen quan els problemes arriben a magnituds desbordants. L’opció (esperar que algun dia es faci) ens pot arribar competitivament massa tard.

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    1. hola, Jaume

      i a l’inrevés? què hauria de fer IDESCAT per poder disposar d’una API que satisfaci els requeriments dels desenvolupadors? podria demanar ajuda d’alguna manera?

      durant la jornada de presentació de la Big Data Week ja va haver-hi un debat interessant al respecte; els objectius d’IDESCAT són, com els de tots els instituts nacionals d’estadística, “sentar càtedra” amb les dades, publicar dades de qualitat, validades, etc. Això no va en contra de publicar una API, però la guerra d’IDESCAT és una altra, per fer un paral·lelisme amb els repositoris institucionals, IDESCAT està més preocupat en “preservar” que en “disseminar”, i això poc a poc hauria d’anar canviant tot i que el seu ritme pot ser molt diferent al dels seus potencials usuaris finals

      salutacions

      Julià

      VN:F [1.9.22_1171]
      Rating: 0.0/5 (0 votes cast)
      1. Julià,

        Què tal un exercici d’aquest curs (o de futures edicions) on tots els participants ens impliquéssim? Què et semblaria canviar el recull de noticies dels nostres amics per un cas real orientat a la millora d’un servei públic?

        Ferm crowdsourcing entre l’interès de l’aprenentatge, les necessitats dels organismes públics condicionades per l’entorn econòmic, el coneixement col.lectiu, ….. amb la vista posada en aprendre treballant.

        L’entitat pública hi guanya: disposaria d’una guia per obrir dades elaborada des del raonament extern “no contaminat” amb les barreres mentals de l’entitat.
        Els organitzadors hi guanyeu: hauríeu fet un mooc de valor afegit per la societat i amb resultats tangibles.
        L’alumnat hi guanyem: en lloc de “badges”, una referència d’haver treballat en l’obertura de dades d’una entitat ens atorga un plus que pot esperonar la nostra activitat futura en aquest camp.

        VA:F [1.9.22_1171]
        Rating: 0.0/5 (0 votes cast)
        1. benvolgut Jaume,

          aquest és un dels objectius del curs, donar una empenteta a gent que té neguits similars i que en aquest espai es puguin conèixer i iniciar projectes interessants; no puc dir-te res més que moltes gràcies!

          ara en els tallers tindrem quatre tardes per pensar al respecte i començar a treballar en alguns projectes que considerem interessants, per als que hi esteu interessats

          en parlem ben aviat!

          Julià

          VN:F [1.9.22_1171]
          Rating: 0.0/5 (0 votes cast)
      2. I sobre el tema IDESCAT (més preocupat en “preservar” que en “disseminar”), no el conec prou per opinar. Però gosaré a fer una aportació.

        Em crec, des de la presentació del pla iDigital en la passada legislatura, que l’administració de la Generalitat de Catalunya està focalitzada a potenciar l’economia digital de Catalunya a través de la seva acció de govern. Tinc el convenciment, pels tímids exemples que podem veure, que una de les línies és estimular l’obertura de les dades de l’Administració. I l’IDESCAT, com a part de l’administració catalana, més tard o mes d’hora ho acabarà fent.

        Què el frena? Només puc pensar en motius econòmics i en motius polítics.

        Pel que fa als motius econòmics, la idea que he apuntat sobre el curs, pot donar una pista sobre com aprofitar sinèrgies amb altres actuacions. Cal però, el convenciment dels dirigents de l’IDESCAT per prioritzar-ho i agafar el compromís dins el pla d’acció de l’organisme.

        Ara bé, els motius polítics són figues d’una altre paner. Si realment hi ha una aposta institucional, ja hauria d’estar prioritzat, i podríem estar discutint la incapacitat econòmica per dur-ho a terme. Però, en l’escenari actual de “xoc de trens”, hom pot pensar que hi ha orientacions polítiques per a “preservar informació” i això frena la voluntat tècnica de l’IDESCAT. I tinc la impressió que estem enrocats en aquest punt. No tant perquè no es faci, si no perquè es faci poc a poc i començant per la informació menys sensible.

        I si no es així, que vingui algú de l’IDESCAT i m’ho expliqui 😉

        VA:F [1.9.22_1171]
        Rating: 0.0/5 (0 votes cast)
  8. Hola,

    No sé si es veurà bé però, us poso un exemple de com es podrien capturar els resultats de la pàgina de l’IDESCAT utilitzant XPath i els objectes del document DOM de la pàgina per processar els resultats. L’exemple genera un CSV de tots els nadons de Catalunya del 2012 (any per defecte), iterant de 25 en 25. Es genera un CSV però, seria senzill generar un XML. I si es generés un XML, utilitzant XSLT es podria transformar la sortida de la nostra eina de consulta en qualsevol altra cosa (RSS, PDF,…).

    Salut,

    Manel


    loadHTML($aTxt);
    $aQuery = "//table/tbody[not(@class='Extensio')]/tr";
    $aDomXpath = new DomXpath($aDom);
    $aNodes = $aDomXpath->query($aQuery);
    for ($i=0;$ilength;$i++) {
    $aNode = $aNodes->item($i);
    $aChildren = $aNode->childNodes;
    $aLine = $aChildren->item(0)->nodeValue;
    $aTds = $aNode->getElementsByTagName("td");
    $aLine .= "|".$aTds->item(0)->textContent;
    $aLine .= "|".$aTds->item(1)->textContent;
    $aLine .= "|".$aTds->item(2)->textContent;
    $aLine .= "|".$aTds->item(3)->textContent."\n";
    $aCSV .= $aLine;
    }
    $aPos += $aInc;
    } while ($aNodes->length > 0);
    header("Content-type: text/csv");
    header("Content-Disposition: attachment; filename=nadons.csv");
    header("Pragma: no-cache");
    header("Expires: 0");
    echo($aCSV);
    ?>

    VA:F [1.9.22_1171]
    Rating: 1.0/5 (1 vote cast)
  9. Perdoneu però, no es veu bé. No tinc vista prèvia.


    libxml_use_internal_errors(true);
    $aBase = "http://www.idescat.cat/nadons/?var=1&ord=0&posicio=";
    $aInc = 25;
    $aPos = 0;
    $aCSV = "";
    do {
    $aTxt = file_get_contents($aBase.$aPos);
    $aDom = new DOMDocument();
    $aDom->loadHTML($aTxt);
    $aQuery = "//table/tbody[not(@class='Extensio')]/tr";
    $aDomXpath = new DomXpath($aDom);
    $aNodes = $aDomXpath->query($aQuery);
    for ($i=0;$ilength;$i++) {
    $aNode = $aNodes->item($i);
    $aChildren = $aNode->childNodes;
    $aLine = $aChildren->item(0)->nodeValue;
    $aTds = $aNode->getElementsByTagName("td");
    $aLine .= "|".$aTds->item(0)->textContent;
    $aLine .= "|".$aTds->item(1)->textContent;
    $aLine .= "|".$aTds->item(2)->textContent;
    $aLine .= "|".$aTds->item(3)->textContent."\n";
    $aCSV .= $aLine;
    }
    $aPos += $aInc;
    } while ($aNodes->length > 0);
    header("Content-type: text/csv");
    header("Content-Disposition: attachment; filename=nadons.csv");
    header("Pragma: no-cache");
    header("Expires: 0");
    echo($aCSV);

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    1. gràcies, Manel!

      si me l’envies per correu el penjo com a exemple jo per a que la gent se’l pugui baixar

      Julià

      VN:F [1.9.22_1171]
      Rating: 0.0/5 (0 votes cast)
  10. Hola,

    coincideixo amb el que heu dit sobre la legalitat de l’scraping; com ha dit el Manel, el web posa que tenen llicència CC BY, i si vulguessin restringir la venda o ús de les dades, haurien d’haver posat altres clàusules, cosa que no han fet.

    L’única raó que se m’acut per no mostrar tots els resultats de cop a la pàgina, em sembla que ho pot justificar un tema de temps de càrrega o espera a la web, o d’usabilitat. Però si la gent programem bots i això satura els servidors, pot ser pitjor.

    Així com que IDESCAT no permet assolir les 5Rs per algú sense coneixements per programar els ‘bots’, crec que més aviat caldria revisar què hi diu la Llei de la transparència al respecte, i la institució està complint amb la legalitat d’oferir totes les dades obertes…; atès que prioritza preservar-les, en lloc de la seva disseminació, i l’usuari del públic general pot quedar insatisfet amb el resultat.

    Desconec com poden afectar la programació de bots al servidors, però crec que, per evitar-ho i facilitar l’accés, probablement IDESCAT hauria de demanar ajut a desenvolupadors i/o gestors d’informació per poder disposar d’una API que permeti acomplir els requeriments.

    Bé, espero haver contestat més o menys, al que demanàveu 🙂

    Fins aviat!

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
  11. Un matís, però, per al públic general que cerqui un nom de nen o nena, sí que ho pot fer a partir del formulari de cerca simple… És clar que aquest formulari no permet treure els llistats complets, ni fer altres tipus de cerca, com podria ser a través d’un cercador avançat o una API; però IDESCAT, pot justificar d’aquesta forma que s’adreça al públic general, sense coneixements…

    Tanmateix, les raons de càrrega de llistats que he esmentat, no haurien de privar de donar una opció més ràpida i còmode per obtenir altres fragments o els llistats sencers.

    Fins aviat!

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
  12. Hola,

    Un exemple de web scraping que legalment no es pot fer. El web del Col·legi Oficial de Farmacèutics de Tarragona ofereix la informació de les farmàcies de guàrdia. Però, no ofereix un canal RSS, per exemple, per conèixer quines són les farmàcies de guàrdia. No cal dir que no ofereix una API per consultar aquesta informació. Si vols saber quina és la farmàcia de guàrdia has de fer una cerca per comarca, poble i dia, i obtens una pàgina amb les dades desitjades.

    Seria senzill tractar les pàgines del web per automatitzar la consulta i, per exemple, crear una aplicació mòbil que et digui quines són les farmàcies de guàrdia de la teva població, de forma àgil. Però, les condicions d’ús del web ho impedeixen, tots els drets són reservats.

    Salutacions,

    Manel

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    1. Manel,

      Sortosament el Col·legi Oficial de Farmacèutics de Tarragona ofereix una aplicació (FarmaGo) gratuïta per descarregar un mòbils Android i Apple, a banda de la pàgina de info que has esmentat tu.

      Com que conec gent del COFT, els suggeriré l’obertura d’aquestes dades i/o la publicació d’alguna API.

      Però fixa’t que això ens porta a una interessant discussió sobre com podríem fomentar la publicació de dades obertes (de 5R i amb 5 estrelles, si pot ser) d’aquelles organitzacions (públiques i privades) que recopilen les nostres dades personals i les dades d’utilitat per a la nostra societat. I també sobre com podem argumentar a tercers que el fer-ho genera més beneficis que perjudicis (perquè , es així, ¿oi?).

      VA:F [1.9.22_1171]
      Rating: 0.0/5 (0 votes cast)
  13. Els més entesos podríeu recomanar-nos algun web-tutorial-etc. per començar a introduir-nos en la creació d’scripts els que no en tenim ni idea?

    gràcies!

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    1. hola, Núria

      si saps programar una mica (en Python), ves directament a Scrapy, és el més complet

      no hi ha una resposta única, cada problema té segurament una eina per resoldre’l

      salutacions

      Julià

      VN:F [1.9.22_1171]
      Rating: 4.0/5 (1 vote cast)
  14. Haurem de fer bastanta memòria 😉
    Gràcies Julià, prenc nota.

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *