python爬取抖音個人主頁所有視頻


根據網上文章自己修改:

例子:茶海棠個人主頁:https://www.iesdouyin.com/share/user/3562042897739582?did=53298022046&iid=1566126643353143&sec_uid=MS4wLjABAAAA0NL6UPqIabTDseE8xmFLBQPQBfdIYAF2qyWT9M2N-SHwOr5Jo9D_0BJsYfSQnAVH&u_code=17jd75kj9&timestamp=1615034003&utm_source=copy&utm_campaign=client_share&utm_medium=android&share_app_name=douyin

在抖音,記錄美好生活! https://v.douyin.com/edDS6Sh/   抖音分享的連接

 

找到帶有uid的這個連接,多找幾個會有用戶的信息,接下來用的到

heder頭部的  Request URL: 跟  user-agent在下面的代碼中要用

 

 

requesturl : https://www.iesdouyin.com/web/api/v2/aweme/post/?sec_uid=MS4wLjABAAAA0NL6UPqIabTDseE8xmFLBQPQBfdIYAF2qyWT9M2N-SHwOr5Jo9D_0BJsYfSQnAVH&count=21&max_cursor=0&aid=1128&_signature=i0i00QAA6xrcf.yK-BO1jItItM&dytk=

仔細觀察這個requesturl你會發現,其中有個count字段,這個代表每次請求個數,還有個max_cursor字段代表着,當前第幾頁

進入這個連接后,如下圖,這個,max——cursor這個返回的字段值,就是下次需要請求url中要替換的值

判斷下一頁是否還有數據,則是根據 判斷這個 hasmore 是否為true,如果為真則還有隱藏的內容,如果要繼續顯示剩下的內容,方法就是替換掉max——cursort字段值

然后繼續請求這個url,直到hasmore為false

具體的aweme_list  視頻連接規則,請看上一篇,這里有18個說明當前電腦訪問這個主頁,只能看到18個,因為有抖音網頁限制

以下代碼使用只需要修改requesturl  跟user-agent 即可

 

import requests
import json
from urllib import parse
import re
# 抖音視頻的URL : Request URL: 
url="https://www.iesdouyin.com/web/api/v2/aweme/post/?sec_uid=MS4wLjABAAAA0NL6UPqIabTDseE8xmFLBQPQBfdIYAF2qyWT9M2N-SHwOr5Jo9D_0BJsYfSQnAVH&count=21&max_cursor=0&aid=1128&_signature=R6Ub1QAAJ-gQklOOeJfpTEelG8&dytk="

headers = {
    'User-Agent':"Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"
}
#調用requests中的get獲取抖音作者主頁的網頁鏈接
r = requests.get(url=url, headers=headers,stream=True)
#輸出訪問狀態,如為<200>即為訪問成功
print("初始訪問狀態:",r)
#使用json解析獲取的網頁內容
data_json = json.loads(r.text)
#使用json解析網頁后,data_json的內容為dict格式,我們可以通過以下方式查看健名
print(data_json.keys())

has_more = data_json['has_more']
max_cursor = data_json['max_cursor']

#接下來使用循環來解決我們之前所提到的“隱藏內容”問題
#判斷hasmore是否為true,如果為真則還有隱藏的內容,如果要繼續顯示剩下的內容
#name需要根據max_cursor 這個字段來進行分頁讀取
#url上次返回的結果中的max_cursor 就是下一次url需要替換的分頁數
while has_more == True:
    print('has_more:',has_more)
    url_parsed = parse.urlparse(url)#打散url連接
    bits = list(url_parsed) #將url連接區分開來
    # ['https', 'www.iesdouyin.com', '/web/api/v2/aweme/post/', '', 'sec_uid=MS4wLjABA
    # AAA0NL6UPqIabTDseE8xmFLBQPQBfdIYAF2qyWT9M2N-SHwOr5Jo9D_0BJsYfSQnAVH&count=21&max
    # _cursor=0&aid=1128&_signature=R6Ub1QAAJ-gQklOOeJfpTEelG8&dytk=', '']
    qs = parse.parse_qs(bits[4]) #選擇第四個元素
    # {'sec_uid': ['MS4wLjABAAAA0NL6UPqIabTDseE8xmFLBQPQBfdIYAF2qyWT9M2N-SHwOr5Jo9D_0B
    # JsYfSQnAVH'], 'count': ['21'], 'max_cursor': ['0'], 'aid': ['1128'], '_signature
    # ': ['R6Ub1QAAJ-gQklOOeJfpTEelG8']}
    qs['max_cursor'] = max_cursor #替換掉這個字段的值
    bits[4] = parse.urlencode(qs, True) #將替換的字段拼接起來,並且url拼接時不轉義
    url_new = parse.urlunparse(bits) #重新拼接整個url

    #只要hasmore是否為true,則反復訪問作者主頁鏈接,直到成功返回這個為false
    r = requests.get(url=url_new, headers=headers,stream=True)
    data_json = json.loads(r.text)
    has_more = data_json['has_more'] #重置hasmore直到返回為false則退出循環
    max_cursor = data_json['max_cursor']#每次重置這個頁數,繼續替換url中下一頁頁碼進行訪問
    # print('has_more22:',has_more)
    print('maxcursor22:',max_cursor)
    #print('url_new:',url_new)
    #print('has_more22:',len(data_json['aweme_list']))
    # for i in range(len(data_json['aweme_list'])):   
    #     print(data_json['aweme_list'][i]['video']['play_addr_lowbr']['url_list'][0])
# 我們要保存視頻文件的主要路徑
# 我們要保存視頻文件的主要路徑
    path = "/"
    for i in range(len(data_json['aweme_list'])):
        #url_1為我們獲取的視頻鏈接
        url_1 = data_json['aweme_list'][i]['video']['play_addr_lowbr']['url_list'][0]
        #t為我們獲取的視頻標題
        t = data_json['aweme_list'][i]['desc']
        # requests發送瀏覽器發送get請求,得到數據
        r = requests.get(url=url_1, headers=headers,stream=True)
        print(r)    #輸出r訪問狀態
        # 獲取數據的二進制長度
        reponse_body_lenth = int(r.headers.get("Content-Length"))
        # 打印數據的長度
        print("視頻的數據長度為:", reponse_body_lenth)
        #path_1為完整文件保存路徑
        path_1 = path+t+'.mp4'
        #去除文件名中特殊字符否則報錯
        rstr = r"[\/\\\:;\*#¥%$!@^……&()\?\"\<\>\|]"  # '/ \ : * ? " < > |'
        path_1 = re.sub(rstr, "", path_1)  # 替換為""
        # 保存抖音視頻mp4格式,二進制讀取
        with open(path_1, "wb") as xh:
            # 先定義初始進度為0
            write_all = 0
            for chunk in r.iter_content(chunk_size=1000000):
                write_all += xh.write(chunk)
                # 打印下載進度
                print("下載進度:%02.6f%%" % (100 * write_all / reponse_body_lenth))

 


免責聲明!

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



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