抖音、快手视频抓取

一、抖音视频获取

浏览器打开抖音浏览器,https://www.douyin.com/,打开一般直接让登录,点击x关闭即可。

 

 

 搜索里输入想要抓取视频的号体,比如,航空工业,我们要抓取视频的号体:

 

 

 选择用户,再点击进入号体,视频部分就是我们需要抓取的内容:

 

 

 我们来分析这部分视频的构造:

 

 

 只要遍历div里的这些内容即可,视频地址,视频封面图,视频标题都有,自动化操作到此即可都获取到,临时使用的代码,没有格式化封装,将就看就行:

    try:
        # 点击关闭登录弹窗
        WebDriverWait(driver, 10, 0.2).until(EC.presence_of_element_located((By.CLASS_NAME, "dy-account-close"))).click()
    except Exception as e:
        print(e)
    # 输入号体名称
    WebDriverWait(driver, 20, 0.2).until(EC.presence_of_element_located((By.XPATH, "//*[@data-e2e='searchbar-input']"))).send_keys(account)
    # 点击搜索
    WebDriverWait(driver, 20, 0.2).until(EC.presence_of_element_located((By.XPATH, "//*[@data-e2e='searchbar-button']"))).click()
    # 切换浏窗口
    windows = driver.window_handles
    driver.switch_to.window(windows[-1])
    # 点击用户
    WebDriverWait(driver, 20, 0.2).until(EC.presence_of_element_located((By.XPATH, "//span[@data-key='user']"))).click()
    # 进入号体
    WebDriverWait(driver, 20, 0.2).until(EC.presence_of_element_located((By.XPATH, "//span[text()='%s']" % account))).click()
    # 切换窗口
    windows = driver.window_handles
    driver.switch_to.window(windows[-1])
    # 向下滑动,获取更多视频
    for i in range(2):
        js = "document.documentElement.scrollTop={0}".format(scroll)
        driver.execute_script(js)
        scroll += 700
        time.sleep(1)
    # 找到视频地址
    vi = driver.find_elements(By.XPATH, "//*[contains(@href,'/video/')]")
    # 找到封面图
    cover = driver.find_elements(By.XPATH, "//*[contains(@href,'/video/')]//div//div//img")

获取到的视频类似这样的:https://www.douyin.com/video/7209924261669014839

直接访问这个视频还是下载不到的,怎么搞呢?

直接访问这个地址即可,然后我们看请求接口里有“https://v26-web.douyinvod.com/'”这个地址:

 

 

 直接访问这个地址:

 

 

 你会发现这个地址就是视频的原地址,视频时长我们也可以获取到,是不是很easy!

# 访问视频地址
re_url, video_time = gv.get_video_douyin(i[1])
    for ul in re_url.requests:
        try:
            # 获取原视频
            if 'https://v26-web.douyinvod.com/' in ul.url:
                # 视频转存七牛
                qiniu_video = qn_url.url_to_qiniu(ul.url, 'mp4')
                qiniu_cover = qn_url.url_to_qiniu(v_cover, 'jpg')  

获取原视频地址后,转存七牛即可,原视频地址是带有时间搓过期验证的,获取到后第一时间下载或者转存。

到此,抖音视频就over,但通过自动化方式频繁访问,抖音会弹出滑块验证码啥的,还有ip判断,可以通过代理iP池搞定。

当然,一个号体一天刷一两次就可以了,所以,至少目前为止,不用ip也行,如果嫌每次登录弹窗的话,可以扫码登录,自动化时候读取浏览器缓存加载即可:

 # 加载浏览器缓存
  options.add_argument(profile_directory)

二、快手视频获取

抖音快手都属于字节,一看快手前端,和抖音都类似,但快手简单的难以置信:

同样的自动化进入用户视频页面后,“https://www.kuaishou.com/graphql”,这个地址把视频都返回了,并且没有js加密,抖音也有接口返回视频地址,但都js加密的。既然没有加密,

那直接解析获取视频即可:

 

 

 

 

def get_kuai_shou_video(url, account):
    """
    :param account:
    :param url:
    :return:
    """
    # seleniumwire:浏览器请求分析插件
    # 浏览器缓存文件地址(谷歌浏览器)
    profile_directory = r'--user-data-dir=%s' % config.get('****', 'chromedriver_user_data') + 'User Data'
    # *******配置自动化参数*********#
    options = webdriver.ChromeOptions()
    # 加载浏览器缓存
    options.add_argument(profile_directory)
    # options.add_argument("headless")
    # 避免代理跳转错误
    options.add_argument('--ignore-certificate-errors-spki-list')
    options.add_argument('--ignore-ssl-errors')
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
    options.add_experimental_option('useAutomationExtension', False)
    options.add_argument("--disable-popup-blocking")
    # 不打开浏览器运行
    # options.add_argument("headless")
    # *******配置自动化参数*********#
    driver = webdriver.Chrome(executable_path=driver_path, options=options)
    # 最大化浏览器
    driver.maximize_window()
    dou_yin_url = url
    driver.get(dou_yin_url)
    video_li = []
    video_l = []
    time.sleep(5)
    scroll = 0
    WebDriverWait(driver, 20, 0.2).until(EC.presence_of_element_located((By.XPATH, "//*[@class='search-input']"))).send_keys(account)
    WebDriverWait(driver, 20, 0.2).until(EC.presence_of_element_located((By.XPATH, "//*[@class='search-button']"))).click()
    WebDriverWait(driver, 20, 0.2).until(EC.presence_of_element_located((By.XPATH, "//*[@class='tab-title title-user']"))).click()
    WebDriverWait(driver, 20, 0.2).until(EC.presence_of_element_located((By.XPATH, "//span[text()='%s']" % account))).click()
    windows = driver.window_handles
    driver.switch_to.window(windows[-1])
    for i in range(3):
        js = "document.documentElement.scrollTop={0}".format(scroll)
        driver.execute_script(js)
        scroll += 700
        time.sleep(1)
    for i in driver.requests:
        # 找到有视频的接口
        if "https://www.kuaishou.com/graphql" in i.url:
            try:
                # 解析数据
                buff = BytesIO(i.response.body)
                f = gzip.GzipFile(fileobj=buff)
                htmls = f.read().decode('utf-8')
                html_dic = json.loads(htmls)
                try:
                    # 解析视频数据
                    vf = html_dic['data']['visionProfilePhotoList']['feeds']
                    for f in vf:
                        video_li.append(f)
                except Exception as e:
                    print(e)except Exception as e:
                print(e)
    driver.quit()
    if video_li:
        for v in video_li:
            try:
                # 视频地址
                original_url = v['photo']['photoUrl']
                # 视频封面地址
                original_cover = v['photo']['coverUrl']
                qiniu_video = qn_url.url_to_qiniu(original_url, 'mp4')
                qiniu_cover = qn_url.url_to_qiniu(original_cover, 'jpg')
                # 组装视频信息
                video_dic = {
                    'video_title': v['photo']['caption'],
                    'video_duration': v['photo']['duration'],
                    'video_path': qiniu_video,
                    'video_cover': qiniu_cover,
                    'original_url': original_url,
                    'original_cover': original_cover,
                    'video_time': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(v['photo']['timestamp'] / 1000))
                }
                video_l.append(video_dic)
            except Exception as e:
                print(e)else:
        print("获取视频异常")
    return video_l

然后转存视频即可,非常简单!

以上是抖音和快手的视频抓取。

仅供学习使用,勿作恶!!!

posted @ 2023-03-14 11:52  drewgg  阅读(1220)  评论(0编辑  收藏  举报