zoukankan      html  css  js  c++  java
  • 【python】抖音无水印短视频批量爬虫

    成果展示

    在这里插入图片描述

    视频下载

    爬取的100个视频:https://ghgxj.lanzous.com/b08xszm0h

    项目场景

    抖音【喜欢】这一栏收藏了很多视频,如下图,共有4691个,如何批量下载下来?
    在这里插入图片描述

    预备知识

    只下载单个视频其实是不难的,可以参考我的这篇文章:

    【python】15行代码下载抖音无水印短视频

    1、运行下方代码:

    import re, json, requests
    from tqdm import tqdm # 打印进度条的库
    inp = input('请输入复制的抖音分享链接:')  # 如:https://v.douyin.com/JVFp8r5/
    url = re.findall('https://v.douyin.com/.*?/', inp)[0]  # 链接解析
    res = requests.get(url)
    vid = re.findall('/video/(.*?)/', res.url)[0]  # vid解析,vid就是视频id,是我自己定义的
    api = f'https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={vid}' # 调用api
    res = requests.get(api).json()
    url = res['item_list'][0]['video']['play_addr']['url_list'][0]  # 视频下载链接解析
    url = url.replace('/playwm/', '/play/')  # 去水印
    res = requests.get(url, headers={'user-agent': 'chrome'})
    total_size = round(int(res.headers["Content-Length"])/1024/1024)
    with open(f'{vid}.mp4', 'wb') as f:
        for chunk in tqdm(iterable=res.iter_content(1024*1024), total=total_size, unit='KB'):
            f.write(chunk)
    

    2、输入抖音短视频分享链接

    不用考虑我的感受 我没感受 不用和我说对不起 反正下次还是对不起  https://v.douyin.com/JVccx8h/ 复制此链接,打开抖音搜索,直接观看视频!
    

    在这里插入图片描述
    3、就能将视频下载到本地了
    在这里插入图片描述

    批量爬取

    下载单个视频的时候,我们是通过复制分享视频链接来实现的,如何批量获取视频链接呢?总不能一个一个点吧,【喜欢】里面总共有4691个视频,一个一个用手点肯定是不行的。这里我就想到了用Fiddler Everywhere来对抖音APP进行抓包。

    抓包结果如下:
    在这里插入图片描述
    【喜欢】的api接口是:

    https://aweme.snssdk.com/aweme/v1/aweme/favorite/
    

    返回的是json数据:
    在这里插入图片描述
    请求参数有很多,但每次改变的只有这4个参数:

    count
    max_cursor:
    ts
    _rticket
    

    其中,count是返回的视频数量,max_cursor首次请求时为0,往后请求的值为上一次的返回值。ts和_rticket目前还不知道怎么解析,不过应该是通过某种加密方式计算出来的。所以目前是项目是卡在这里,如果以后有解决办法会再更新的。

    温馨提示

    因为api接口有些参数目前还尚未解析,所有我就手动复制了返回的几个json数据,然后运行下方代码下载:

    import os, json, requests
    from tqdm import tqdm
    
    def down(name, link):
        res = requests.get(link)
        with open(name, 'wb') as f:
            f.write(res.content)
    
    def main():
        root = 'favorite/'
        os.makedirs(root, exist_ok=True)
        with open('favorite.json', 'r', encoding='utf-8') as f:
            data = json.load(f)
        for item in tqdm(data['aweme_list']):
            name = root+item['aweme_id']+'.mp4'
            link = item['video']['play_addr']['url_list'][0]
            down(name, link)
    
    main()
    

    顺便一提

    其实我也用appium尝试过,但【喜欢】里面视频播放时竟然捕捉不到元素

    from appium import webdriver
    import time
    
    # 连接手机抖音
    caps = {
        "platformName": "Android",
        "deviceName": "emulator-5554",
        "platformVersion": "6.0.1",
        "appPackage": "com.ss.android.ugc.aweme",
        "appActivity": ".main.MainActivity",
        "noReset": "True",
        "unicodeKeyboard": "True",
        "resetKeyboard": "True"
    }
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', caps)
    
    # 爬抖音喜欢的视频数据
    time.sleep(5)
    print('点击我')
    driver.find_elements_by_id('com.ss.android.ugc.aweme:id/h3f')[4].click()
    time.sleep(5)
    print('点击喜欢')
    driver.find_elements_by_id('com.ss.android.ugc.aweme:id/g1c')[2].click()
    time.sleep(5)
    print('打开视频')
    driver.find_elements_by_id('com.ss.android.ugc.aweme:id/a2z')[0].click()
    time.sleep(5)
    print('点击分享')
    driver.find_element_by_id('com.ss.android.ugc.aweme:id/gh0').click()
    time.sleep(5)
    driver.swipe(500, 1300, 0, 1300)
    time.sleep(5)
    print('点击复制链接')
    # 下方代码或报错,因为获取不到元素,hhh
    driver.find_elements_by_id('com.ss.android.ugc.aweme:id/gg1')[-3].click()
    time.sleep(1)
    print(driver.get_clipboard_text())
    

    在这里插入图片描述

    相关推荐

    【python】15行代码下载抖音无水印短视频

  • 相关阅读:
    js中盒子模型常用的属性你还记得几个?
    编写一个关于浏览器盒子模型的方法
    Javascript中关于作用域和闭包和域解释的面试题
    时间格式转换
    HDU Subset sequence
    bugku never give up
    HDU 2136 Largest prime factor
    HDU 2099 整除的尾数
    杭电acm 2070
    ACM Elevator
  • 原文地址:https://www.cnblogs.com/ghgxj/p/14219061.html
Copyright © 2011-2022 走看看