down_bang.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gocolly/colly"
  5. "github.com/tidwall/gjson"
  6. "io"
  7. "io/ioutil"
  8. "log"
  9. "net/http"
  10. "os"
  11. "path/filepath"
  12. "sync"
  13. "time"
  14. )
  15. var (
  16. downloadDestFolder = "D:\\music"
  17. w sync.WaitGroup
  18. )
  19. func main() {
  20. url := "http://www.kuwo.cn/bang/index"
  21. c := colly.NewCollector()
  22. c.OnHTML(".leftNav", func(element *colly.HTMLElement) {
  23. element.ForEach("div.classify.bang > ul > li", func(i int, e *colly.HTMLElement) {
  24. name := e.Attr("data-name")
  25. bangid := e.Attr("data-bangid")
  26. parseBangdan(name, bangid)
  27. })
  28. })
  29. c.Visit(url)
  30. }
  31. func parseBangdan(BangName string, bangId string) {
  32. fmt.Println("正在解析:", BangName, "……")
  33. url := fmt.Sprintf("http://www.kuwo.cn/bang/content?name=%s&bangId=%s", BangName, bangId)
  34. c := colly.NewCollector()
  35. c.OnHTML(".tools", func(element *colly.HTMLElement) {
  36. json := element.Attr("data-music")
  37. musicId := gjson.Get(json, "id")
  38. musicName := gjson.Get(json, "name")
  39. //artist := gjson.Get(json, "artist")
  40. //fmt.Println(json)
  41. client := http.Client{Timeout: 900 * time.Second}
  42. url := fmt.Sprintf("http://antiserver.kuwo.cn/anti.s?format=mp3&type=convert_url&rid=%s&response=url", musicId)
  43. resp, _ := client.Get(url)
  44. body, _ := ioutil.ReadAll(resp.Body)
  45. resp.Body.Close()
  46. w.Add(1)
  47. go downloadGedan(string(body), BangName, fmt.Sprintf("%s.mp3", musicName))
  48. //time.Sleep(time.Duration(200)*time.Millisecond)
  49. })
  50. c.Visit(url)
  51. w.Wait()
  52. }
  53. func downloadGedan(url string, BangName string, filename string) {
  54. defer w.Done()
  55. nt := time.Now().Format("2006-01-02 15:04:05")
  56. _ = os.MkdirAll(downloadDestFolder+string(filepath.Separator)+BangName, 0777)
  57. fpath := downloadDestFolder + string(filepath.Separator) + BangName + string(filepath.Separator) + filename
  58. if PathExists(fpath) {
  59. fmt.Printf("[%s]已下载完成,跳过 %s\n", nt, filename)
  60. return
  61. } else {
  62. os.Remove(fpath + ".tmp")
  63. }
  64. fmt.Printf("[%s]正在下载 %s\n", nt, filename)
  65. newFile, err := os.Create(fpath + ".tmp")
  66. if err != nil {
  67. fmt.Println(err.Error())
  68. }
  69. client := http.Client{Timeout: 900 * time.Second}
  70. resp, err := client.Get(url)
  71. defer resp.Body.Close()
  72. _, err = io.Copy(newFile, resp.Body)
  73. if err != nil {
  74. fmt.Println(err.Error())
  75. }
  76. newFile.Close()
  77. err = os.Rename(fpath+".tmp", fpath)
  78. if err != nil {
  79. fmt.Println(err)
  80. //panic(err)
  81. }
  82. log.Println("下载完成:", filename)
  83. }
  84. func PathExists(path string) bool {
  85. _, err := os.Stat(path)
  86. if err == nil {
  87. return true
  88. }
  89. if os.IsNotExist(err) {
  90. return false
  91. }
  92. return false
  93. }