Go'da cron kullanarak Colly web kazıyıcıyı periyodik olarak çalıştırma

0

Soru

Colly kullanarak bazı web kazıma yapıyordum ama cron kullanarak periyodik olarak çalıştırmak istedim. Temel bir yaklaşım denedim.

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

Çalışmıyor gibi görünüyor, bir kez arama yapıyor ve periyodik olarak bir sonraki aramayı yapmıyor. Bir şeyi kaçırıp kaçırmadığımdan emin değilim. Alınabilecek başka yaklaşımlar var mı?

Herhangi bir yardım takdir edilecektir.

Teşekkürler!

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

En iyi cevabı

0

c.AddFunc bir değer döndürür error kontrol etmediğiniz, daha fazla bilgi ortaya çıkarsa lütfen yapın.

Geri dönüşünü kontrol edebilmelisiniz. c.Entries() bu, işlevinizin bir sonraki çağrılacağı zaman hakkında size bilgi vermelidir.

Farkında olmamanız durumunda, bir işlevi düzenli aralıklarla yürütmek için tam bir kitaplığa ihtiyacınız yoktur. Örneğin şunları yapabilirsiniz:

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

Teşekkürler çözümü hakkında kullanarak, kalp için düzenli olarak adlandır. C. Girişleri ekledim ve bunu aldım {1 {30s} 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC 0x6efa80 0x6efa80}]. Benim için yararlı olmadı. Bunun yardımı olur mu?
Adith Dev Reddy

İlk aramadan sonra hala duruyor.
Adith Dev Reddy

Ne c.Entries her 10 saniyede bir değil, sadece her 30 saniyede bir planlandığını gösterir. Zamanlar hala başlatılmamış, ilk idamdan sonra ayarlanacağız. "İlk aramadan sonra hala duruyor" konusuna gelince-Senetle mi demek istiyorsun? Asla geri gelen eğer böyleyse, demek scrapePls. İşlerin nereye yanlış gittiğini görebilmeniz için programınızı kurmanızı ve adım atmanızı öneririm
caveman

Diğer dillerde

Bu sayfa diğer dillerde

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