Bežecká Colly web škrabka pravidelne pomocou cron v Go

0

Otázka

Robil som niektoré webové skenovanie pomocou colly, ale chcel spustiť pravidelne pomocou cron. Som si vyskúšať základného prístupu k nej.

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á sa, že nefunguje, zavolá raz a nemá pravidelne robiť ďalšiu výzvu. Nie je istý, či som chýba na niečo. Je tam nejaké iné prístupy, ktoré možno prijať?

Akúkoľvek pomoc, chcel by som byť ocenil.

Vďaka!

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

Najlepšiu odpoveď

0

c.AddFunc vráti error ktoré nie sú kontrola, prosím, v prípade, že odhaľuje ďalšie informácie.

Mali by ste byť schopní kontrolovať návrat c.Entries() ktorá by vám mala poskytnúť informácie o ďalšom svoju funkciu budú tzv.

V prípade, že ste si toho neboli vedomí, nemusíte celý knižnice na dosiahnutie výkonu funkcie pravidelne. Napríklad môžete urobiť:

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

Vďaka za riešenie o používaní obrazovky pre pravidelne zavolať. Urobil pridať c.Záznamy a urobil si to {1 {30s} 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC 0x6efa80 0x6efa80}]. Nebolo užitočné pre mňa. To pomôcť?
Adith Dev Reddy

Stále sa zastaví po prvý hovor.
Adith Dev Reddy

Čo c.Entries ukazuje sa, že je to naplánované, len za každých 30 sekúnd, nie každých 10. Časy sú stále uninitialized, že sme sa po prvý exekúcie. Ako na "to sa ešte zastaví po prvý hovor" - myslíš, že s ticker? Ak áno, znamená to, že ste nikdy nevráti z scrapePls. Odporúčam vám setup ponoriť a krok prostredníctvom svojho programu, takže môžete vidieť, kde sa niečo nedarí
caveman

V iných jazykoch

Táto stránka je v iných jazykoch

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