学习目标:
例如:这一周都在学Go语言,写这个博客记录自己平时学到的重要内容。学习内容:
1、面向对象编程方法
go 中没有类,但是可以使用结构体、指针和闭包特性实现面向对象编程。
例如:
package main
import "fmt"
type Test struct {
z float32
}
func NewTest(z float32) *Test {
return &Test{z:z}
}
func (t *Test) SetZ(z float32) {
t.z = z
}
func (t *Test) GetZ() float32 {
return t.z
}
// 定义结构体,结构体变量就相当于类变量
type TestClass struct {
x int // 封装,变量首字母小写,只能使用 SetX 或者 GetX 访问;如果首字母大写则可以外部访问
y string
*Test // 继承
}
// 实现构造函数
func NewTestClass(x int, y string, z float32) *TestClass {
return &TestClass{
x: x,
y: y,
Test: NewTest(z),
}
}
// 闭包实现成员方法
func (t *TestClass) SetX(x int) {
t.x = x
}
func (t *TestClass) GetX() int {
return t.x
}
func (t *TestClass) SetY(y string) {
t.y = y
}
func (t *TestClass) GetY() string {
return t.y
}
func main(){
testClass := NewTestClass(0, "first", 0.0)
fmt.Println(testClass.GetX())
fmt.Println(testClass.GetY())
fmt.Println(testClass.GetZ())
testClass.SetX(1)
testClass.SetY("go")
testClass.SetZ(1.2)
fmt.Println(testClass.GetX())
fmt.Println(testClass.GetY())
fmt.Println(testClass.GetZ())
}
运行结果:
下载Goland费时,先在命令行cmd里自学。
2、go爬取豆瓣电影信息
爬取豆瓣电影是练习爬虫很好的入门方法,因为它是一个静态网页,并且没有过多的反爬虫机制。我简单爬取了电影名字和评分。
package main
import (
"encoding/csv"
"fmt"
"github.com/gocolly/colly"
"os"
"sort"
"strconv"
)
type Film struct {
title string
score float64
}
// 封装结构体进行排序
type Wrapper struct {
films []Film
by func(a, b *Film) bool
}
func main() {
//创建收集器
c := colly.NewCollector()
films := make([]Film, 0, 50)
//获取分页的url
c.OnHTML("a[href]", func(e *colly.HTMLElement) {
link := e.Attr("href")
if e.Text == "后页>" {
c.Visit(e.Request.AbsoluteURL(link))
}
})
//获取每页的电影信息
c.OnHTML("div[class=info]", func(e *colly.HTMLElement) {
t := e.ChildText(".title:nth-child(1)")
s, _ := strconv.ParseFloat(e.ChildText(".rating_num"), 64)
films = append(films, Film{
title: t,
score: s,
})
})
c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL.String())
})
//开始访问豆瓣
c.Visit("https://movie.douban.com/top250")
//将获取的数据按评分排序
sort.Sort(Wrapper{films, func(a, b *Film) bool {
return a.score > b.score
}})
f, _ := os.Create("films.csv")
defer f.Close()
//防止中文乱码
f.WriteString("\xEF\xBB\xBF")
writer := csv.NewWriter(f)
defer writer.Flush()
//将爬取信息写入csv文件
writer.Write([]string{"Title", "score"})
for _, v := range films {
writer.Write([]string{v.title, strconv.FormatFloat(v.score, 'f', -1, 64)})
}
}
//重写排序所需的方法
func (pw Wrapper) Len() int { // 重写 Len() 方法
return len(pw.films)
}
func (pw Wrapper) Swap(i, j int) { // 重写 Swap() 方法
pw.films[i], pw.films[j] = pw.films[j], pw.films[i]
}
func (pw Wrapper) Less(i, j int) bool { // 重写 Less() 方法
return pw.by(&pw.films[i], &pw.films[j])
}
提取信息到csv文件