首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

VB.NET 爬取優酷專輯所有影片資訊

     編輯:ASP.NET 基礎

實作概念

  1. 從專輯頁面 URL 解析出專輯 ID。
  2. 呼叫優酷播放列表 API (https://v.youku.com/v_playlist/f{專輯ID}o{排序}p{頁碼}.html) 逐頁抓取。
  3. 以 Regular Expression 從 HTML 擷取 videoId、videoId2、標題。
  4. 若連續兩頁 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 以提升穩定度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved