Search code examples
goweb-scrapinggo-colly

Go colly returning a string instead of a slice of strings


I am trying to scrape the webpage https://www.brasiltronic.com.br/pesquisa?pg=1&t=Fone%20de%20ouvido

with the following code:

scraper.go


package scraper

import (
    "fmt"
    "strings"

    "github.com/gocolly/colly"
    "github.com/gocolly/colly/extensions"
)

type Product struct {
    name      string
    fullPrice string
    url       string
}

func Scraper(url string) []Product {

    products := make([]Product, 0)
    c := colly.NewCollector()
    colly.AllowedDomains("www.brasiltronic.com.br")
    c.OnHTML("ul.row", func(e *colly.HTMLElement) {
        name := e.ChildText("div > div.information > h3.name.no-medium.no-tablet")
        fullPrice := e.ChildText("strong.sale-price > span:nth-child(1)")
        replacer := strings.NewReplacer("R$", "", ",", ".")
        fullPrice = replacer.Replace(fullPrice)
        url := e.ChildAttr("div > div.information > a", "href")
        products = append(products, Product{name: name, fullPrice: fullPrice, url: url})
    })
    c.OnError(func(r *colly.Response, err error) {
        fmt.Println("Request URL:", r.Request.URL, "failed with response:", r.Request, "\nError:", err)
    })

    // Uses a random User-Agent in each request
    extensions.RandomUserAgent(c)

    c.Visit(url)

    return products
}

main.go

package main

import (
    "fmt"

    "github.com/Antonio-Costa00/Go-Price-Monitor/scraper"
)

func main() {

    url := "https://www.brasiltronic.com.br/pesquisa?pg=1&t=Fone%20e%20ouvido"
    products := scraper.Scraper(url)
    fmt.Println(products)
}

This is the output:

[{Fone de Ouvido Profissional AKG K92 com fio - Preto e DouradoMicrofone de lapela JBL com fone de ouvido CSLM
20Fone de Ouvido Samson SR350 Over-ear Estéreo PretoFone de Ouvido Sennheiser CX100 BrancoFone de Ouvido Audio
-Technica ATH-M20xBT sem Fio com Bluetooth PretoFone de Ouvido Sennheiser HD100 com fio (Preto)Fone de Ouvido 
Sennheiser HD400S com fio (Preto)Fone de Ouvido Audio-Technica ATH-M40x Profissional para Monitoração com fio 
- PretoFone de Ouvido Audio-Technica ATH-M20x Profissional para Monitoração com fio - PretoFone de Ouvido Audi
o-Technica ATH-M30x Profissional para Monitoração com fio - PretoFone de Ouvido Audio-Technica ATH-AVC400 extr
a-auricualres SonicPro com fio - PretoFone de Ouvido Audio-Technica ATH-M50x Profissional para Monitoração com
 fio - PretoToca Discos Audio-Technica AT-LP60XHP-GM Automático Belt-Drive com Fone de Ouvido ATH-250AV ...Fon
e de Ouvido Sem Fio Sennheiser RS2000 - PretoFone de Ouvido Profissional AKG K361-BT Dobrável - PretoKit Micro
fone Samson C01U Pro PodCasting Pack SAC01UPROPKFone De Ouvido Profissional AKG K371-BT com Bluetooth - PretoH
eadset Audio-Technica ATH-101USB Single-Ear com fio USB - PretoFone de Ouvido Audio-Technica ATH-R70x Profissi
onal de referência abertos com fio - PretoKit Microfone Estudio Zoom ZUM-2 PMP com Headphone e tripé de mesaHe
adset Audio-Technica ATH-102USB Dual-Ear com fio USB - PretoFones de ouvido de monitoramento Sennheiser IE 40 
PRO Clear intra-auricularHeadset Gamer Audio-Technica ATH-G1WL Premium para Jogos Wireless - PretoMicrofone Sa
mson Q9U Cardióide XLR/USB  359.10 94.50 159.30 159.30 699.30 269.10 519.30 879.30 419.40 619.20 373.50 1.219.
50 1.399.50 1.479.60 769.50 1.599.30 1.009.80 219.60 2.559.60 1.129.50 224.10 759.60 1.649.70 1.619.10 /fone-d
e-ouvido-profissional-akg-k92-com-fio-preto-e-dourado-p1331225}]

I want to get a slice of strings, but instead, I am getting an element slice with all elements.

Can someone help me identify what's happening? Thanks in advance.


