「docker實戰(zhàn)篇」python的docker- 抖音視頻抓取(中)(25)

原創(chuàng)文章欠雌,歡迎轉(zhuǎn)載蹄梢。轉(zhuǎn)載請注明:轉(zhuǎn)載自IT人故事會,謝謝富俄!
原文鏈接地址:「docker實戰(zhàn)篇」python的docker- 抖音視頻抓冉础(中)(25)

本次主要針對python對上次抖音分享的頁面中的_signature進(jìn)行解析并完成抖音視頻的下載。源碼:https://github.com/limingios/dockerpython.git (源碼/「「docker實戰(zhàn)篇」python的docker- 抖音視頻抓然舯取(下)(24))
https://github.com/limingios/dockerpython.git (谷歌插件)

找到方法幕袱,完成本地的html的生成

其實就是復(fù)制出來分享頁面的函數(shù),然后通過函數(shù)悠瞬,調(diào)用的方式完成_signature的生成们豌。

html_foot.txt

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
</body>
</html>
<script type="text/javascript">

html_foot.txt

!function(t) {
    if (t.__M = t.__M || {},
    !t.__M.require) {
        var e, n, r = document.getElementsByTagName("head")[0], i = {}, o = {}, a = {}, u = {}, c = {}, s = {}, l = function(t, n) {
            if (!(t in u)) {
                u[t] = !0;
                var i = document.createElement("script");
                if (n) {
                    var o = setTimeout(n, e.timeout);
                    i.onerror = function() {
                        clearTimeout(o),
                        n()
                    }
                    ;
                    var a = function() {
                        clearTimeout(o)
                    };
                    "onload"in i ? i.onload = a : i.onreadystatechange = function() {
                        ("loaded" === this.readyState || "complete" === this.readyState) && a()
                    }
                }
                return i.type = "text/javascript",
                i.src = t,
                r.appendChild(i),
                i
            }
        }, f = function(t, e, n) {
            var r = i[t] || (i[t] = []);
            r.push(e);
            var o, a = c[t] || c[t + ".js"] || {}, u = a.pkg;
            o = u ? s[u].url || s[u].uri : a.url || a.uri || t,
            l(o, n && function() {
                n(t)
            }
            )
        };
        n = function(t, e) {
            "function" != typeof e && (e = arguments[2]),
            t = t.replace(/\.js$/i, ""),
            o[t] = e;
            var n = i[t];
            if (n) {
                for (var r = 0, a = n.length; a > r; r++)
                    n[r]();
                delete i[t]
            }
        }
        ,
        e = function(t) {
            if (t && t.splice)
                return e.async.apply(this, arguments);
            t = e.alias(t);
            var n = a[t];
            if (n)
                return n.exports;
            var r = o[t];
            if (!r)
                throw "[ModJS] Cannot find module `" + t + "`";
            n = a[t] = {
                exports: {}
            };
            var i = "function" == typeof r ? r.apply(n, [e, n.exports, n]) : r;
            return i && (n.exports = i),
            n.exports && !n.exports["default"] && Object.defineProperty && Object.isExtensible(n.exports) && Object.defineProperty(n.exports, "default", {
                value: n.exports
            }),
            n.exports
        }
        ,
        e.async = function(n, r, i) {
            function a(t) {
                for (var n, r = 0, h = t.length; h > r; r++) {
                    var p = e.alias(t[r]);
                    p in o ? (n = c[p] || c[p + ".js"],
                    n && "deps"in n && a(n.deps)) : p in s || (s[p] = !0,
                    l++,
                    f(p, u, i),
                    n = c[p] || c[p + ".js"],
                    n && "deps"in n && a(n.deps))
                }
            }
            function u() {
                if (0 === l--) {
                    for (var i = [], o = 0, a = n.length; a > o; o++)
                        i[o] = e(n[o]);
                    r && r.apply(t, i)
                }
            }
            "string" == typeof n && (n = [n]);
            var s = {}
              , l = 0;
            a(n),
            u()
        }
        ,
        e.resourceMap = function(t) {
            var e, n;
            n = t.res;
            for (e in n)
                n.hasOwnProperty(e) && (c[e] = n[e]);
            n = t.pkg;
            for (e in n)
                n.hasOwnProperty(e) && (s[e] = n[e])
        }
        ,
        e.loadJs = function(t) {
            l(t)
        }
        ,
        e.loadCss = function(t) {
            if (t.content) {
                var e = document.createElement("style");
                e.type = "text/css",
                e.styleSheet ? e.styleSheet.cssText = t.content : e.innerHTML = t.content,
                r.appendChild(e)
            } else if (t.url) {
                var n = document.createElement("link");
                n.href = t.url,
                n.rel = "stylesheet",
                n.type = "text/css",
                r.appendChild(n)
            }
        }
        ,
        e.alias = function(t) {
            return t.replace(/\.js$/i, "")
        }
        ,
        e.timeout = 5e3,
        t.__M.define = n,
        t.__M.require = e
    }
}(this)


