golang+elasticsearch 爬取网易云音乐评论(未整理版本)

稍微整理了一下的爬取,在文件 V2.0 中

入口文件 main.go

package main

import (
    "go-wyy/models"
    "go-wyy/v2.0/engin"
    "io"
    "github.com/PuerkitoBio/goquery"
    "sync"
    "go-wyy/v2.0/fetcher"
    "go-wyy/v2.0/parse"
)

func main() {
    //ticker := time.Tick(200 * time.Millisecond)

    engin.Run(
        engin.Request{
            Url:           "",
            ParserComment: engin.NilParser,
            ParserSong: func(reader io.Reader) engin.ParseResult {
                doc, err := goquery.NewDocumentFromReader(reader)

                if err != nil {
                    panic(err)
                }

                wg := &sync.WaitGroup{}
                result := engin.ParseResult{}
                doc.Find("ul[class=f-hide] a").Each(func(i int, selection *goquery.Selection) {
                    /*开启协程插入数据库,并且开启协程请求每首歌的评论*/
                    songIdUrl, _ := selection.Attr("href")
                    title := selection.Text()
                    var song models.Song
                    //歌曲id
                    songId := songIdUrl[9:len(songIdUrl)]
                    song.SongId = songId

                    ///song?id=歌曲id
                    song.SongUrlId = songIdUrl

                    //歌曲标题
                    song.Title = title
                    //fmt.Printf("歌曲题目:%s\n", title)
                    result.Items = append(result.Items, "歌曲信息:", song)
                    offset := 0
                    songComment := make(chan [][]byte, 100)
                    go func(offset int) {
                        for {
                            fetcher.GetComments(songId, offset, offset+40, songComment, wg)
                            offset += 40
                        }

                    }(offset)
                    go parse.ReceiveComment(songComment, wg)
                    wg.Add(2)
                })
                wg.Wait()
                return result
            },
        })
}

这里写的很不简洁

本来 ParseSong 后面的闭包函数应该写在 parse 文件中的,进行抽象化

这里很明显的是在 engine 中传入了用户 id

然后获取到页面 reader 然后解析进行 goquery 遍历

获取歌曲 id

最后 fetcher 评论数据

关于网易云的其他逻辑知乎上一抓一大把的最难部分还是加密破解那一块,

现在仍然存在请求过多 ip 被封的情况

v2.0 文件夹中直接运行 main.go 就能看到测试获取数据情况,如果需要存入数据库则需要在 receivecomment 函数中进行处理

参考简书部分
Github