architettura - relazione tra raschietto e orm

0

Considera la seguente struttura di applicazione.

LaclasseraschiettoestraeleinformazioninecessariedaunapaginaevogliosalvarlenelDB.

LaclasseORMèunwrapperattornoa sequelize.js . Stabilisce una connessione al db, carica i modelli, si sincronizza con il db.

app.js si trova nell'ORM, quindi nella classe Scraper.

La mia domanda è: come dovrebbe la classe raschietto scaricare i dati raccolti nel db? Dovrebbe importare l'ORM (la connessione) e disporre di un metodo di svuotamento, che verifica se i dati erano già stati raschiati. Se no, quindi lo salva. Qualcosa mi dice che non dovrebbe essere il lavoro di una classe di raschietto.

    
posta user3568719 10.07.2017 - 14:46
fonte

1 risposta

1

Manca una classe intermedia che collabora tra Scraper e ORM (o Persistence Layer).

Molti stack tecnologici definiscono questo tipo di cosa un "servizio", di cui disprezzo molto, perché non descrive ciò che effettivamente fa.

Ciò di cui hai bisogno è una sorta di "ScraperJob" che è il connubio tra i due livelli dell'applicazione. Sarebbe:

  • Prendi i dati di configurazione necessari per "raschiare" qualcosa
  • Prendi un riferimento alla "classe ORM"
  • Esegui lo scraping
  • Contengono la logica per trasferire i dati dalla classe Scraper alla classe ORM
  • Contiene la logica di transazione per l'ORM, come dire all'ORM quando eseguire un commit al database o al file system

Aggiornamenti dai commenti:

Should the scraper/scraper.js be responsible for this? and scraper/scrapeSiteA.js and scraper/scrapeSiteB.js should make the actual scraping?

Se i siti di scraping non possono essere astratti, avere una classe di raschietto per ogni sito sarebbe l'ideale. In questo caso, la tua idea di nominare i raschietti è corretta. Vorresti che ogni raschietto concreto implementasse la stessa interfaccia (o metodi pubblici, poiché questo è JavaScript). In questo modo puoi gestire ogni sito come un'astrazione utilizzando alcune funzionalità OOP di base:

class Scraper {
    constructor(url, yourOrm) {
        this.url = url;
        this.yourOrm = yourOrm;
    }

    getPageContents() {
        // TODO: Make request, return response body
    }

    scrape() {
        throw new Error("Child classes must override this method");
    }
}

class MovieRatingSiteScraper extends Scraper {
    scrape() {
        // TODO: Write me
    }
}

class DiningGuideSiteScraper extends Scraper {
    scrape() {
        // TODO: Write me
    }
}

E per usarlo:

let yourOrm = // some object that represents your "ORM"
let scraper1 = new DiningGuideSiteScraper(yourOrm, "http://somediningguide.com");
let scraper2 = new MovieRatingSiteScraper(yourOrm, "http://somemoviewebsite.com");

scraper1.scrape();
scraper2.scrape();

Con questo livello di controllo, hai la possibilità di personalizzare ogni raschietto non solo su un intero sito, ma su pagine specifiche su ciascun sito - dandoti un controllo granulometrico molto preciso di questo processo, oltre a qualsiasi gestione specifica degli errori che desideri .

    
risposta data 10.07.2017 - 14:57
fonte

Leggi altre domande sui tag