__M.define("douyin_falcon:node_modules/byted-acrawler/dist/runtime", function(l, e) {
    Function(function(l) {
        return '?e(e,a,r){?(b[e]||(b[e]=t("x,y","?x "+e+" y"?)(r,a)}?a(e,a,r){?(k[r]||(k[r]=t("x,y","?new x[y]("+Array(r+1).join(",x[?y]")?(1)+")"?)(e,a)}?r(e,a,r){?n,t,s={},b=s.d=r?r.d+1:0;for(s["$"+b]=s,t=0;t<b;t?)s[n="$"+t]=r[n];for(t=0,b=s?=a?;t<b;t?)s[t]=a[t];?c(e,0,s)}?c(t,b,k){?u(e){v[x?]=e}?f?{?g=?,t?ing(b?g)}?l?{try{y=c(t,b,k)}catch(e){h=e,y=l}}for(?h,y,d,g,v=[],x=0;;)switch(g=?){case 1:u(!?)?4:?f??5:u(?(e){?a=0,r=e?;???{?c=a<r;?c&&u(e[a?]),c}}(???6:y=?,u(?(y??8:if(g=?,l??g,g=?,y===c)b+=g;else if(y!==l)?y?9:?c?10:u(s(???11:y=?,u(?+y)?12:for(y=f?,d=[],g=0;g<y?;g?)d[g]=y.charCodeAt(g)^g+y?;u(String.fromCharCode.apply(null,d??13:y=?,h=delete ?[y]?14:???59:u((g=?)?(y=x,v.slice(x-=g,y?:[])?61:u(?[?])?62:g=?,k[0]=65599*k[0]+k[1].charCodeAt(g)>>>0?65:h=?,y=?,?[y]=h?66:u(e(t[b?],?,???67:y=?,d=?,u((g=?).x===c?r(g.y,y,k):g.apply(d,y??68:u(e((g=t[b?])<"<"?(b--,f?):g+g,?,???70:u(!1)?71:?n?72:?+f??73:u(parseInt(f?,36??75:if(?){b??case 74:g=?<<16>>16?g?76:u(k[?])?77:y=?,u(?[y])?78:g=?,u(a(v,x-=g+1,g??79:g=?,u(k["$"+g])?81:h=?,?[f?]=h?82:u(?[f?])?83:h=?,k[?]=h?84:?!0?85:?void 0?86:u(v[x-1])?88:h=?,y=?,?h,?y?89:u(??{?e?{?r(e.y,arguments,k)}?e.y=f?,e.x=c,e}?)?90:?null?91:?h?93:h=??0:??;default:u((g<<16>>16)-16)}}?n=this,t=n.Function,s=Object.keys||?(e){?a={},r=0;for(?c in e)a[r?]=c;?a?=r,a},b={},k={};?r'.replace(/[?-?]/g, function(e) {
            return l[15 & e.charCodeAt(0)]
        })
    }("v[x++]=?v[--x]?t.charCodeAt(b++)-32?function ?return ?))?++?.substr?var ?.length?()?,b+=?;break;case ?;break}".split("?")))()('gr$Daten Иb/s!l y?y?g,(lfi~ah`{mv,-n|jqewVxp{rvmmx,&eff?kx[!cs"l".Pq%widthl"@q&heightl"vr*getContextx$"2d[!cs#l#,*;?|u.|uc{uq$fontl#vr(fillTextx$$龘???2<[#c}l#2q*shadowBlurl#1q-shadowOffsetXl#$$limeq+shadowColorl#vr#arcx88802[%c}l#vr&strokex[ c}l"v,)}eOmyoZB]mx[ cs!0s$l$Pb<k7l l!r&lengthb%^l$1+s$j?l  s#i$1ek1s$gr#tack4)zgr#tac$! +0o![#cj?o ]!l$b%s"o ]!l"l$b*b^0d#>>>s!0s%yA0s"l"l!r&lengthb<k+l"^l"1+s"j?l  s&l&z0l!$ +["cs\'(0l#i\'1ps9wxb&s() &{s)/s(gr&Stringr,fromCharCodes)0s*yWl ._b&s o!])l l Jb<k$.aj;l .Tb<k$.gj/l .^b<k&i"-4j!?+& s+yPo!]+s!l!l Hd>&l!l Bd>&+l!l <d>&+l!l 6d>&+l!l &+ s,y=o!o!]/q"13o!l q"10o!],l 2d>& s.{s-yMo!o!]0q"13o!]*Ld<l 4d#>>>b|s!o!l q"10o!],l!& s/yIo!o!].q"13o!],o!]*Jd<l 6d#>>>b|&o!]+l &+ s0l-l!&l-l!i\'1z141z4b/@d<l"b|&+l-l(l!b^&+l-l&zl\'g,)gk}ejo{?cm,)|yn~Lij~em["cl$b%@d<l&zl\'l $ +["cl$b%b|&+l-l%8d<@b|l!b^&+ q$sign ', [Object.defineProperty(e, "__esModule", {
        value: !0
    })])
});

