Funnelweb, quando e perchè usarlo per migrare siti a Plone

Un caso concreto di migrazione di un portale a Plone.

Uno degli ultimi progetti made in Abstract è stato il rifacimento del sito di ISPRA - Istituto Superiore per la Protezione e la Ricerca Ambientale.

Per rifacimento si intende lo sviluppo di un portale in Plone, con una skin nuova progettata ad hoc, e soprattutto la migrazione dei contenuti dal vecchio sito al nuovo.

Dall'analisi delle pagine del vecchio sito è emerso che la maggior parte di esse non erano altro che testi descrittivi con un numero considerevole di collegamenti a file ed immagini (spesso anche verso risorse esterne al sito stesso). Inoltre la gestione dei vecchi contenuti veniva fatta attraverso un CMS che non permetteva una facile estrazione delle informazioni in un qualsivoglia formato strutturato (XML, csv, ecc.).

Appurato ciò, abbiamo concordato con il cliente che:

il modo più semplice per migrare questa enorme mole di pagine e file potesse consistere in crawler web che "sfogliasse" automaticamente il vecchio sito e che ricreasse i contenuti sul nuovo portale preservandone la struttura (sezioni principali, sottosezioni, pagine "foglia").

Soluzione

Per risolvere il problema "migrazione" abbiamo quindi utilizzato FunnelWeb.

FunnelWeb è un webcrawler che estrae i contenuti da un sito, ad esempio titoli, descrizioni, immagini; filtra il contenuto e lo ricrea in un nuovo sito web basato su Plone.

Questo strumento mette a disposizione molte opzioni per la configurazione di come il contenuto deve essere migrato.

FunnelWeb, risulta essere uno strumento prezioso quando si desidera migrare un sito che non utilizza un CMS o se non si ha   accesso diretto alla base dati originale dei contenuti.

Per chi ha un po' di familiarità con collective.transmogrifier: FunnelWeb è una pipeline che mette insieme gli step provenienti da quattro diversi pacchetti (transmogrify.webcrawler, transmogrify.siteanalyser, transmogrify.htmlcontentextractor e transmogrify.ploneremote).

Data la natura "flessibile" di transmogrifier è possibile facilmente configurare i propri step di migrazione oppure definirne di nuovi a seconda delle specifiche esigenze.

Come lavora FunnelWeb?

