-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
112 lines (91 loc) · 2.93 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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package main
import (
"log"
"strings"
"github.com/PuerkitoBio/goquery"
"strconv"
"flat-scraper/flat"
"flat-scraper/utils"
"flat-scraper/db"
"fmt"
"sync"
"bytes"
)
func FlatScraper(c utils.Configuration) []flat.Flat {
flatResponses := make(chan []flat.Flat)
var wg sync.WaitGroup
wg.Add(len(c.Areas))
for _, area := range c.Areas {
go func(area string) {
fmt.Println(area+" starts")
var resultList []flat.Flat
doc, err := goquery.NewDocument("https://www.idealista.com/alquiler-viviendas/madrid/"+area+"/con-pisos,estado_buen-estado,amueblado_amueblados/")
if err != nil {
log.Fatal(err)
}
doc.Find(".items-container article").Each(func(i int, s *goquery.Selection) {
name := s.Find("a").Text()
price, err := strconv.Atoi(strings.Replace(strings.Split(s.Find(".item-price").Text(),"€")[0],".","",-1))
var rooms, size, store, id int
var elevator bool = false
s.Find(".item-detail").Each(func(i int, sel *goquery.Selection) {
item := sel.Text()
if strings.Contains(item, "hab") {
rooms, err = strconv.Atoi(strings.Split(item, " hab")[0])
} else if strings.Contains(item, "m") {
size, err = strconv.Atoi(strings.Split(item, " m")[0])
} else if strings.Contains(item, "ª") {
store, err = strconv.Atoi(strings.Split(item, "ª")[0])
if strings.Contains(item, "con") {
elevator = true
}
}
})
link := s.Find("a").AttrOr("href", "")
if strings.Contains(link, "/inmueble/") {
id, err = strconv.Atoi(strings.Split(link, "/")[2])
var current = flat.Flat{id, name, price, rooms, size, store, elevator, link, area}
resultList = append(resultList,current)
}
})
fmt.Printf("%s finishes with size %d \n",area,len(resultList))
flatResponses <- resultList
wg.Done()
}(area)
}
go func() {
wg.Wait()
close(flatResponses)
}()
var finalList []flat.Flat
for response := range flatResponses {
finalList = append(finalList, response...)
}
return finalList
}
func Filter(vs []flat.Flat, c utils.Configuration) []flat.Flat {
var vsf []flat.Flat
for _, v := range vs {
if v.Price<= c.Price &&
v.Size >= c.Size &&
v.Elevator && v.Store > 1 {
vsf = append(vsf, v)
}
}
return vsf
}
func main() {
config := utils.LoadConfig()
resultList := FlatScraper(config)
newFlats := database_handler.FlatInsert(resultList)
filteredList := Filter(newFlats, config)
if (len(filteredList) > 0) {
filteredLength := strconv.Itoa(len(filteredList))
var buffer bytes.Buffer
for _,v := range filteredList {
buffer.WriteString(v.ToString()+"\n")
}
filteredListText := buffer.String()
utils.EmailSend(config, filteredLength, filteredListText)
}
}