dycs = __M.require("douyin_falcon:node_modules/byted-acrawler/dist/runtime")

signc = dycs.sign(&&&&)

document.title = signc
document.write(signc)

</script>

handle_douyin_movie.py 下載代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/2/20 17:39
# @Author  : Aries
# @Site    : 
# @File    : handle_douyin_movie.py.py
# @Software: PyCharm
import json
import os

import requests
import re
import time

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

#分享ID
share_id = "89923219116"
share_url = "https://www.douyin.com/share/user/"+share_id


header = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36"
}

#dytk 和tac的正則表達(dá)式
dytk_search = re.compile(r"dytk: '(.*?)'")
tac_search = re.compile(r"<script>tac=(.*?)</script>")
response = requests.get(url=share_url,headers=header)


#處理獲取dytk 和tac
dytk = re.search(dytk_search,response.text).group(1)
tac = re.search(tac_search,response.text).group(1)


#tac封裝成為js的格式
tac = "var tac="+tac+";"


# html頁面的編寫合成 header + tac+ foot
with open("html_head.txt") as f1:
    f1_read = f1.read()

with open("html_foot.txt") as f2:
    f2_read = f2.read().replace("&&&&","89923219116")


with open("test.html","w") as f_w:
    f_w.write(f1_read+"\n"+tac+"\n"+f2_read)


# signature = input("秘鑰為:")

chrome_options = Options()
chrome_options.add_argument("--headless")
abspath = os.path.abspath(r"D:\Program Files\chromedriver\chromedriver.exe")
douyin_driver = webdriver.Chrome(executable_path=abspath,chrome_options=chrome_options,)
douyin_driver.get("file:///E:\\dockerpython\\python\\douyin\\test.html")
signature = douyin_driver.title
douyin_driver.quit()
movie_url = "https://www.douyin.com/aweme/v1/aweme/post/?user_id="+share_id+"&count=21&max_cursor=0&aid=1128&_signature="+signature+"&dytk="+dytk

