實作概念
- 從專輯頁面 URL 解析出專輯 ID。
- 呼叫優酷播放列表 API (
https://v.youku.com/v_playlist/f{專輯ID}o{排序}p{頁碼}.html) 逐頁抓取。
- 以 Regular Expression 從 HTML 擷取
videoId、videoId2、標題。
- 若連續兩頁
videoId 相同則結束迴圈。
核心代碼 (VB.NET)
Imports System.Net, System.IO, System.Text, System.Text.RegularExpressions
Public Class frmMain
Structure VInfo
Public Id As Integer
Public Title As String
Public Vid1 As String
Public Vid2 As String
Public Overrides Function ToString() As String
Return String.Format("{0}:<{1}> [{2}]", Id, Title, Vid1)
End Function
End Structure
Private myList As New List(Of VInfo)()
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim listUrl = TextBox1.Text ' 例: https://www.youku.com/playlist_show/id_2350764.html
Dim m = Regex.Match(listUrl, "playlist_show/id_(\d+).*\.html")
If Not m.Success Then MessageBox.Show("專輯 ID 擷取失敗") : Exit Sub
Dim albumId = m.Groups(1).Value
Dim pageUrl = "https://v.youku.com/v_playlist/f" & albumId & "o{1}p{0}.html"
Dim preVid = ""
Dim idx = 0
Do
Dim url = String.Format(pageUrl, idx, "0") ' 倒序
Dim req = HttpWebRequest.Create(url)
Using resp = req.GetResponse()
Using sr = New StreamReader(resp.GetResponseStream(), Encoding.GetEncoding(resp.CharacterSet))
Dim html = sr.ReadToEnd()
' 取 videoId
Dim mVid = Regex.Match(html, "var\s+videoId\s*=\s*""(\d+)""\s*;")
If Not mVid.Success Then Exit Do
Dim vid1 = mVid.Groups(1).Value
If vid1 = preVid Then Exit Do
' 取 videoId2
Dim mVid2 = Regex.Match(html, "var\s+videoId2\s*=\s*""((\w|=)+)""\s*;")
If Not mVid2.Success Then Exit Do
Dim vid2 = mVid2.Groups(1).Value
' 取標題
Dim mTitle = Regex.Match(html, "<title>(.+) - (.+) - 視頻 - 優酷視頻 - 在線觀看 - </title>")
Dim title = If(mTitle.Success, mTitle.Groups(2).Value, "{名稱查找錯誤}")
myList.Add(New VInfo With {.Id = idx, .Title = title, .Vid1 = vid1, .Vid2 = vid2})
preVid = vid1
idx += 1
Me.Text = idx & " : 處理完成!"
End Using
End Using
Loop
MessageBox.Show(idx & " 個視頻採集完成")
Button2_Click(Nothing, Nothing)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
ListBox1.Items.Clear()
For Each v In myList : ListBox1.Items.Add(v.ToString()) : Next
myList.Clear()
End Sub
End Class
效能與限制
- 單頁解析 0.5~2 秒,不適合大量採集。
- 優酷網頁結構變動會導致正則失效,需維護。
- 建議改用官方 API 或 Headless Browser 以提升穩定度。