Python无水印爬取抖音视频源码,因为有些作者不开放下载链接和下载的视频都有水印,所以就写代码解析下载。 输入,可以是视频的分享链接,也可以是视频id。
源码:
import requests import re import os from selenium import webdriver header = { "user-agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/101.0.4951.54 Safari/537.36 Edg/101.0.1210.39 ' } def get_video_id(video_url): """ 根据视频链接,获得视频的id """ option = webdriver.ChromeOptions() option.add_argument("--headless") option.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, ' 'like Gecko) Chrome/96.0.4664.110 Safari/537.36') driver = webdriver.Chrome(options=option) driver.get(video_url) # 获得源码 html = driver.page_source id_pattern = '<div class="IsE_azet">.*?from_gid=(.*?)&' video_id = re.findall(id_pattern, html) return video_id[0] def get_video_info(video_id): """ 利用video_id 获得视频的一些信息,作者,无水印链接等 """ video_info_url = f'https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={video_id}' # 获得视频的信息 resp = requests.get(video_info_url, headers=header) video_info_json = resp.json() resp.close() # 获取作者名字 author_name = video_info_json['item_list'][0]['author']['nickname'] # 获取视频标题 video_title_tmp = video_info_json['item_list'][0]['share_info']['share_title'] if video_title_tmp.startswith('#'): video_title = video_title_tmp.split('#')[1].split('@')[0] else: video_title = video_title_tmp.split('#')[0].split('@')[0] # 用于保存文件的名字 title = author_name + '-' + video_title + '-' + video_id # 获取视频的无水印地址,wm=watermark video_true_url = video_info_json['item_list'][0]['video']['play_addr']['url_list'][0].replace('/playwm/', '/play/') return title, video_true_url def download(title, video_true_url): """ 下载视频 """ # 创建存放位置 path = '../dy_video' if os.path.exists(path): pass else: os.makedirs(path) # 获取视频 resp = requests.get(video_true_url, headers=header) content = resp.content resp.close() # 下载视频 with open(f'../dy_video/{title}.mp4', 'wb') as f: f.write(content) print("视频下载完成!") print(f"视频名字为:{title}.mp4") def main(): """ 主程序 """ url_or_id = str(input("输入分享链接或者视频id:")) if len(url_or_id) == 19: # 长度小于30,是一个视频id,id长度为19 print('输入的是视频id。') title, video_true_url = get_video_info(url_or_id) download(title, video_true_url) else: # 是一个分享链接 print('输入的是视频分享链接。') video_url = url_or_id.split(" ")[-2] video_id = get_video_id(video_url) title, video_true_url = get_video_info(video_id) download(title, video_true_url) if __name__ == '__main__': main()
运行效果:
版权声明
版权说明: 仅限用于学习和研究目的;不得将上述内容用于商业和非法用途!否则一切后果自负。我们非常重视版权问题,如有侵权请邮件至(171373236#qq.com)与我们联系处理,敬请谅解!