• python实现某音自动登录+获取视频数据


    前言

    Dy这个东西想必大家都用过,而且还经常刷,今天就来用代码,获取它的视频数据

    环境使用
    Python 3.8
    Pycharm

    模块使用
    requests
    selenium
    json
    re

    一. 数据来源分析

    1. 明确需求
    明确采集网站以及数据内容

    网址: https://www.dy.com/user/MS4wLjABAAAAB0-gppwu15DtJJZmMpgUqakr7Jw_pmr7skR3IW6MwCQ?modal_id=7270865943398518050
    
    • 1

    数据: 视频链接 / 视频标题
    2. 抓包分析
    通过开发者工具进行抓包分析
    I. 打开开发者工具: F12
    II. 刷新网页
    III. 找到数据链接

    视频链接: https://v26-web.dyvod.com/295eea512e6f187309e6181297ec185e/64e8a7f8/video/tos/cn/tos-cn-ve-15c001-alinc2/o8vKACOD9NSbaA3mnggzfIO5QAgkqHnGr7sAeB/?a=6383&ch=26&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=609&bt=609&cs=2&ds=3&ft=bvTKJbQQqU-mfJ4ZPo0OW_EklpPiXV8zNMVJEdBqSpvPD-I&mime_type=video_mp4&qs=15&rc=NTg8NzpoNGY2aGU0N2k1PEBpajhuNTY6ZmhtbTMzNGkzM0AtMy4xY2E0Xi4xYDNjX15iYSM2bl5scjRvLWdgLS1kLWFzcw%3D%3D&btag=e00010000&dy_q=1692965337&l=20230825200856A1A3326D295C25055965
    
    • 1

    IV. 通过关键字搜索, 找到链接对应数据包
    视频链接 / 标题 --> 来自于网页源代码<进行编码>

    二. 代码实现步骤

    1. 发送请求, 模拟浏览器对于url地址发送请求
    2. 获取数据, 获取服务器返回响应数据
    3. 解析数据, 提取我们需要的数据内容
      4.保存数据, 保存视频数据

    代码实现

    发送请求

    模拟浏览器: <可以直接复制> response.text 获取响应文本数据 response.json() 获取响应json数据
    response.content 获取响应二进制数据
    我们使用requests.get()方法向指定的URL发送GET请求,并获取到响应的内容

    headers = {
        # User-Agent 用户代理, 表示浏览器基本身份信息
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
    }
    # 请求链接
    url = 'https://www.dy.com/user/MS4wLjABAAAArgJe6h-DzQcvyZ1O71yXSdJFn19Tqq8lFCIffgy5SlhwYlkseK5aM5ETF8KoaGDK?modal_id=7270476649714421046&vid=7269532986553552140'
    # 发送请求
    response = requests.get(url=url, headers=headers)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    解析数据

    使用正则表达式来搜索和匹配HTML内容中的特定模式,以提取所需的数据。 调用re模块里面findall方法 re.findall(‘数据:
    你需要的数据’, ‘数据源: 从什么地方获取数据’) --> 找到所有数据内容

    # 获取响应文本数据  获取网页源代码内容
    html_data = response.text
    # 提取标题
    title = re.findall('video_title" content="(.*?)"/>', html_data)[0]
    # 提取视频信息 <经过了编码>
    video_info = re.findall('', html_data)[0]
    # 解码
    info = requests.utils.unquote(video_info)
    # 把完整json数据格式字符串, 转成字典数据类型
    json_data = json.loads(info)
    # 根据冒号左边的内容[键], 提取冒号右边的内容[值]
    video_url = 'https:' + json_data['app']['videoDetail']['video']['bitRateList'][0]['playAddr'][0]['src']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    保存数据

    对于视频链接发送请求, 获取二进制数据内容, 保存本地文件夹

    video_content = requests.get(url=video_url, headers=headers).content
    with open('video\\' + title + '.mp4', mode='wb') as f:
        f.write(video_content)
    print(title)
    print(video_url)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    模拟登录

    导入所需模块

    # 自动化测试模块
    from selenium import webdriver
    # demo
    from chaojiying import Chaojiying_Client
    from password import account, password
    # 动作链
    from selenium.webdriver.common.action_chains import ActionChains
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    自动登录浏览器

    # 打开浏览器, 访问网站
    driver = webdriver.Chrome()
    driver.get('https://www.dy.com/user/MS4wLjABAAAAB0-gppwu15DtJJZmMpgUqakr7Jw_pmr7skR3IW6MwCQ')
    # 延时
    driver.implicitly_wait(10)
    time.sleep(2)
    # 获取验证码图片
    img_label = driver.find_element_by_css_selector('.captcha_verify_container')
    # 截图 保存验证码图片
    img_label.screenshot('yzm.png')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    调用
    在这里插入图片描述

    # 调用 --> 帮助我们识别文字坐标
    chaojiying = Chaojiying_Client(账号, 密码, '96001')
    # 读取图片
    im = open('yzm.png', 'rb').read()
    result = chaojiying.PostPic(im, '9004')['pic_str']
    for res in result.split('|'):
        x = res.split(',')[0]
        y = res.split(',')[-1]
        ActionChains(driver).move_to_element_with_offset(img_label, int(x), int(y)).click().perform()
    
    driver.find_element_by_css_selector('.captcha_verify_action div:last-of-type').click()
    time.sleep(2)driver.implicitly_wait(10)
    lis = driver.find_elements_by_class_name('Eie04v01')
    for li in lis:
        video_id = li.find_element_by_css_selector('a').get_attribute('href').split('/')[-1]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    最后代码运行结果展示

    在这里插入图片描述

  • 相关阅读:
    HLS优化设计(一)
    自动化开展思路
    IUV-5G全网仿真软件实训手册-手工整理
    日常学习记录随笔-大数据之日志(hadoop)收集实战
    Vue的路由
    在字节跳动和拼多多干了5年测试,熬夜总结出来的划水经验....
    代码随想录 --- day21 --- 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先
    【Rust日报】2022-05-28 Neon:AWS Aurora Postgres 的无服务器开源替代方案。
    云原生应用安全
    第77题. 组合
  • 原文地址:https://blog.csdn.net/XM67_/article/details/132580697