Modellista raschietto web

0

Sto lavorando su una piccola applicazione che dovrebbe analizzare / analizzare un sito Web e mi chiedo quale sarebbe il modo migliore per ottenere ciò (tenendo DRY / SOLID in mente).

Ecco alcuni pseudocodici:

class ScraperScheduler
  def perform
    SraperWorker.perform_async(ParserTypeOne.new)
    SraperWorker.perform_async(ParserTypeTwo.new)
    SraperWorker.perform_async(ParserTypeThree.new)
    SraperWorker.perform_async(ParserTypeFour.new)
  end
end

class ScraperWorker
  def initialize(scraper)
    @scraper = scraper
  end

  def perform
    html = RestClient.get(@scraper.url)
    @scraper.perform_async(html)
  end
end

class ParserTypeOne 
  def perform(html)
    #parse page with nokogiri
    page = Nokogiri::HTML(html)

    parserd_objects.each do |o|
      PersistToDB.perform(o)
    end
  end
end

class PersistToDB
  def perform(o)
    # split o into several ActiveRecord objects
    # check if unique and save to db
  end
end

La classe ScraperScheduler è fondamentalmente solo un cronjob che verrà chiamato con sidekiq-scheduler una volta al giorno . I metodi di esecuzione ci sono, quindi posso sostanzialmente fare i lavori di sidkiq al di fuori di tutto, ma non penso che questo sia necessario per ognuna di queste classi. Alcune domande / dubbi che ho:

  1. ScraperWorker fondamentalmente esegue solo la richiesta HTTP. Nel mio esempio, tuttavia, conosce le proprietà url e perform_async del parser. Un modo per farlo in un modo più "sciolto"?
  2. Il lavoro ParserTypeOne dovrebbe semplicemente estrarre i dati dall'HTML con nokogiri. È troppo strettamente collegato a PersistToDB? Come posso chiamare PersistToDB in modo diverso?
  3. Qualche altro suggerimento?

So che questo funzionerebbe correttamente. Mi interesso solo di alcune idee su come migliorarlo. Suggerimenti?

    
posta capbugs 01.05.2018 - 17:34
fonte

1 risposta

-1

ad1 Considera di spostare la chiamata http get da ScrapperWorker a Parser, quindi l'URL sarà noto solo a Parser.

ad2 Puoi nascondere PersistToDB dietro qualche interfaccia e poi iniettare questa dipendenza dal costruttore della classe.

ad3 Nella classe ScrapperScheduler puoi spostare la configurazione dei tipi in un file di configurazione esterno come XML, che con alcune modifiche nella configurazione non è necessario ricompilare l'applicazione.

    
risposta data 01.05.2018 - 22:12
fonte

Leggi altre domande sui tag