Okresowo uruchomić sieci web, skrobak Colly z wykorzystaniem cron w Go

0

Pytanie

Robiłem www скрейпингом z pomocą colly, ale chciałem okresowo uruchomić go za pomocą crona. Naprawdę próbowałem podstawowy podejście do tego.

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

Wygląda na to, że nie działa, dzwoni raz i okresowo nie sprawia, że następny telefon. Nie jestem pewien, że coś mi umknęło. Czy są jakieś inne podejścia, które można by podjąć?

Każda pomoc będzie wdzięczna.

Dziękuję!

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

Najlepsza odpowiedź

0

c.AddFunc zwraca error które nie sprawdzasz, zrób to w przypadku, gdy otworzy się dodatkowe informacje.

Musisz mieć możliwość sprawdzenia zwrot c.Entries() co powinno dać ci informacje na temat następnym wywołaniu funkcji.

W przypadku, gdy nie wiedzieli, nie potrzebujesz pełna biblioteka okresowego wykonywania funkcji. Można na przykład zrobić:

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

Dziękuję za decyzję o użyciu giełdowy okresowego połączenia. Naprawdę dodał c.Zapisy i dostałem to {1 {30s} 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC 0x6efa80 0x6efa80}]. Mi to nie pomogło. Czy to pomaga?
Adith Dev Reddy

On i tak zatrzymuje się po pierwszym dzwonku.
Adith Dev Reddy

Co za c.Entries pokazuje, że jest to zaplanowane, tylko co 30 sekund, a nie co 10. Czasy wciąż неинициализированы, oni u nas będą zainstalowane po pierwszym wykonaniu. Co do "wciąż zatrzymuje się po pierwszej rozmowy" - masz na myśli z o skrót nazwy? Jeśli tak, to oznacza, że nigdy nie wrócisz z scrapePls. Polecam ci dostosować sięgać i krok po kroku wykonać swój program, aby można było zobaczyć, gdzie coś idzie nie tak
caveman

W innych językach

Ta strona jest w innych językach

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