Scala网络爬虫实战:抓取QQ音乐的音频资源
warning:
这篇文章距离上次修改已过190天,其中的内容可能已经有所变动。
import org.jsoup.Jsoup
import scala.collection.mutable.ListBuffer
import scala.sys.process._
import java.net.URL
object QQMusicSpider extends App {
// 音乐列表页URL
val listUrl = "https://y.qq.com/portal/search_list.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=%E5%85%A8%E9%83%A8"
// 使用Jsoup解析页面
val doc = Jsoup.connect(listUrl).get()
// 查找包含音乐信息的iframe
val iframeUrl = doc.select("iframe").attr("src")
// 解析音乐信息页面
val iframeDoc = Jsoup.connect(iframeUrl).get()
// 查找所有的音乐信息
val musics = iframeDoc.select(".song_name").select("a")
val musicList = new ListBuffer[String]()
musics.foreach { music =>
val musicUrl = "https://y.qq.com" + music.attr("href")
val musicId = musicUrl.split("=")(1)
val songMidUrl = s"https://i.y.qq.com/v8/playsong443/fcgi-bin/fcg_play_single_song.fcg?songmid=$musicId&g_tk=5381"
val songMidJson = Jsoup.connect(songMidUrl).ignoreContentType(true).execute().body().trim.substring(9)
val songMidMap = songMidJson.split("&").map { pair =>
val keyAndValue = pair.split("=")
(keyAndValue(0), keyAndValue(1))
}.toMap
val songName = music.text()
val songUrl = s"https://dl.stream.qqmusic.qq.com/${songMidMap("filename")}.m4a?vkey=${songMidMap("vl")}&guid=7840245912&uin=0&fromtag=66"
// 添加音乐链接到列表
musicList += songUrl
println(s"找到音乐:$songName, 正在下载...")
// 下载音乐
new URL(songUrl) #> s"$songName.m4a" !!
}
println("所有音乐下载完毕!")
}
这段代码使用了Jsoup来解析HTML页面,并找到了包含音乐信息的iframe。然后它解析了iframe中的内容,提取出每一首歌的名字和对应的音乐ID。接着,它请求QQ音乐服务器,获取了用于音乐播放的其他信息,最终构建出每首歌的音乐文件的URL。最后,它遍历所有的音乐链接,下载每一首歌。这个过程展示了如何使用Scala进行网络爬虫,并处理简单的动态内容。
评论已关闭