#接口不太穩(wěn)定涯捻,所以要使用while循環(huán)一直調(diào)用
while True:
    movie_reponse = requests.get(url=movie_url,headers=header)
    if json.loads(movie_reponse.text)["aweme_list"] == []:
        #time.sleep(1)
        continue
    else:
        print(movie_reponse.text)
        for item in json.loads(movie_reponse.text)["aweme_list"]:
            video_url = item["video"]["play_addr"]["url_list"][0]
            video_response = requests.get(url=video_url,headers=header)
            with open("douyin.mp4","wb") as v:
                #不能使用video_response.text,必須使用content才可以把內(nèi)容寫進(jìn)去
                v.write(video_response.content)
                break

最終結(jié)果

里面關(guān)于chromedriver的配置直接引入他的路徑最穩(wěn)了望迎,我比較喜歡這種方式網(wǎng)上很多搞環(huán)境變量的導(dǎo)致電腦很慢不建議障癌。

PS:基本上抖音視頻下載的都已經(jīng)完成了,下次對于需要注意的做下總結(jié)擂煞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市趴乡,隨后出現(xiàn)的幾起案子对省,更是在濱河造成了極大的恐慌,老刑警劉巖晾捏,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒿涎,死亡現(xiàn)場離奇詭異,居然都是意外死亡惦辛,警方通過查閱死者的電腦和手機(jī)劳秋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胖齐,“玉大人玻淑,你說我怎么就攤上這事⊙交铮” “怎么了补履?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長剿另。 經(jīng)常有香客問我箫锤,道長,這世上最難降的妖魔是什么雨女? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任谚攒,我火速辦了婚禮,結(jié)果婚禮上氛堕,老公的妹妹穿的比我還像新娘馏臭。我一直安慰自己,他們只是感情好讼稚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布位喂。 她就那樣靜靜地躺著,像睡著了一般乱灵。 火紅的嫁衣襯著肌膚如雪塑崖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天痛倚,我揣著相機(jī)與錄音规婆,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛抒蚜,可吹牛的內(nèi)容都是我干的掘鄙。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼嗡髓,長吁一口氣:“原來是場噩夢啊……” “哼操漠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饿这,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤浊伙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后长捧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嚣鄙,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年串结,在試婚紗的時候發(fā)現(xiàn)自己被綠了哑子。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡肌割,死狀恐怖卧蜓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情把敞,我是刑警寧澤烦却,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站先巴,受9級特大地震影響其爵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伸蚯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一摩渺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剂邮,春花似錦摇幻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至引瀑,卻和暖如春狂芋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背憨栽。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工帜矾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翼虫,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓屡萤,卻偏偏與公主長得像珍剑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子死陆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 原創(chuàng)文章招拙,歡迎轉(zhuǎn)載。轉(zhuǎn)載請注明:轉(zhuǎn)載自IT人故事會措译,謝謝别凤!原文鏈接地址:「docker實戰(zhàn)篇」python的doc...
    IT人故事會閱讀 1,072評論 1 3
  • 1-早上學(xué)習(xí)了番茄工作法的線上免費(fèi)課程:總體體會是這是一個簡單而高效的工具闻妓。有三步菌羽,1-從簡單的專注時間開始掠械,可以...
    藍(lán)心百合閱讀 252評論 1 1
  • 冬夜書懷 漫步云端 獨(dú)倚床頭夢難成,空堂三更思富平注祖。 寒風(fēng)凄凄高樓掩猾蒂,燈下煢煢影無聲。 除夕臨近情更切是晨,家人團(tuán)聚...
    漫步云端_9fcc閱讀 155評論 0 1
  • 不知不覺肚菠,已經(jīng)到了秋天,大棗也熟了罩缴,于是我們都去摘棗丶撿棗蚊逢,幾個爺爺也挎上了籃子去撿棗,他們撿到了很多個棗...
    在水一方_7228閱讀 498評論 0 0
  • Dancing On The Clouds 等黑暗的天幕掩住視線 等光明在空間失去焦點(diǎn) 等我在夜里看不清你臉頰 等...
    夜落y閱讀 594評論 1 6