L'esecuzione di Colly web scraper, periodicamente, utilizzando cron in Go

0

Domanda

Stavo facendo un po ' di web scraping utilizzando colly, ma ha voluto eseguire periodicamente tramite cron. Ho fatto provare un approccio di base per farlo.

type scraper struct {
    coll *colly.Collector
    rc   *redis.Client
}

func newScraper(c *colly.Collector, rc *redis.Client) scraper {
    return scraper{coll: c, rc: rc}
}

func main() {
    rc := redis.NewClient(&redis.Options{
        Addr:     "localhost:3000",
        Password: "", // no password set
        DB:       0,  // use default DB
    })

    coll := colly.NewCollector()

    scrape := newScraper(coll, rc)

    c := cron.New()
    c.AddFunc("@every 10s", scrape.scrapePls)
    c.Start()

    sig := make(chan int)
    <-sig
}

func (sc scraper) scrapePls() {
    sc.coll.OnHTML(`body`, func(e *colly.HTMLElement) {
        //Extracting required content

        //Using Redis to store data
    })

    sc.coll.OnRequest(func(r *colly.Request) {
        log.Println("Visting", r.URL)
    })

    sc.coll.Visit("www.example.com")
}

Sembra che non funziona, fa una chiamata una volta e non periodicamente effettuare la chiamata successiva. Non so se mi sto perdendo qualcosa. Ci sono altri approcci che si possono adottare?

Qualsiasi aiuto sarebbe apprezzato.

Grazie!

cron go go-colly web-scraping
2021-11-13 06:06:49
1

Migliore risposta

0

c.AddFunc restituisce un error che non si verifica, si prega di fare nel caso che rivela ulteriori informazioni.

Si dovrebbe essere in grado di ispezionare il ritorno di c.Entries() che dovrebbero dare informazioni circa la volta successiva verrà chiamata la funzione.

Nel caso In cui si non fossero a conoscenza, non hai bisogno di una libreria completa per realizzare l'esecuzione di una funzione periodica. Per esempio si possono fare:

scrap := newScraper(coll, rc)

sig := make(chan os.Signal, 1)
signal.Notify(sig, os.Interrupt)
ticker := time.NewTicker(10 * time.Second)

// Run the function initially, so we don't have to wait 10 seconds for the first run (optional).
scrapePls()
for {
    select {
    case <-ticker.C:
        // Ticker will send a message every 10 seconds
        scrapePls()

        // You can also start a go routine every time. If scrapePls takes more than the interval
        // to run this may lead to issues to due to an forever increasing number of goroutines.
        // go scrapePls()
        
    case <-sig
        return
    }
}
2021-11-13 11:57:51

Grazie per la soluzione di circa utilizzando il ticker per chiamare periodicamente si. Ho fatto aggiungere c.Voci e fatto ottenere questo {1 {30s} 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC 0x6efa80 0x6efa80}]. Non era utile per me. Questo aiuta?
Adith Dev Reddy

Ancora ferma dopo la prima chiamata.
Adith Dev Reddy

Ciò che il c.Entries mostra, è che è previsto, solo per ogni 30 secondi, non ogni 10. I tempi sono ancora inizializzato, che possiamo essere impostato dopo la prima esecuzione. Come per il "non è ancora ferma dopo la prima chiamata" - vuoi dire che con il ticker? Se è così, significa che non hai mai tornare da scrapePls. Vi consiglio l'installazione di scavare e il passaggio attraverso il vostro programma in modo da poter vedere dove le cose vanno male
caveman

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................