Ho scritto un webscraper in Python che cattura i dati da ~ 10 diversi siti web (hanno confermato che questo è ok). La maggior parte dei siti web è un po 'diversa, ma l'idea generale di ottenere dati da ciascuno è la stessa:
- Carica l'URL del sito
- Premi ovunque i pulsanti da 0 a 3 (a seconda del sito).
- Inserisci una frase di ricerca specifica del sito.
- Acquisisci dati da qualsiasi risultato che contenga ancora un'altra frase specifica per il sito.
- Registra i dati in un file, specifico per il sito.
Ovviamente, la maggior parte di questo può essere sottratta, ma i passaggi 3 e 4 sono troppo diversi tra i siti per astrarre l'intero processo. Quindi c'è un raschietto astratto, esteso da un raschietto specifico per ogni sito che gestisce i passaggi 3 e 4.
Il mio problema è che ci sono molte informazioni specifiche del sito per tenerne traccia. Potrei inserire ogni configurazione specifica del sito nella sua classe, ma mi piacerebbe conservare tutto in un unico posto in modo da poter apportare modifiche di massa (scavando attraverso 10 classi per rendere lo stesso cambiamento terribile).
Quello che ho fatto è stato creare una classe che ho chiamato "ScraperData", che assomiglia a questo:
class ScraperData:
scrapers = {
"Website1": Website1Scraper(),
"Website2": Website2Scraper(),
...
}
URLs = {
"Website1": "www.website1.com",
"Website2": "www.website2.com",
...
}
buttonsToPress = {
"Website1": None,
"Website2": ["Button1", "Button2"],
...
}
....
So che potrei ottenere qualcosa di un po 'meno prolisso ristrutturando questo (potrei avere una classe di configurazione e inizializzarne una per ciascun sito qui), ma mi piace che questo approccio sia simile a tutti i dati.
Ho anche un file di configurazione che ha una riga:
Website1, Website2, Website5, ...
Dove scelgo i siti da cui ottenere i dati (non sempre vogliamo fare tutti e 10).
Infine, c'è una classe principale che carica i siti web dalla config in un array, sitesToScrape
, e fa approssimativamente il seguente:
data = ScraperData()
for site in sitesToScrape:
scraper = data.scrapers[site]
scraper.load(data.URLs[site], data.buttonsToPress[site])
scrapedData = scraper.scrape(data.searchStrings[site])
self.write(site, data.files[site], scrapedData)
Ogni mattina scelgo solo i siti per prelevare i dati, avvia tutto, quindi lascialo in pace per alcune ore.
Per come la vedo io, questo rende molto facile collegare nuovi siti, eliminare quelli vecchi o modificare la configurazione di uno o più siti. Tuttavia, l'intero progetto sembra stranamente suddiviso in compartimenti, ma mi sembra che ogni compartimento abbia uno scopo specifico.
La mia domanda è: è un approccio facilmente manutenibile a questo problema? Le prestazioni non sono affatto un fattore.