Java實用爬蟲:程序員的TokyoHot正確姿勢

探索異國文化

這幾天閒來無事欣賞外國文化的時候,突發一個奇想,如果能用程序自動幫我搜集資源,那豈不是美滋滋?
而且像一般的網站反扒的技術不一定很高,話不多少,F12看看這個網頁是什麼結構

在視頻空間的這裏,我們找到了這樣一行代碼:

video=http://*******/20170713/eo2lSVtk/hls/index.m3u8

訪問該路徑之後呢,發現下載下來的是一個後綴.m3u8的文件,打開之後全是這種東西:

#EXTINF:8.174833,
SmOBSsZo8089001.ts
#EXTINF:14.748067,
SmOBSsZo8089002.ts
#EXTINF:3.903900,
SmOBSsZo8089003.ts
#EXTINF:10.643967,
SmOBSsZo8089004.ts
#EXTINF:12.412400,
SmOBSsZo8089005.ts

百度了以後呢發現原來這種文件雖然不是視頻文件,但是是視頻文件的一個索引,每一個AV,不不不,每一個視頻都被分成好幾個小段,這個文件就是記錄每個小段地址的東東!!
原來這就是傳說中的番號!!
但是網上的文件能直接看到對應的鏈接地址,但是我這裏爲什麼看不到呢

立馬繼續F12,看一下我點開視頻的時候發出了那些請求
請求

臥槽!!!那個.ts結尾的不就是我下載下來文件裏面對應的序號嗎

這時候我恍然大悟,這個網站通過解析.m3u8文件裏面的配置,不斷的加載每一小段視頻,就能連續的播放完整的視頻了。

這麼說…我解析了文件之後,一直模擬發送請求給這個地址豈不是…..
話不多說,開搞

研究異國文化

解析.m3u8文件

這裏解析這個文件比較簡單,我的思路是從文件中每一行讀取數據,如果不包含字符#代表是有效的地址,把他存到list中

public static List<String> read(String filePath){

        List<String> lists = new ArrayList<String>(); 

        try{
            File file = new File(filePath);
            if(file.isFile() && file.exists()){
                InputStreamReader read = new InputStreamReader(new FileInputStream(file));
                BufferedReader bufferedReader = new BufferedReader(read);
                String lineText = null;
                while((lineText = bufferedReader.readLine()) != null){
                    if(!lineText.contains("#")){
                        lists.add(lineText);
                        System.out.println(lineText);
                    }
                }
            read.close();
        }else{
            System.out.println("找不到指定文件");
        }
        }catch (Exception e) {
            System.out.println("讀取出錯");
            e.printStackTrace();    
        }

        return lists;
    }

下載

拿到每個片段的索引之後,只需要鏈接一下視頻的地址,就可以通過URL的方式進行下載了,這裏主要使用Java的流文件

public static void download(List<String> lists) {
        try{


        String url = "";
        InputStream inputStream;


        for(int i=0 ;i<lists.size(); i++){
            url = "*****" + lists.get(i);
            URL net = new URL(url);

            File saveDir = new File("****");
            if(!saveDir.exists()){
                saveDir.mkdirs();
            }

            InputStream in = net.openStream();
            FileOutputStream fo = new FileOutputStream(new File("****"+ lists.get(i)));  

            byte[] buf = new byte[1024];  
            int length = 0;  
            System.out.println("開始下載:" + url);  
            while ((length = in.read(buf, 0, buf.length)) != -1) {  
                fo.write(buf, 0, length);  
            }  
            in.close();  
            fo.close();  
            System.out.println("下載完成"); 
        }
        }catch (Exception e) {
        System.out.println("下載失敗");
        e.printStackTrace();
        }

        System.out.println("全部任務下載完成");
    }

實戰

然後輕輕點擊你的鼠標,然後你會發現控制檯打出一堆字母
這裏寫圖片描述

打開設置好的路徑,你會發現有幾百個是有十幾秒的視頻,都是.ts結尾
但是一個電影被分成幾百個片段,自然是不爽,有什麼辦法能讓他們合併成一個呢
請看下文

整理異國文化

這裏就要藉助命令行工具了:使用copy命令
win+R打開命令行工具,使用

copy /b  F:\f\*.ts  E:\f\new.ts”

這段代碼意思是把前面一個路徑中的以.ts結尾的複製到新的路徑的new.ts中,這樣就合併成一個了
這裏要注意的是原來的.ts文件命名要有規律,因爲我們是從服務器上直接扒下來的,所以順序是遞增的
這裏寫圖片描述

然後在指定的輸出目錄就可以看到完整的視頻啦!
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章