美拍視頻采集之視頻地址解析下載

以此URl舉個例子http://www.meipai.com/media/816057957

  • 頁面分析
    通過分析美拍播放頁面的源代碼,可以看到,播放頁面的html代碼中的有一個mate標簽(property屬性值為og:video:url),該值就是頁面的視頻鏈接,只不過是經過加密后的
  • 使用Java語言來自動獲取美拍真實加密過的url地址,Crawl類
// 根據url請求html頁面
public static String clawer2(String myurl) throws Exception{
        URL urlmy = new URL(myurl);
        HttpURLConnection con = (HttpURLConnection) urlmy.openConnection();
        con.setFollowRedirects(true);
        con.setInstanceFollowRedirects(false);
        con.connect();
        BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(),"UTF-8"));
        String s = "";
        StringBuffer sb = new StringBuffer("");
        while ((s = br.readLine()) != null) {
            sb.append(s+"\r\n");
        }
        return sb.toString();
    }
// 通過Jsoup包來解析html頁面
public static String parsehtml(String url) throws Exception {
        String htmlContent = Crawl.clawer2(url);
        //使用jSoup解析里頭的內容
        //就像操作html doc文檔對象一樣操作網頁中的元素
        Document doc = Jsoup.parse(htmlContent);
        Element span = doc.select("head > meta:nth-child(16)").first();
        System.out.println(span.attr("content"));
        return span.attr("content");// 獲取加密后的視頻url地址
    }
  • 解密加密字符串,解密后即可得到視頻真實URL地址
/**
 * 解密加密過的字符串
 * Created by lihan on 2017/7/29.
 */
public class ParseUrl {
    private Map<String, String> dict1;
    private Map<String, String[]> dict2;
    
    // 獲得16進制數,該數用來分割字符串
    public Map<String,String> getHex(String param1){
        dict1 = new HashMap<String, String>();
        String cstr =  param1.substring(4);//str
        String[] splitStr = param1.substring(0,4).split("");
        String hex = "";
        for (int i=3; i >= 0; i--){
            hex = hex + splitStr[i];
        }
        dict1.put("str", cstr);
        dict1.put("hex", hex);
        return dict1;
    }
    // 獲取正確的字符串,解析16進制數
    public Map<String, String[]> getDecimal(String param1){
        dict2 = new HashMap<String, String[]>();
        // loc2是用來分割字符串的索引標識,轉換16進制
        String loc2 = String.valueOf(Integer.parseInt(param1,16));
        String[] pre = loc2.substring(0,2).split("");//dict1.put("loc2", loc2.substring(0,2));
        String[] tail = loc2.substring(2).split("");
        dict2.put("pre", pre);
        dict2.put("tail", tail);
        return dict2;
    }
    // 分割字符串
    public String substr(String param1, String[] param2) {
        String loc3 = param1.substring(0, Integer.parseInt(param2[0]));//param2 = pu.getDec(pa2).get("pre")
        String loc4 = param1.substring(Integer.parseInt(param2[0]), Integer.parseInt(param2[0])+Integer.parseInt(param2[1]));
        return loc3 + param1.substring(Integer.parseInt(param2[0])).replace(loc4, "");
    }
    // 獲取分割的位置
    public String[] getPosition(String param1, String[] param2){
        param2[0] = String.valueOf(param1.length() - Integer.parseInt(param2[0]) - Integer.parseInt(param2[1]));
        return param2;
    }

    // 程序入口
    public static void main(String[] args) throws Exception {
        ParseUrl pu = new ParseUrl();
        // 獲取html中的加密字符串
        String code = Crawl.parsehtml("http://www.meipai.com/media/816057957");
        Map<String, String> dict2 = pu.getHex(code);
        Map<String,String[]> dict3 = pu.getDecimal(dict2.get("hex"));
        String str4 = pu.substr(dict2.get("str"), dict3.get("pre"));
        BASE64Decoder base64 = new BASE64Decoder();
        byte[] url = base64.decodeBuffer(pu.substr(str4, pu.getPosition(str4, dict3.get("tail"))));
        // 視頻真實的url地址
        System.out.println(new String(url));
    }
}
  • 運行后即可得到真實的視頻url
  • python版本可以參考:

需要安裝requests庫,安裝命令:
pip install requests

# coding=utf-8
# Created by lihan on 2017/7/29.
import base64
import requests
from pyquery import PyQuery as pq

class Decode:
    def getHex(self,param1):
        return {
            'str': param1[4:],
            'hex': ''.join(list(param1[:4])[::-1]),
        }

    def getDecimal(self, param1):
        loc2 = str(int(param1, 16))
        print(loc2)#
        return {
            'pre': list(loc2[:2]),
            'tail': list(loc2[2:]),
        }

    def substr(self, param1, param2):
        loc3 = param1[0: int(param2[0])]
        loc4 = param1[int(param2[0]): int(param2[0]) + int(param2[1])]
        print("loc4",loc4)
        return loc3 + param1[int(param2[0]):].replace(loc4, "")

    def getPosition(self,param1, param2):
        param2[0] = len(param1) - int(param2[0]) - int(param2[1])
        return param2

    def decode(self, code):
        dict2 = self.getHex(code)
        dict3 = self.getDecimal(dict2['hex'])
        print("dict3", dict3['pre'])  #
        str4 = self.substr(dict2['str'], dict3['pre'])
        return base64.b64decode(self.substr(str4, self.getPosition(str4, dict3['tail'])))

    def crawl_video_url(self, url):
        response = requests.get(url).content
        d = pq(response)
        code= d('meta[property="og:video:url"]').attr('content')
        result = self.decode(code)
        print(result)


if __name__ == '__main__':
    url = "http://www.meipai.com/media/816057957"http://任意播放頁面的url
    Decode().crawl_video_url(url)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容