Solution

  • I found the answer. I just add an foreach method from colly

    package scraper
    
    import (
        "fmt"
        "strings"
    
        "github.com/gocolly/colly"
        "github.com/gocolly/colly/extensions"
    )
    
    type Product struct {
        name      string
        fullPrice string
        url       string
    }
    
    package scraper
    
    import (
        "fmt"
        "strings"
    
        "github.com/gocolly/colly"
        "github.com/gocolly/colly/extensions"
    )
    
    type Product struct {
        name      string
        fullPrice string
        url       string
    }
    
    func Scraper(url string) []Product {
    
        products := make([]Product, 0)
        c := colly.NewCollector()
        colly.AllowedDomains("www.brasiltronic.com.br")
        c.OnHTML("ul.row", func(e *colly.HTMLElement) {
            e.ForEach("div.inner", func(i int, h *colly.HTMLElement) {
                name := h.ChildText("div > div.information > h3.name.no-medium.no-tablet")
                fullPrice := h.ChildText("strong.sale-price > span:nth-child(1)")
                replacer := strings.NewReplacer("R$", "", ",", ".")
                fullPrice = replacer.Replace(fullPrice)
                url = h.ChildAttr("div > div.information > a", "href")
                products = append(products, Product{name: name, fullPrice: fullPrice, url: url})
            })
    
        })
        c.OnError(func(r *colly.Response, err error) {
            fmt.Println("Request URL:", r.Request.URL, "failed with response:", r.Request, "\nError:", err)
        })
    
        // Uses a random User-Agent in each request
        extensions.RandomUserAgent(c)
    
        c.Visit(url)
    
        return products
    }
    
    

    Output:

    [{Fone de Ouvido Profissional AKG K92 com fio - Preto e Dourado  359.10 /fone-de-ouvido-profissional-akg-k92-com-fio-preto-e-dourado-p1331225} {Microfone de lapela JBL com fone de ouvido CSLM20  94.50 /microfone-de-lapela-jbl-com-fone-de-ouvido-cslm20-p1331251} {Fone de Ouvido Samson SR350 Over-ear Estéreo Preto  159.30 /fone-de-ouvido-over-ear-samson-sr350-estereo-preto-p1331708} {Fone de Ouvido Sennheiser CX100 Branco  159.30 /fone-de-ouvido-in-ear-int
    ra-auricular-sennheiser-cx100-branco-p1330663} {Fone de Ouvido Audio-Technica ATH-M20xBT sem Fio com Bluetooth Preto  699.30 /fone-de-ouvido-sem-fio-audio-technica-ath-m20xbt-com-bluetooth-preto-p1331720} {Fone de Ouvido Sennheis
    er HD100 com fio (Preto)  269.10 /fone-de-ouvido-sennheiser-hd100-preto-headphone-stereo-on-ear-com-fio-p1330153} {Fone de Ouvido Sennheiser HD400S com fio (Preto)  519.30 /fone-de-ouvido-sennheiser-hd400s-com-fio-cor-preto-p1330
    112} {Fone de Ouvido Audio-Technica ATH-M40x Profissional para Monitoração com fio - Preto  879.30 /fone-de-ouvido-audio-technica-ath-m40x-profissional-para-monitoracao-com-fio-preto-p1330999} {Fone de Ouvido Audio-Technica ATH-M
    20x Profissional para Monitoração com fio - Preto  419.40 /fone-de-ouvido-audio-technica-ath-m20x-profissional-para-monitoracao-com-fio-preto-p1330997} {Fone de Ouvido Audio-Technica ATH-M30x Profissional para Monitoração com fio
     - Preto  619.20 /fone-de-ouvido-audio-technica-ath-m30x-profissional-para-monitoracao-com-fio-preto-p1330998} {Fone de Ouvido Audio-Technica ATH-AVC400 extra-auricualres SonicPro com fio - Preto  373.50 /fone-de-ouvido-audio-tec
    hnica-ath-avc400-extra-auricualres-sonicpro-com-fio-preto-p1330994} {Fone de Ouvido Audio-Technica ATH-M50x Profissional para Monitoração com fio - Preto  1.219.50 /fone-de-ouvido-audio-technica-ath-m50x-profissional-para-monitor
    acao-com-fio-preto-p1331000} {Toca Discos Audio-Technica AT-LP60XHP-GM Automático Belt-Drive com Fone de Ouvido ATH-250AV ...  1.399.50 /toca-discos-automatico-audio-technica-at-lp60xhp-belt-drive-com-fone-de-ouvido-ath-250av-gra
    fite-p1331501} {Fone de Ouvido Sem Fio Sennheiser RS2000 - Preto  1.479.60 /fone-de-ouvido-sem-fio-sennheiser-rs2000-preto-p1331279} {Fone de Ouvido Profissional AKG K361-BT Dobrável - Preto  769.50 /fone-de-ouvido-profissional-a
    kg-k361-bt-dobravel-preto-p1331228} {Kit Microfone Samson C01U Pro PodCasting Pack SAC01UPROPK  1.599.30 /kit-microfone-podcasting-samson-c01u-pro-pack-sac01upropk-p1331661} {Fone De Ouvido Profissional AKG K371-BT com Bluetooth
    - Preto  1.009.80 /fone-de-ouvido-profissional-akg-k371-bt-com-bluetooth-preto-p1331231} {Headset Audio-Technica ATH-101USB Single-Ear com fio USB - Preto  219.60 /headset-audio-technica-ath-101usb-single-ear-com-fio-usb-preto-p1
    331030} {Fone de Ouvido Audio-Technica ATH-R70x Profissional de referência abertos com fio - Preto  2.559.60 /fone-de-ouvido-audio-technica-ath-r70x-profissional-de-referencia-abertos-com-fio-preto-p1330975} {Kit Microfone Estudi
    o Zoom ZUM-2 PMP com Headphone e tripé de mesa  1.129.50 /kit-microfone-estudio-zoom-zum-2-pmp-com-headphone-e-tripe-de-mesa-p1331536} {Headset Audio-Technica ATH-102USB Dual-Ear com fio USB - Preto  224.10 /headset-audio-technic
    a-ath-102usb-dual-ear-com-fio-usb-preto-p1331028} {Fones de ouvido de monitoramento Sennheiser IE 40 PRO Clear intra-auricular  759.60 /fone-de-ouvido-de-monitoramento-sennheiser-ie-40-pro-clear-intra-auricular-p1330695} {Headset
     Gamer Audio-Technica ATH-G1WL Premium para Jogos Wireless - Preto  1.649.70 /headset-gamer-audio-technica-ath-g1wl-premium-para-jogos-wireless-preto-p1330996} {Microfone Samson Q9U Cardióide XLR/USB  1.619.10 /microfone-samson-q
    9u-cardioide-xlr-usb-p1331659}]