Execução Colly web scraper periodicamente usando o cron em Go

0

Pergunta

Eu estava fazendo alguns conflitos na web usando colly, mas queria executar periodicamente usando o cron. Eu fiz experimentar uma abordagem básica para ele.

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")
}

Ele parece não estar funcionando, faz uma chamada de uma vez e não periodicamente, fazer a próxima chamada. Não sei se eu estou faltando alguma coisa. Há outras abordagens que podem ser tomadas?

Qualquer ajuda seria apreciada.

Obrigado!

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

Melhor resposta

0

c.AddFunc retorna um error que você não está verificando, por favor, em caso que revela mais informações.

Você deve ser capaz de inspecionar o retorno de c.Entries() o que deve lhe dar informações sobre a próxima vez que sua função será chamada.

No caso de você não conhecia, você não precisa de uma biblioteca completa para realizar a execução de uma função periódica. Por exemplo, você pode fazer:

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

Obrigado pela solução sobre como utilizar o código para periodicamente chamá-lo. Eu fiz adicionar c.Entradas e fez isso {1 {30s} 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC 0x6efa80 0x6efa80}]. Não era útil para mim. Isso ajuda?
Adith Dev Reddy

Ele ainda deixa após a primeira chamada.
Adith Dev Reddy

O que o c.Entries mostra é que ele está agendada apenas para a cada 30 segundos, e não a cada 10. Os tempos ainda não inicializada, que podemos ser definido após a primeira execução. Como para o "ainda pára após a primeira chamada" - que você quer dizer com o ticker? Se assim for, isso significa que você nunca mais retornar a partir de scrapePls. Eu recomendo que você de instalação mergulhar e passo a passo através do seu programa de modo que você pode ver onde as coisas dão errado
caveman

Em outros idiomas

Esta página está em outros idiomas

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