A站(ACFun)爬蟲爬取並播放、下載視頻(JAVA)


  本文使用的工具有vlc+ffmpeg+phantomjs

 

  一般視頻網站的視頻地址暴露的方式有兩種:

1、html直接暴露

2、通過ajax異步返回。

  A站使用的方式是第二種。針對第一種方式,直接使用jsoup就可以解析出視頻地址,但是大部分網站都不會采取這種方式,而是選擇第二種。

  進入瀏覽器按下f12(這里我使用firefox)

  

 

 

   可以看到,傳輸的ts分片。這些分片是一塊塊小視頻,大概只有幾秒左右,但是這些視頻能夠拼接成一個完整的視頻地址。而這些視頻地址的地址其實被存放在一個m3u8的文件中,但通過瀏覽器沒辦法直接看到m3u8文件,因此這里使用phantomjs。

這是一款沒有界面的模擬瀏覽器,可以模擬瀏覽器獲取ajax請求,通過分析,可以看到返回結果中有m3u8文件。

 

 

 因此,我們可以拿到m3u8文件,然后使用vlc就可以進行播放,也可以使用ffmpeg將m3u8文件轉換成mp4文件。

   播放器效果如上。

 

  ffmpeg合並m3u8文件命令為

String exec = rootPath + "/ffmpeg.exe -i \"" + url + "\" -vcodec copy -acodec copy -absf aac_adtstoasc " + output;

 

  這兩款軟件我都是使用java代碼調用exe執行的。

 

  phantomjs核心代碼如下:

//phantomjs模擬請求    
public List<String> getVideoUrls(String url) {
        List<String> ans = new ArrayList<String>();
        System.out.println("==============================開始解析網頁==============================");
        try {
            Runtime rt = Runtime.getRuntime();
            String exec = rootPath + "/phantomjs.exe " + rootPath + "/code.js " + url;
            Process p = rt.exec(exec);
            InputStream is = p.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            StringBuffer sbf = new StringBuffer();
            String tmp = "";
            while ((tmp = br.readLine()) != null) {
                sbf.append(tmp);
            }
            String urls = sbf.substring(sbf.indexOf("cdnUrls"));
            urls = urls.substring(0,urls.indexOf("playUrls"));
            urls = urls.substring(urls.indexOf("[")+1,urls.lastIndexOf("]"));
            String[] paths = urls.split(",");
            for (String path : paths) {
                if(path.contains("url")){
                    ans.add(path.substring(path.indexOf(":")+2,path.length()-1));
                }
            }
            System.out.println("==============================結束解析網頁==============================");
            System.out.println("播放地址為:");
            for (String an : ans) {
                System.out.println(an);
            }
        }catch (Exception e){
            System.out.println("ERROR!"+e);
        }
        return ans;
    }

 這里,還需要配置一個js代碼

system = require('system')  
address = system.args[1];
var page = require('webpage').create();  
page.settings.userAgent= 'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR2.0.50727)';
var url = address;  
page.open(url, function (status) {  
    //Page is loaded!  
    if (status !== 'success') {  
        console.log('Unable to post!');  
    } else {  
            window.setTimeout(function () {
              page.render("test1.png"); 
              console.log(page.content);
              phantom.exit();
          }, 5000);   
    } 
  });   

 寫文章不容易,轉載請注明出處,git源碼:https://github.com/GethinWang/VideoCrawler ,覺得好給個star吧~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM