/
code.go
108 lines (84 loc) · 2.01 KB
/
code.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
// code
package main
import (
"encoding/csv"
"fmt"
"github.com/axgle/mahonia"
"github.com/crufter/goquery"
"io/ioutil"
"log"
"net/http"
"os"
"strings"
)
func FetchAllStockCode(fname string) {
var url = "http://quote.eastmoney.com/stocklist.html"
htm, err := goquery.ParseUrl(url)
if err != nil {
fmt.Println("Error:", err)
}
quote := htm.Find("div.quotebody")
links := quote.Find("a")
lns := links.Attrs("href")
f, err := os.OpenFile(fname, os.O_CREATE|os.O_WRONLY, os.ModePerm)
defer f.Close()
w := csv.NewWriter(f)
for i := range lns {
herf := lns[i]
if strings.HasSuffix(herf, ".html") && strings.Contains(herf, "") {
fmt.Println(herf)
ix1 := strings.LastIndex(herf, "/")
ix2 := strings.Index(herf, ".html")
s := &Stock{}
s.Code = herf[ix1+1 : ix2][2:]
s.Area = herf[ix1+1 : ix2][:2]
getStockInfoFromSina(s)
w.Write([]string{s.Code, s.Area, s.Name})
// f.WriteString(code+"\r\n")
// fmt.Println(herf[27:35])
}
}
w.Flush()
f.Close()
}
func ReadAllStockCode(fname string) (stks []Stock, err error) {
f, err := os.OpenFile(fname, os.O_RDONLY, os.ModePerm)
if err != nil {
log.Fatal(err)
return stks, err
}
defer f.Close()
reader := csv.NewReader(f)
record, err := reader.ReadAll()
if err != nil {
log.Fatal(err)
return stks, err
}
stks = make([]Stock, len(record))
for i := 0; i < len(record); i++ {
stks[i] = Stock{
Name: record[i][2],
Code: record[i][0],
Area: record[i][1],
}
}
return
}
func getStockInfoFromSina(s *Stock) {
var qturl = "http://hq.sinajs.cn/list="
resp, _ := http.Get(qturl + s.Area + s.Code)
ctn, _ := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
enc := mahonia.NewDecoder("gbk")
gbct := enc.ConvertString(string(ctn))
if strings.Contains(gbct, "none_match") {
return
}
fmt.Println(s.Area, s.Code, ":", gbct)
inx1 := strings.Index(gbct, "\"")
inx2 := strings.LastIndex(gbct, "\"")
fmt.Println(gbct[inx1+1 : inx2])
ctns := strings.Split(gbct[inx1+1:inx2], ",")
s.Name = ctns[0]
fmt.Println(ctns)
}