-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
76 lines (61 loc) · 1.42 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package main
import (
"sync"
"log/slog"
"recipe-scraper/parser"
"recipe-scraper/shared"
"github.com/gocolly/colly"
)
type SiteConfig struct {
Domain string
Parser parser.RecipeParser
}
var siteConfigs = []SiteConfig{
{
Domain: "wanderingstarfarmhouse.com",
Parser: &parser.WanderingStarFarmhouseParser{},
},
{
Domain: "pinchofyum.com",
Parser: &parser.PinchOfYumParser{},
},
{
Domain: "sallysbakingaddiction.com",
Parser: &parser.SallysBakingAddictionParser{},
},
}
func main() {
var wg sync.WaitGroup
recipeChannel := make(chan shared.Recipe, 100)
visitedLinks := make(map[string]struct{})
visitedLinksMu := sync.Mutex{}
createRecipeDirectory()
for _, siteConfig := range siteConfigs {
parser := siteConfig.Parser
c := colly.NewCollector(colly.AllowedDomains(config.AllowedDomains...))
c.OnRequest(func(r *colly.Request) {
slog.Info("Visiting: ", r.URL.String())
})
c.OnHTML("a[href]", func(e *colly.HTMLElement) {
wg.Add(1)
go handleLink(e, c, &wg, recipeChannel, &visitedLinks, &visitedLinksMu, parser)
})
c.OnHTML(parser.RecipeSelector(), func(e *colly.HTMLElement) {
parser.HandleRecipe(e, recipeChannel)
})
wg.Add(1)
go func() {
defer wg.Done()
c.Visit(parser.RootLink())
}()
}
go func() {
wg.Wait()
close(recipeChannel)
}()
for recipe := range recipeChannel {
recipes = append(recipes, recipe)
writeRecipeToJSON(recipe)
}
// writeRecipesToJSON()
}