import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ec from selenium.webdriver.common.keys import Keys #模拟滚动 from bs4 import BeautifulSoup import random import requests import os import pyautogui # 鼠标点击

创建浏览器对象,阻止浏览器执行完代码后自动关闭

options = webdriver.EdgeOptions() options.add_argument('--disable-blink-features=AutomationControlled') options.add_experimental_option('detach', True)

打开浏览器

driver = webdriver.Edge(options=options)

class DouyinSpider(): # 定义类属性-抖音主页地址 douyin_url = 'https://www.douyin.com/discover'

# 定义init初始化方法--博主名---博主账号
def __init__(self, user_id , user):
    self.user_id = user_id
    self.user = user
    self.videos_dow = []    # 博主所有视频下载地址列表

# 登录抖音进入博主个人主页(半自动)
def login(self):
    # 进入抖音主页
    driver.get(self.douyin_url)
    # 休眠,加载页面
    time.sleep(1)

    # 密码登录按钮--获取所有具有相同类名的元素
    password_btn = driver.find_elements(By.CLASS_NAME, 'web-login-tab-list__item')
    # 点击第三个元素-密码登录
    password_btn[2].click()

    # 定位账号输入框并输入账号
    input_account = driver.find_element(By.NAME, 'normal-input')
    input_account.send_keys('13544208082')
    # 定位密码输入框并输入密码
    input_password = driver.find_element(By.NAME, 'button-input')
    input_password.send_keys('Li13544208082')

    # 找到登录按钮并点击
    login_btn = driver.find_element(By.CLASS_NAME, 'web-login-account-password__button-wrapper')
    login_btn.click()

    # 等待登录完成
    print('抖音登录成功')
    # 停止程序-->完成验证保证后续最大程度自动化
    input('请完成验证后回车继续完成视频获取......')

    # 进入个人主页
    me_btn = WebDriverWait(
        driver, 10).until(ec.presence_of_element_located((By.CSS_SELECTOR, '.F55pZYYH'))
                          )
    me_btn.click()
    # 休眠--加载页面
    time.sleep(1)

    # 找到搜索框按钮并点击
    search_box = WebDriverWait(
        driver, 10).until(ec.presence_of_element_located((By.CSS_SELECTOR, 'input[placeholder='搜索你感兴趣的内容']'))
                          )
    search_box.click()

    # 清除默认文本
    search_box.clear()
    # 输入要下载的博主账号
    search_box.send_keys(self.user_id)

    # 找到搜索按钮并点击
    search_btn = WebDriverWait(
        driver, 10).until(ec.presence_of_element_located((By.CLASS_NAME, 'rB8dMXOc'))
                          )
    search_btn.click()

    # 等待新页面加载完成并切换到新页面,防止在原界面执行进入博主页面
    driver.switch_to.window(driver.window_handles[-1])
    # 切换到新窗口或选项卡后,等待新页面加载完成
    driver.implicitly_wait(20)

    # 在新页面上执行进一步操作-->进入博主主页
    in_up_btn = WebDriverWait(driver, 30).until(
        # 使用字符串连接字符 + 让self.user能被实参调用
        ec.presence_of_element_located((By.XPATH, '//span[contains(text(), '' + self.user + '')]'))
    )
    in_up_btn.click()

    print(self.user + '个人主页进入成功')

    # 等待新页面加载完成并切换到新页面,防止在原界面执行进入博主页面
    driver.switch_to.window(driver.window_handles[-1])
    # 切换到新窗口或选项卡后,等待新页面加载完成
    driver.implicitly_wait(10)

