在Go中使用cron定期运行Colly web scraper



我使用colly进行了一些web抓取,但希望使用cron定期运行它。我确实尝试了一种基本的方法

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

它似乎不起作用,只打了一次电话,不会定期打下一个电话。不确定我是否错过了什么。还有其他方法可以采取吗?

如有任何帮助,我们将不胜感激。

谢谢!

c.AddFunc返回一个您没有检查的error,以防泄露更多信息。

您应该能够检查c.Entries()的返回,这将为您提供下一次调用函数的信息。

如果您没有意识到,您不需要一个完整的库来定期执行一个函数。例如,你可以做:

scrape := 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
}
}

相关内容

  • 没有找到相关文章

最新更新