所用工具:pycham
所需库:re,requests,tkinter,DrissionPage
应用场景:DOUYING-PI-LIANG-HUA-CAI-JI 和 DAN-GE-CAI-JI
在代码运行前确保库都导入完全和图片的下载;和图片路径正确;把下面图片下载,之后查看其路径,然后把源代码上的路径替换。
img = tk.PhotoImage(file="D:\\01PYTHON\python\案例\\192_192.png") # 读取图片
以下代码是在前几篇文章基础上建立的。所以今天作者很累就不讲了。直接看代码和运行结果。
注意:复制代码后需要填写cookie和user-agent,怎么填写前几篇文章都有介绍,就不讲了
运行之后会出现:
单个获取就是一个一个的获取,相应链接是视频详细页面的链接;一般都是这样
就是在视频点击鼠标左键进入详细页面
输入链接后,点击获取视频就会下载视频
多个获取就是多个获取,选择2号选项多个获取,输入链接,就是DY作者主页面的链接;一般就是以下样子,输入获取视频即可,我限制的只能获取7个视频,想要获取更多,就需要修改:
for i in range(1, 8):
8-1=7 增加8即可。
此代码对于短小视频还可以,对于长视频或许还有些欠缺。会继续改进。
以下为我的运行结果
import re
import requests
import tkinter as tk
from DrissionPage import ChromiumPage
url_list = []
video_list = []
title_list = []
headers = {
"cookie":
"填写自己的身份信息",
"user-agent":
"填写自己的设备信息",
"referer":
"https://www.douyin.com"
}
# 创建窗口
window = tk.Tk()
window.geometry('800x400+400+200')
# 创建窗口题目
window.title('获取抖音视频:')
# 在窗口上放置图片
img = tk.PhotoImage(file="D:\\01PYTHON\python\案例\\192_192.png") # 读取图片
tk.Label(window, image=img).pack(fill='both', pady=10) # 放置到window上 充满标签 上下距离为10
# 设置选项单个爬取还是多个爬取
# 设置标签框
choices_frame = tk.LabelFrame(window)
choices_frame.pack(fill='both', pady=10)
# 标签框内容
tk.Label(choices_frame, text='选择单个获取还是多个获取:', font=('黑体', 15)).pack(side=tk.LEFT) # side=tk.LEFT向左靠齐
# 设置选项
# 设置可变变量为整形
num_int_var = tk.IntVar() # 为整型这句要有没有的话会选中多个选项
# 设置默认选项
num_int_var.set(1)
tk.Radiobutton(choices_frame, text='1.单个获取', variable=num_int_var, value=1).pack(side=tk.LEFT, padx=50)
tk.Radiobutton(choices_frame, text='2.多个获取', variable=num_int_var, value=2).pack(side=tk.LEFT, padx=50) # 设置按钮为整形,变量为2,向左靠齐间距为50
# 设置输入标签
input_frame = tk.LabelFrame(window)
input_frame.pack(fill='both', pady=10)
# 输入标签文本
input_va = tk.StringVar()
tk.Label(input_frame, text='输入视频获取链接:', font=('黑体', 15)).pack(side=tk.LEFT)
tk.Entry(input_frame, relief='flat', textvariable=input_va, width=200).pack(side=tk.LEFT, fill='both') # 按钮更平滑 输入类型为字符串类型,宽度为200
def show():
num = num_int_var.get() # 获取单个按钮选项值
url = input_va.get() # 获取输入字符串值
if num == 1:
ChromiumPage().get(url)
txt = ChromiumPage().ele('x://*[@id="douyin-right-container"]/div[2]/div/div/div[1]/div[2]/div/xg-video-container/video/source[3]') # 获取网址元素,xpath定位视频链接位置
title = ChromiumPage().ele('x:/html/head/title').text
video_x = re.findall("<ChromiumElement source class='' src='(.*?)' type=''>", str(txt))[0] # 正则化提取视频链接位置,取出第一个链接
video_url = 'https:'+video_x
with open(f'{title}.mp4', mode='wb') as f:
f.write(requests.get(video_url, headers=headers).content)
elif num == 2:
ChromiumPage().get(url)
for i in range(1, 8):
m_video_x = ChromiumPage().ele(f'x://*[@id="douyin-right-container"]/div[2]/div/div/div/div[3]/div/div/div[2]/div[2]/div[2]/ul/li[{i}]/div/a')
m_video_c = re.findall("<ChromiumElement a href='(.*?)'", str(m_video_x))[0]
m_video = 'https://www.douyin.com'+m_video_c+'?modeFrom='
url_list.append(m_video)
print(url_list)
for j in url_list:
ChromiumPage().get(j)
txt = ChromiumPage().ele('x://*[@id="douyin-right-container"]/div[2]/div/div/div[1]/div[2]/div/xg-video-container/video/source[1]')
title = ChromiumPage().ele('x://*[@id="douyin-right-container"]/div[2]/div/div/div[1]/div[3]/div/div[1]/div/h1/span/span[2]/span/span[1]/span/span/span').text
video_c = re.findall("<ChromiumElement source class='' src='//(.*?)' type=''>", str(txt))[0]
video_url = 'https://'+video_c
video_list.append(video_url)
title_list.append(title)
print(video_list)
print(title_list)
for x, y in zip(video_list, title_list):
with open(f'{y}.mp4', mode='wb') as f:
f.write(requests.get(x, headers=headers).content)
tk.Button(window, text='获取视频', relief='flat', font=('黑体', 15), command=show).pack(fill='both', pady=10)
# 窗口可持续输出
window.mainloop()
标签:tkinter,list,爬虫,获取,window,video,tk,DrissionPage,div
From: https://blog.csdn.net/2201_75495538/article/details/143652096