使用GO 爬取豆瓣top250并保存成csv格式文件

kqzh · 2019-10-14 10:11:00 · 1336 次点击 · 预计阅读时间 2 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2019-10-14 10:11:00 的文章,其中的信息可能已经有所发展或是发生改变。

最终效果传送门

思路

  1. 使用 colly.visit 访问目标网页

  2. 通过每张页面中 "下一页"的 url 依次访问所有页面

  3. 在每一页中使用colly.OnHTML 解析获得需要的数据

  4. 利用 go 标准库 encoding/csv 来保存csv格式文件

代码实现

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, 225)

    //获取分页的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])
}

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1336 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传