Běží Colly web scraper pravidelně pomocí cronu v Go

0

Otázka

Byl jsem dělat nějaké webové škrábání pomocí colly ale chtěl běžet pravidelně pomocí cronu. Udělal jsem vyzkoušet základní přístup k němu.

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

Zdá se, že nefunguje, zavolá jednou a nemá pravidelně, aby další volání. Nejsem si jistý, jestli jsem v životě něco chybí. Existují jiné přístupy, které mohou být přijata?

Jakýkoliv pomoci chtěl bych být ocenil.

Díky!!!

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

Nejlepší odpověď

0

c.AddFunc vrátí error které nekontrolujete, prosím, v případě, že se odhalí další informace.

Měli byste být schopni zkontrolovat návrat c.Entries() který by vám měl poskytnout informace o příště vaše funkce bude jmenovat.

V případě, že jste nebyli vědomi, nepotřebujete plnou knihovnu dosáhnout výkonu funkce pravidelně. Můžete například udělat:

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

Díky za řešení o použití ticker pro pravidelně volat. Udělal jsem přidat c.Položky a udělal si to {1 {30s} 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC 0x6efa80 0x6efa80}]. Nebylo užitečné pro mě. Tato pomoc má?
Adith Dev Reddy

Stále se zastaví po první výzvě.
Adith Dev Reddy

Co c.Entries ukazuje se, že to je naplánováno, jen pro každých 30 sekund, ne každý 10. Časy jsou stále neinicializované, že jsme třeba nastavit po prvním spuštění. Co se týče "stále se zastaví po prvním volání" - to myslíš s ticker? Pokud ano, tak to znamená, že budete nikdy vrátit z scrapePls. Doporučuji si nastavit ponořit a krokovat program, takže můžete vidět, kde se věci pokazí
caveman

V jiných jazycích

Tato stránka je v jiných jazycích

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