FunnelWeb sostanzialmente mette insieme le funzionalità dei quattro pacchetti base, quindi:

  1. sfoglia il sito web a partire da un url (che può essere la root piuttosto che l'url di una sezione specifica del sito), eventualmente memorizza le pagine del sito in una cache locale (creando dei file con estensione .html direttamente sul file-system locale) e filtra, secondo delle condizioni configurabili, tutti quei contenuti che non si vogliono migrare nel nuovo sito.
  2. Rimuove o modifica testi "non desiderati" dai contenuti attraverso specifiche regole configurabili, in modo tale da pulire e migliorare la qualità dei nuovi contenuti.
  3. Analizza ed eventualmente modifica la struttura del sito; chi utilizza FunnelWeb ha infatti la possibilità di scegliere il tipo dei nuovi contenuti da creare, cosa nascondere dalla navigazione, modificare le informazioni come titolo, descrizione e testo, associare particolari viste ai nuovi contenuti.
  4. Crea i nuovi contenuti nel nostro sito Plone.

FunnelWeb può essere usato in due modi diversi:

  • direttamente in Plone (utilizzando il framework mr.migrator)
  • da linea di comando (previa installazione con zc.buildout)

Nel nostro caso specifico abbiamo scelto la seconda strada: abbiamo creato un buildout per funnelweb ed abbiamo creato un nostro pacchetto di configurazione per i vari step di migrazione per il vecchio sito ISPRA.

Come dicevamo, abbiamo scelto questa soluzione per la sua flessibilità e la facilità di configurazione dei vari step della pipeline che ci ha permesso di migrare i contenuti e di trasformali come ci servivano senza dover scrivere codice python.

La nostra pipeline funnelweb

[transmogrifier]
include = funnelweb.remote

pipeline =
  crawler
  cache
  ...
  drop
  template1
  template2
  drop
  ...
  normalizeinternallinks
  ...
  ploneupload
  ...

Crawler

Lo step di crawling usa la blueprint transmogrify.webcrawler

e bisogna configurarla con l'url di partenza da cui far partire il crawling delle pagine web:

[crawler]
blueprint = transmogrify.webcrawler
url = http://<some-domain>/<some-optional-path/

Cache

Questo step permette di "memorizzare" le pagine web direttamente sul file-system locale in modo tale da velocizzare una successiva fase di crawling.

[cache]
blueprint = transmogrify.webcrawler.cache
output = var/funnelwebcache/${crawler:url}/

Drop

Con questo step si possono definire delle condizioni per ignorare determinati contenuti (per esempio filtrare per mimetype i file javascript)

[drop]
blueprint = collective.transmogrifier.sections.condition
condition = python:item.get('_mimetype') not in ['application/x-javascript','text/css','text/plain','application/x-java-byte-code']

Template

Con questo step si possono definire delle regole xpath per estrarre informazioni dalle pagine (per esempio i titoli dei contenuti sul nuovo sito).

[template]
blueprint = transmogrify.htmlcontentextractor
title = text //div[@id='contieneCentro']/div[@class='internalContent']/h4
text = html //div[@id='contieneCentro']/div[@class='internalContent']

Questo step può essere ripetuto più volte per gestire eventuali pagine strutturate diversamente.

[template1]
blueprint = transmogrify.htmlcontentextractor
title = text //div[@id='contieneCentro']/h2
description = text //div[@id='contieneCentro']/p[@class='summary']
text = html //div[@id='contieneCentro']/p[@class='content']

Normalizeinternallinks

Durante l'analisi dei contenuti del vecchio sito ci siamo resi conto che molte pagine referenziavano altre pagine mediante dei link.

Ovviamente questi collegamenti riferivano le pagine con i vecchi url e non con gli url dei nuovi contenuti creati in Plone.

Per risolvere questo problema abbiamo creato una nostra blueprint che per ogni item che attraversa la pipeline:

  • fa il parsing del testo (mediante BeautifulSoup) estrendo i tag link (<a href="...">...</a>)
  • per ogni link controlla se è un riferimento interno
  • se è un link interno effettua la normalizzazione rendendolo plonish:
from transmogrify.siteanalyser.external.normalize import urlnormalizer
...
url_normalized = urlnormalizer.normalize(url)

 

  • ricompone il testo con i link normalizzati.
  • trasmette l'item col testo così modificato al prossimo step delle pipeline.

 

Conclusioni

Alla fine della fase di migrazione dei vecchi contenuti nel nuovo sito abbiamo effettuato un pò di valutazioni statistiche sui risultati ottenuti per dare un voto alla soluzione adottata.

Prendendo in considerazione le pagine/file del vecchio sito rispetto a quelle ricreate nel nuovo portale Plone, di seguito i risultati:

1. Il vecchio sito è risultato essere per il 90% "migrabile" via FunnelWeb. L'altro 10% era rappresentato da sezioni contenenti dati strutturati (elenco delle scuole accreditate EMAS/Ecolabel, elenco delle organizzazioni registrate, elenco dei prodotti/servizi certificati Ecolabel, ecc.); per queste sezioni abbiamo adottato una soluzione sempre "transmogrifier-based" cioè una pipeline che leggesse da un file csv i dati dei vari item e generasse i rispettivi oggetti (archetype custom definiti ad-hoc) in Plone.

Così facendo abbiamo coperto il 100% di contenuti migrati nel nuovo portale.

2. solo un 5-10% delle pagine migrate con Funnelweb hanno necessitato di correzioni manuali post migrazione.

3. L'intera struttura del vecchio sito (sezioni, pagine home delle sezioni, pagine singole) è stata riportata nel nuovo portale.

4. Il cliente è rimasto complessivamente soddisfatto del lavoro effettuato e del risultato ottenuto.

Share this on

Share |

On same topics

Commenti

comments powered by Disqus