Ejecución de Colly web scraper periódicamente a través de cron en Ir

0

Pregunta

Yo estaba haciendo un poco de web scraping utilizando colly, pero quería ejecutar periódicamente mediante cron. Me hizo probar un enfoque básico para ello.

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

Parece no estar funcionando, hace una llamada una vez y no hacer periódicamente la siguiente llamada. No estoy seguro de si estoy perdiendo algo. ¿Hay algún otro de los enfoques que se pueden adoptar?

Cualquier ayuda se agradece.

Gracias!

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

Mejor respuesta

0

c.AddFunc devuelve un error que no son de cheques, por favor hacer en caso que revela más información.

Usted debe ser capaz de inspeccionar el retorno de c.Entries() que debe darle la información sobre la próxima vez que su función será llamada.

En caso de que no estaban al tanto, usted no necesita una biblioteca completa para lograr la ejecución de una función periódica. Por ejemplo, puedes hacer:

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

Gracias por la solución sobre el uso de la clave de pizarra de forma periódica llamarlo. Hice añadir c.Las entradas y los hizo llegar este {1 {30s} 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC 0x6efa80 0x6efa80}]. No era útil para mí. ¿Esta ayuda?
Adith Dev Reddy

Todavía se detiene después de la primera llamada.
Adith Dev Reddy

Lo que el c.Entries muestra es que está programado, sólo por cada 30 segundos, no de cada 10. Los tiempos están todavía sin inicializar, que hemos de ser establecido después de la primera ejecución. Como para el "todavía se detiene después de la primera llamada" - ¿quiere usted decir con el ticker? Si es así, significa que usted nunca volver de scrapePls. Te recomiendo el programa de instalación de profundizar y paso a través de su programa de modo que usted puede ver cuando las cosas van mal
caveman

En otros idiomas

Esta página está en otros idiomas

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