-
Notifications
You must be signed in to change notification settings - Fork 6
/
urlScrub.go
128 lines (107 loc) · 3.35 KB
/
urlScrub.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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package main
import (
"bufio"
"log"
"os"
"strings"
"github.com/PuerkitoBio/goquery"
flags "github.com/jessevdk/go-flags"
goq "github.com/opesun/goquery"
)
var opts struct {
FileNameCompany string `short:"o" long:"open" default:"./names.txt" description:"With the names of the companies file"`
}
func main() {
// разбор флагов
flags.Parse(&opts)
// в какой папке исполняемы файл
pwdDir, _ := os.Getwd()
// создание файла log для записи ошибок
fLog, err := os.OpenFile(pwdDir+`/.log`, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0640)
if err != nil {
log.Fatalln(err)
}
defer fLog.Close()
// запись ошибок и инфы в файл
log.SetOutput(fLog)
// создание папки с отчетами
os.Mkdir(pwdDir+"/reports", 0755)
// справка по компаниям
fileTXT, err := os.OpenFile(pwdDir+"/reports/reports.txt", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
if err != nil {
log.Fatalln(err)
}
defer fileTXT.Close()
// разобрать названия компаний для перебора
var massName []string
fileOpen, err := os.Open(opts.FileNameCompany)
if err != nil {
log.Fatalln(err)
}
// построчное считывание
scanner := bufio.NewScanner(fileOpen)
for scanner.Scan() {
massName = append(massName, scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
defer fileOpen.Close()
for i := 0; i < len(massName); i++ {
search := massName[i]
log.Printf("Ищу данные по компании:\t%v\n", search)
// Request the HTML page.
doc, err := goquery.NewDocument("https://www.google.ru/search?q=" + search + "+inurl%3Asbis.ru")
if err != nil {
log.Fatal(err)
}
// храниение итоговых ссылок
var urlsSearchs []string
doc.Find("a[href]").Each(func(index int, item *goquery.Selection) {
href, _ := item.Attr("href")
if strings.Contains(href, "https://sbis.ru/") {
// обрезка html
j := strings.TrimLeft(href, `/url?q=`)
if strings.HasPrefix(j, "https://sbis.ru/") {
urlsSearchs = append(urlsSearchs, j)
}
}
})
log.Printf("Найдены такие ссылки:\n")
for _, logURL := range urlsSearchs {
log.Printf("\t%v\n", logURL)
}
lenURL := 3
if len(urlsSearchs) < 3 {
lenURL = len(urlsSearchs)
}
for o := 0; o < lenURL; o++ {
searchURL(urlsSearchs[o], fileTXT)
}
}
log.Println("Готово")
}
func searchURL(url string, fileTXT *os.File) {
x, err := goq.ParseUrl(url)
if err != nil {
log.Fatalf("Ошибка парсинга страницы:\t%v\n", err)
}
// Наименование
nameCo := strings.Split(x.Find("div.cCard__MainReq-Name").Text(), ", ")
// -----------------------------------------------------------
// вся инфа в текстовую справку
writeString(strings.TrimLeft(x.Find("div.cCard__CompanyDescription").Text(), "Краткая справка"), fileTXT)
_, err = fileTXT.WriteString("\n-------------------------------------------\n")
if err != nil {
log.Fatalln(err)
}
log.Printf("Обработал по данным на:\t%v\n", nameCo[0])
}
// запись в файл строки
func writeString(x string, file *os.File) {
// tab в виде разделителя
_, err := file.WriteString(x + " ")
if err != nil {
log.Fatalln(err)
}
}