From 093670db1ca6bf677f409998fc8b5eed232640e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Vizcaino?= Date: Fri, 7 Oct 2016 21:46:52 +0200 Subject: [PATCH] First version --- .gitignore | 4 +++ Makefile | 16 +++++++++++ auvieux-scraper.go | 71 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 Makefile create mode 100644 auvieux-scraper.go diff --git a/.gitignore b/.gitignore index c0d92d0..417b1df 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,7 @@ _testmain.go # Vendor libs vendor/ + +.vscode/ +auvieux-scraper +debug diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..fd1a25e --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +#!/usr/bin/make -f + +all: auvieux-scraper + + +.PHONY: all deps clean + +deps: + glide install + +auvieux-scraper: auvieux-scraper.go + go build -o $@ $^ + +clean: + rm -rf auvieux-scraper + diff --git a/auvieux-scraper.go b/auvieux-scraper.go new file mode 100644 index 0000000..c72305e --- /dev/null +++ b/auvieux-scraper.go @@ -0,0 +1,71 @@ +package main + +import ( + "fmt" + "os" + "regexp" + "strconv" + + "github.com/PuerkitoBio/goquery" +) + +const searchURLBase = "http://www.auvieuxcampeur.fr/catalogsearch/result/?q=" + +func searchURL(id string) string { + return fmt.Sprintf("%s%s", searchURLBase, id) +} + +type product struct { + ID string + Name string + Price float32 +} + +func convertPrice(pstr string) (float64, error) { + // Remove trailing ' €' + re := regexp.MustCompile(`^(\d+),(\d+).*$`) + s := re.ReplaceAllString(pstr, "$1.$2") + return strconv.ParseFloat(s, 32) +} + +func scrapeProduct(id string) (*product, error) { + url := searchURL(id) + doc, err := goquery.NewDocument(url) + if err != nil { + return nil, err + } + + name := doc.Find(".product-name > a").First().Text() + priceStr := doc.Find(".regular-price .price").First().Text() + + price, err := convertPrice(priceStr) + if err != nil { + return nil, err + } + + return &product{ + ID: id, + Name: name, + Price: float32(price), + }, nil +} + +func main() { + products := os.Args[1:] + + if len(products) == 0 { + fmt.Printf("Usage: auvieux-scraper product_id [product_id ...]") + os.Exit(1) + } + + fmt.Printf("Référence;Désignation;Prix TTC\n") + for _, productID := range products { + p, err := scrapeProduct(productID) + if err != nil { + fmt.Printf("Error getting product %s (%s)\n", productID, err) + continue + } + fmt.Printf("%s;%s;%.2f\n", p.ID, p.Name, p.Price) + } + +}