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 .