Rularea Colly web scraper periodic folosind cron Merge

0

Problema

Am fost faci unele de web răzuire cu ajutorul colly, dar a vrut să-l rulați periodic folosind cron. Am încercat o abordare de bază pentru acesta.

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

Se pare a nu fi de lucru, face un apel o dată și nu face periodic la următorul apel. Nu sunt sigur dacă eu sunt lipsesc pe ceva. Există și alte abordări care pot fi luate?

Orice ajutor ar fi apreciat.

Multumesc!!!

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

Cel mai bun răspuns

0

c.AddFunc returnează un error care nu sunt de verificare, vă rugăm să faceți în cazul în care dezvăluie informații suplimentare.

Tu ar trebui să fie capabil de a inspecta revenirea c.Entries() care ar trebui să dea informații despre data viitoare functie va fi numit.

În cazul în care nu ai fost conștient, nu aveți nevoie de o bibliotecă completă pentru a realiza executarea unei funcții periodic. Puteți face, de exemplu:

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

Multumesc pentru soluție despre utilizarea ticker pentru periodic spune. I-am adăuga c.Intrări și a făcut rost de asta {1 {30s} 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC 0x6efa80 0x6efa80}]. N-a fost de ajutor pentru mine. Ajută asta?
Adith Dev Reddy

Încă se oprește după primul apel.
Adith Dev Reddy

Ce c.Entries arată că acesta este programat, pentru fiecare 30 de secunde, nu la fiecare 10. Ori sunt încă neinitializata, ei ne-am fi stabilite după prima execuție. Pentru ca "inca se oprește după primul apel" - vrei sa spui cu ticker? Dacă este așa, înseamnă că nu te mai întorci niciodată la scrapePls. Eu iti recomand setup îngropa și pas prin programul astfel încât să puteți vedea în cazul în care lucrurile merg prost
caveman

În alte limbi

Această pagină este în alte limbi

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