L'exécution de Colly web grattoir périodiquement à l'aide de cron en Aller

0

La question

Je faisais des web grattage à l'aide d'colly, mais voulait l'exécuter périodiquement à l'aide de cron. J'ai fait essayer une approche fondamentale pour elle.

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

Il semble ne pas fonctionner, il fait un appel une fois et de ne pas changer régulièrement de l'appel suivant. Vous ne savez pas si il me manque quelque chose. Est-il d'autres approches qui peuvent être adoptées?

Toute aide serait appréciée.

Merci!

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

La meilleure réponse

0

c.AddFunc retourne un error qui vous ne les contrôlez pas, merci de le faire dans le cas qui révèle l'information.

Vous devriez être en mesure d'inspecter le retour de c.Entries() ce qui devrait vous donner des informations sur la prochaine fois que votre fonction sera appelée.

Dans le cas où vous n'étiez pas au courant, vous n'avez pas besoin d'une bibliothèque pour accomplir l'exécution d'une fonction périodique. Vous pouvez par exemple faire:

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

Merci pour la solution sur l'utilisation de l'ticker pour périodiquement l'appeler. J'ai fait ajouter c.Entrées et de n'obtenir ce {1 {30s} 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC 0x6efa80 0x6efa80}]. N'était pas utile pour moi. Cela vous aide?
Adith Dev Reddy

Il s'arrête toujours après le premier appel.
Adith Dev Reddy

Ce que l' c.Entries montre, c'est qu'il est prévu, pour chaque 30 secondes, pas tous les 10. Les temps sont encore non initialisée, ils nous être défini après la première exécution. Comme pour le "il s'arrête toujours après le premier appel" - entendez-vous avec le ticker? Si oui, cela signifie que vous ne reviens jamais de scrapePls. Je vous recommande d'installation de plonger et de l'étape par le biais de votre programme de sorte que vous pouvez voir où les choses vont mal
caveman

Dans d'autres langues

Cette page est dans d'autres langues

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