# 解析博主所有单条视频下载url
def analysis(self):
    # 定义空列表
    href_list = []        # href属性存放列表-->单个视频存放地址
    videos_list = []      # 博主所有单个视频地址存放列表
    video_list_html = []  # 博主单个视频HTML列表
    self.videos_dow = []  # 博主所有视频下载url存放列表

    # 模拟滚动
    time.sleep(2)   # 滚动前休眠,加载页面
    for _ in range(7):  # 例如,滚动7次以加载更多内容
        body = driver.find_element(By.TAG_NAME, 'body') # 在body标签滚动-->博主主页所有视频存放在<body>
        body.send_keys(Keys.END)  # 模拟向下滚动至页面底部
        time.sleep(2)  # 休眠,加载页面

    # 获取博主主页HTML
    up_html = driver.page_source

    # 使用Beautiful Soup解析博主主页HTML
    soup = BeautifulSoup(up_html, 'html.parser')

    # 解析博主所有单个视频url地址
    # 查找所有<a>标签
    a_tags = soup.find_all('a')
    # 遍历所有<a>标签,获取href属性值-->单个视频存放地址
    for a_tag in a_tags:
        href_value = a_tag.get('href')
        href_list.append(href_value)

    # 去除所有包含//的数据-->博主视频格式为/video/7239302624917343522,
    for video in href_list:
        if '//' not in video:
            videos_list.append('https://www.douyin.com' + video) # 博主所有单个视频地址存放列表
    print('成功获取' + self.user + '主页所有单个视频存放地址')

    # 跳转第一个视频需要验证,定义验证关键字
    i = 1

    # 获取博主所有单个视频的下载url
    for a in range(len(videos_list)):
        # 休眠,加载页面
        time.sleep(random.uniform(1.2, 1.5))
        # 跳转博主单个视频网页
        driver.get(videos_list[a])

        # 添加延时等待
        time.sleep(0.8)
        # 模拟鼠标点击操作
        pyautogui.click(507, 319)
        # 休眠,加载页面
        time.sleep(2)

        # 如果是跳转的第一个页面-->暂停程序完成验证
        if i == 1 :
            # 休眠,加载页面
            time.sleep(2)
            input('请完成验证后回车继续完成视频获取......')
        # 后续不再暂停程序-->后续跳转页面无验证
        i += 1

        # 返回博主单个视频HTML
        page_html = driver.page_source

        # 存入博主单个视频HTML列表
        video_list_html.append(page_html)

        # 随机休眠0.8s-31.6s
        time.sleep(random.uniform(0.8,1.6))

        # 解析博主单个视频HTML-->获取单个视频下载地址
        soup1 = BeautifulSoup(page_html, 'html.parser')

        # 解析<source>标签-->单个视频下载地址存放标签
        source_tags = soup1.find_all('source')

        # 只取第一条个<source>标签-->三个标签下载地址重复
        source_tag = source_tags[0]

        # 单个视频下载url-->source标签的src值
        video_url = source_tag.get('src')

        # 存入单个视频下载列表(全局变量列表)
        self.videos_dow.append('https:' + video_url)
    print('博主主页所有视频下载url获取完成')

# 视频下载
def dowload_save(self):
    # 自定义文件夹路径
    folder_path = r'D:\Python\python-learn\爬虫实战案例\相关文件保存\抖音博主视频集'

    # 创建文件夹
    path = os.path.join(folder_path, self.user)
    if not os.path.exists(path):
        os.makedirs(path)

    count = 1          # 视频名字初定义
    success_count = 1  # 下载成功的视频数初定义
    # 发送请求下载视频
    for video_url in self.videos_dow:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.46',
        }
        # 发送请求下载视频
        response = requests.get(video_url, headers=headers)

        # 生成视频文件名
        file_name = f'{self.user}视频{count}.mp4'

        # 视频名字自加
        count += 1

        # 拼接完整的文件路径-->单个视频绝对路径
        file_path = os.path.join(path, file_name)

        print('开始下载' + self.user + '所有视频:')

        # 保存视频文件到本地
        with open(file_path, 'wb') as f:
            f.write(response.content)

        print(f'已下载完成{success_count}条视频:')

    print(self.user + '所有视频下载完成')

def run(self):
    # 1. 登录
    self.login()
    # 2. 解析HTML视频数据
    self.analysis()
    # 3. 下载并保存视频
    self.dowload_save()
    # 关闭浏览器
    driver.quit()

启动爬虫程序

def start(): spider = DouyinSpider('dyazr6e2phcz', '好烦呐') spider.run()

if name == 'main': start()

抖音视频爬虫:自动获取并下载指定博主所有视频

原文地址: https://www.cveoy.top/t/topic/bKa5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录