- 注重版權,轉載請注明原作者和原文鏈接
- 作者:向往同學
目錄
最近無事練手的爬蟲項目(老活新整),希望各位大佬給出意見,謝謝。
一、視頻分析
二、圖集分析
三、完整代碼
四、總結
最近無事練手的爬蟲項目(老活新整),希望各位大佬給出意見,謝謝。
一、視頻分析
? ? ? ? 1、首先獲取手機端的視頻分享鏈接:7.99 y@t.RK 03/27 TlC:/ ?復制打開抖音,看看【生活隨拍 可能有關】被你艾特的人 這個冬天要陪你一起去看雪. ?https://v.douyin.com/idbkmge8/
? ? ? ? 2、在瀏覽器打開后面的鏈接:https://v.douyin.com/idbkmge8/,然后F12打開控制臺,左上角箭頭圖標選中視頻區(qū)域,跳轉到視頻區(qū)域的代碼找到video簽,里面有三個src視頻鏈接(都能跳轉到無水印的原視頻)
? ? ? ? 3、我們分析第三個src鏈接:www.douyin.com/aweme/v1/play/?video_id=v0200fg10000ckk161rc77ua9mpnl2i0&line=0&file_id=0ba9741f8a0f4c50a82d8cc39404c8b9&sign=3aed81ae44d4d276fb74da974de2e950&is_play_url=1&source=PackSourceEnum_AWEME_DETAIL&aid=6383
? ? ? ? 鏈接很長我們試著刪除video_id=v0200fg10000ckk161rc77ua9mpnl2i0以后的所有參數(shù)得到新鏈接:www.douyin.com/aweme/v1/play/?video_id=v0200fg10000ckk161rc77ua9mpnl2i0然后訪問發(fā)現(xiàn)可以得到原視頻(video_id后面的參數(shù)屬于視頻的id不能刪除)
? ? ? ? 4、到這我們就已經(jīng)拿到無水印的視頻了,但是那個video_id怎么獲取呢?在控制臺找到左邊的包然后打開它獲取到的json在aweme_detail里面的video里面的play_addr下的uri:"v0200fg10000ckk161rc77ua9mpnl2i0"這就是我們要找的video_id
? ? ? ? 5、接著我們看看這個包的請求頭:很長并且里面涉及到了多個參數(shù)分析后試著刪掉一些參數(shù)都會導致請求失敗,所以這個包不適合我們使用,既然pc端的包這么復雜,那就試著抓取手機端的包
????????6、設置手機端:左上角箭頭標記旁邊,設置完成后刷新頁面得到手機端
? ? ? ? 7、分析得到如下圖的包名:我們可以看到這個包返回的json參數(shù)里也有我們剛剛pc端uri:"v0200fg10000ckk161rc77ua9mpnl2i0"這個參數(shù)
? ? ? ? 8、分析獲取這個包的鏈接:https://m.douyin.com/web/api/v2/aweme/iteminfo/?reflow_source=reflow_page&item_ids=7289096995174714679&msToken=anBTIc1cLIN1y4SA9gFLfdlPmHPukK-0pgTfdWQcQI0YENGgCxPNI9h5kTCiOV__hFzHETwpa6lLL8t6p69LE64ZNp26-n-oK1gdxHeZ6zejX0gTQ3BWDbNSgUwNww%3D%3D&a_bogus=mvUYkcZCMsR10D3CMhkz9nTm5fD0YW4dgZEzPD6XQ0LR可以看到這個鏈接比pc端的鏈接短了很多,最后分析得出刪掉&msToken后面的鏈接:https://m.douyin.com/web/api/v2/aweme/iteminfo/?reflow_source=reflow_page&item_ids=7289096995174714679也能獲取相應的json,這個item_ids可以看出是分享鏈接重定向之后video/后面的字段https://m.douyin.com/share/video/7289096995174714679
? ? ? ? 9、分析到這我們就可以完成上述的代碼了
import re
import requests
import os
# 請求頭
header = {
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36"}
# 視頻無水印
def videos(surl):
print('正在解析視頻鏈接')
# 獲取video_id (重定向后的鏈接會變化具體我也沒弄清楚就做了兩種判斷)
if len(surl) > 60:
id = re.search(r'video/(\d.*)/', surl).group(1)
else:
id = re.search(r'video/(\d.*)', surl).group(1)
# print(id)
# 獲取json數(shù)據(jù)
u_id = "https://m.douyin.com/web/api/v2/aweme/iteminfo/?item_ids={}&a_bogus=".format(id)
v_rs = requests.get(url=u_id, headers=header).json()
# titles = v_rs['item_list'][0]['desc']
# 截取文案
titles = re.search(r'^(.*?)[;;。.#]', v_rs['item_list'][0]['desc']).group(1)
# print(titles)
# 創(chuàng)建video文件夾
if not os.path.exists('video'):
os.makedirs('video')
# 獲取uri參數(shù)
req = v_rs['item_list'][0]['video']['play_addr']['uri']
# print("vvvvvv", req)
print('正在下載無水印視頻')
# 下載無水印視頻
v_url = "https://www.douyin.com/aweme/v1/play/?video_id={}".format(req)
v_req = requests.get(url=v_url, headers=header).content
# 寫入文件
with open(f'video/{titles}.mp4', 'wb') as f:
f.write(v_req)
if __name__ == '__main__':
# 抖音
shares = input("請輸入分享鏈接并按下回車鍵:")
# 提取分享鏈接后面的鏈接
share = re.search(r'/v.douyin.com/(.*?)/', shares).group(1)
# 請求鏈接
share_url = "https://v.douyin.com/{}/".format(share)
# print(share_url)
s_html = requests.get(url=share_url, headers=header)
# 獲取重定向后的視頻id
surl = s_html.url
# print(surl)
# 判斷鏈接類型為視頻分享類型
if re.search(r'/video', surl) != None:
videos(surl)
quit = input('下載完成,按回車鍵退出程序。')
# 判斷鏈接類型為圖集分享類型
elif re.search(r'/note', surl) != None:
pics(surl)
quit = input('下載完成,按回車鍵退出程序。')
else:
quit = input('解析失敗,按回車鍵退出程序。')
二、圖集分析
? ? ? ? 1、獲取圖集分享鏈接:0.07 yTy:/ 03/13 l@c.nD ?復制打開抖音,看看【生活隨拍 可能有關】# 文案 # 朋友圈文案 # 圖文掘金計劃 發(fā)朋友圈會被秒贊的高級文案.# 文案 # 朋友圈文案# ... https://v.douyin.com/idpAF4rh/根據(jù)視頻的經(jīng)驗我們直接打開手機版的控制臺抓包,找到了一個和視頻一樣的包名打開獲取后的json得到images下的五張原圖片的鏈接
? ? ? ? 2、分析獲取這個包的鏈接:https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?reflow_source=reflow_page&item_ids=7281493932930895156&a_bogus=DyMOgOZJMsR1Xj3Cdwkz9Htm54W0YW40gZEzYr%2FdMtL9刪掉多余的參數(shù)得到:https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?reflow_source=reflow_page&item_ids=7281493932930895156&a_bogus=
這個鏈接其中item_ids和視頻也是一樣是分享鏈接重定向之后的id
? ? ? ? 3、完成上述代碼文章來源:http://www.zghlxwxcb.cn/news/detail-751989.html
# 圖片無水印
def pics(surl):
print('正在解析圖片鏈接')
# 獲取id
if len(surl) > 60:
pid = re.search(r'note/(\d.*)/', surl).group(1)
else:
pid = re.search(r'note/(\d.*)', surl).group(1)
# 獲取json數(shù)據(jù)
p_id = "https://m.douyin.com/web/api/v2/aweme/iteminfo/?reflow_source=reflow_page&item_ids={}&a_bogus=".format(pid)
# print(p_id)
p_rs = requests.get(url=p_id, headers=header).json()
# print(p_rs)
# 拿到images下的原圖片
images = p_rs['item_list'][0]['images']
# 獲取文案
ptitle = re.search(r'^(.*?)[;;。.#]', p_rs['item_list'][0]['desc']).group(1)
# 創(chuàng)建pic文件夾
if not os.path.exists('pic'):
os.makedirs('pic')
if not os.path.exists(f'pic/{ptitle}'):
os.makedirs(f'pic/{ptitle}')
print('正在下載無水印圖片')
# 下載無水印照片(遍歷images下的數(shù)據(jù))
for i, im in enumerate(images):
# 每一條數(shù)據(jù)下面都有四個原圖鏈接這邊用的是第一個
p_req = requests.get(url=im['url_list'][0]).content
# print(p_req)
# 保存圖片
with open(f'pic/{ptitle}/{str(i + 1)}.jpg', 'wb') as f:
f.write(p_req)
三、完整代碼
import re
import requests
import os
# 請求頭
header = {
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36"}
# 視頻無水印
def videos(surl):
print('正在解析視頻鏈接')
# 獲取video_id (重定向后的鏈接會變化具體我也沒弄清楚就做了兩種判斷)
if len(surl) > 60:
id = re.search(r'video/(\d.*)/', surl).group(1)
else:
id = re.search(r'video/(\d.*)', surl).group(1)
# print(id)
# 獲取json數(shù)據(jù)
u_id = "https://m.douyin.com/web/api/v2/aweme/iteminfo/?item_ids={}&a_bogus=".format(id)
v_rs = requests.get(url=u_id, headers=header).json()
# titles = v_rs['item_list'][0]['desc']
# 截取文案
titles = re.search(r'^(.*?)[;;。.#]', v_rs['item_list'][0]['desc']).group(1)
# print(titles)
# 創(chuàng)建video文件夾
if not os.path.exists('video'):
os.makedirs('video')
# 獲取uri參數(shù)
req = v_rs['item_list'][0]['video']['play_addr']['uri']
# print("vvvvvv", req)
print('正在下載無水印視頻')
# 下載無水印視頻
v_url = "https://www.douyin.com/aweme/v1/play/?video_id={}".format(req)
v_req = requests.get(url=v_url, headers=header).content
# 寫入文件
with open(f'video/{titles}.mp4', 'wb') as f:
f.write(v_req)
# 圖片無水印
def pics(surl):
print('正在解析圖片鏈接')
# 獲取id
if len(surl) > 60:
pid = re.search(r'note/(\d.*)/', surl).group(1)
else:
pid = re.search(r'note/(\d.*)', surl).group(1)
# 獲取json數(shù)據(jù)
p_id = "https://m.douyin.com/web/api/v2/aweme/iteminfo/?reflow_source=reflow_page&item_ids={}&a_bogus=".format(pid)
# print(p_id)
p_rs = requests.get(url=p_id, headers=header).json()
# print(p_rs)
# 拿到images下的原圖片
images = p_rs['item_list'][0]['images']
# 獲取文案
ptitle = re.search(r'^(.*?)[;;。.#]', p_rs['item_list'][0]['desc']).group(1)
# 創(chuàng)建pic文件夾
if not os.path.exists('pic'):
os.makedirs('pic')
if not os.path.exists(f'pic/{ptitle}'):
os.makedirs(f'pic/{ptitle}')
print('正在下載無水印圖片')
# 下載無水印照片(遍歷images下的數(shù)據(jù))
for i, im in enumerate(images):
# 每一條數(shù)據(jù)下面都有四個原圖鏈接這邊用的是第一個
p_req = requests.get(url=im['url_list'][0]).content
# print(p_req)
# 保存圖片
with open(f'pic/{ptitle}/{str(i + 1)}.jpg', 'wb') as f:
f.write(p_req)
if __name__ == '__main__':
# 抖音
shares = input("請輸入分享鏈接并按下回車鍵:")
# 提取分享鏈接后面的鏈接
share = re.search(r'/v.douyin.com/(.*?)/', shares).group(1)
# 請求鏈接
share_url = "https://v.douyin.com/{}/".format(share)
# print(share_url)
s_html = requests.get(url=share_url, headers=header)
# 獲取重定向后的視頻id
surl = s_html.url
# print(surl)
# 判斷鏈接類型為視頻分享類型
if re.search(r'/video', surl) != None:
videos(surl)
quit = input('下載完成,按回車鍵退出程序。')
# 判斷鏈接類型為圖集分享類型
elif re.search(r'/note', surl) != None:
pics(surl)
quit = input('下載完成,按回車鍵退出程序。')
else:
quit = input('解析失敗,按回車鍵退出程序。')
四、總結
? ? ? ? 這個是我的個人分析思路希望各位大佬能給出寶貴意見或者新思路,第一次發(fā)帖感謝各位支持文章來源地址http://www.zghlxwxcb.cn/news/detail-751989.html
到了這里,關于python抓取抖音無水印視頻和無水印圖集下載(個人分析思路)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!