Arxiu de la categoria: Tallers

Resum del 2n taller – segon exemple

benvolguts / benvolgudes,

continuant amb l’anterior exemple, i seguint amb Python, intentarem explicar en unes línies com vàrem usar scrapy per descarregar una part dels continguts d’una web, concretament la de la Carta Arqueològica de Barcelona (CAB), que va donar permís per bolcar tots els seus continguts a la Viquipèdia, resultat que podeu veure aquí. L’explicació a continuació suposa que scrapy ja s’ha instal·lat correctament i que s’ha creat un nou projecte (en aquest cas anomenat CABcn) mitjançant la comanda:

scrapy startproject CABcn

Scraping d’una web

Resoldre aquest problema consta de dues parts. La primera consisteix en observar si la web té una certa estructura interna pel que fa als continguts que volem xuclar i si les URLs que usa també segueixen una certa lògica. Actualment, com la majoria de webs no les fan humans directament sino que s’utilitzen gestors de continguts (CMS), és molt fàcil que així sigui i que, igual que es va automatitzar la creació i manteniment de la web, es pugui automatitzar la seva “xuclada”, o web scraping en anglès. La segona part consisteix en programar un bot que vagi passejant-se per aquesta estructura i descarregant els continguts desitjats.

En el cas concret de la web de la CAB, podem observar fàcilment que si fem una cerca des d’aquesta adreça:

http://cartaarqueologica.bcn.cat/Search

ens apareix una primera pàgina amb enllaços a les intervencions (pàgines web) a les quals volem accedir, així com un menú d’accessos directes a altres grups de pàgines; si cliquem al 2, per exemple, veurem que la URL és:

http://cartaarqueologica.bcn.cat/Search?page=2

és a dir, podem accedir a cada pàgina amb intervencions canviant el 2 per un número entre 1 i 20 (tot i que en la web només apareix fins el 19).

Un cop dintre d’una intervenció, p.e. la primera, veiem que la seva URL és:

http://cartaarqueologica.bcn.cat/695

i que aquí dintre tenim diferents continguts amagats en menús: “Situació geogràfica”, “Descripció i notes històriques”, etc. Fent click a la situació geogràfica podem trobar, per exemple, les coordenades UTM, el que ens pot ser útil per situar aquesta intervenció en un mapa, per exemple.

És ara on hem de fer el truc de veure l’estructura interna d’aquesta pàgina. En funció de si useu Windows, Mac o Linux i del vostre navegador, haurieu de buscar una opció amb un nom semblant a “Inspeccionar elemento”, que obre una finestra en la part inferior del navegador com aquesta:

Inspeccionar elemento

Doncs bé, amb una mica de traça, mirant (obrint) els “<div>” podem arribar a trobar on estan les coordenades UTM dintre de la pàgina web, tal i com es mostra a continuació:

Coordenades UTM

I aleshores, amb el botó dret, cal fer l’opció “Copiar XPath”, del qual en parlarem tot seguit. El resultat d’aquesta còpia és:

//*[@id="dummybodyid"]/div[5]/div[1]/div[1]/dl[3]/dd

Això indica la posició relativa d’aquest element dintre de la pàgina web, seguint l’estàndard definit per XPath. Aquesta informació és la que usarem pel nostre xuclador, ja que, probablement, en cada pàgina de cada intervenció, l’element dd del tercer element dl de la primera div de la primera div de la cinquena div contindrà les coordenades UTM. Això ho hauriem de fer per cadascun dels elements que volem xuclar de la pàgina, p.e. la seva descripció o la bibliografia.

Aleshores el que farem és programar els bots, en aquest cas són dos scripts fets en bash que usen scrapy. El primer script, anomenat getCABcn1.sh, s’encarrega d’extraure totes les intervencions fent canviar el valor de la pàgina en la qual estem buscant:

#
rm -f CABcn_URLs.dat
for p in {1..20}
do
  echo $p
  scrapy runspider ./CABcn/spiders/CABcn_URLs.py -a pag=$p 
  cat CABcn_URLs.temp >> CABcn_URLs.dat
done

Bàsicament, aquest script genera un fitxer CABcn_URLs.dat que conté totes les URLs de les intervencions a xuclar.  La feina bruta la fa el primer dels dos “spiders” programats usant scrapy, anomenat CABcn_URLs.py, que bàsicament reb el número de pàgina de cerca a descarregar i per aquella pàgina es queda amb tots el enllaços (@ref) de la pàgina.

Un cop hem xuclat totes les URLs de totes les intervencions, un segon script anomenat getCABcn2.sh va cridant al segon spider anomenat CABcn_spider.py per cada intervenció:

#
rm -f CABcn.csv
for p in `cat CABcn_URLs.dat` ; 
do
 echo $p
 scrapy runspider ./CABcn/spiders/CABcn_spider.py -a site=$p 
 cat CABcn_$p >> CABcn.csv
done

Això genera un fitxer .csv amb les dades desitjades. El secret del segon spider és que usa l’estructura que abans hem esbrinat mitjançant la inspecció de la pàgina web. Així per exemple, per obtenir les coordenades UTM el spider fa el següent:

#
# COORDENADES UTM
#

coords =     sel.xpath('//div[5]/div[1]/div[1]/dl[3]/dd[1]/text()').extract()[0]

pc = coords.find("|")
out.write(coords[7:pc-1]+";")
pc2=pc+9;
while ((coords[pc2]!=' ') and 
      (coords[pc2]!='\n')) :
  pc2=pc2+1
out.write(coords[pc+9:pc2-1]+";")

Observeu que la feina la fa la funció sel.xpath() proporcionada per scrapy, la qual més o menys va a buscar les coordenades al mateix lloc (amb el detall d’especificar dd[1]), usant la funció text() per quedar-se amb el text (i no les URLs o altres coses que hi podessin haver a l’HTML) i la funció extract() per obtenir-lo. El resultat és un array del qual ens quedem el primer (en aquest cas únic) element, que té la informació que busquem. La resta de codi, de forma una mica barroera es dedica a trencar el text de la pàgina web amb les coordenades UTM en dos numerets sense espais ni cap altre text, els quals imprimeix separats per “;”.

Bé, és més fàcil fer-ho que explicar-ho! Scrapy permet centrar-se en el que es vol obtenir, sent necessari només conèixer l’estructura de la web que, tal i com hem vist, es pot obtenir de forma senzilla amb XPath.

Apa, aviam si algú s’anima a provar-ho i ens comenta els seus problemes, idees, solucions, etc.

Salutacions,

Julià

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