ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python爬取今日头条西瓜视频

2020-12-28 13:30:02  阅读:677  来源: 互联网

标签:视频 Python 爬取 url video 头条 response 下载 size


前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

PS:如有需要 Python学习资料源码 的小伙伴可以加点击下方链接自行获取

python免费学习资料以及群交流解答点击即可加入

基本开发环境

  • Python 3.6

  • Pycharm

相关模块的使用

import time
import os
import re
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

目标网页分析

在这里插入图片描述

如何获取视频地址

西瓜视频有两种:

1、有水印视频

2、无水印视频

有水印视频

在网页源代码中
在这里插入图片描述

https://www.ixigua.com/embed?group_id=6817258591586615812

这个链接点击进去是视频播放地址。
在这里插入图片描述
前端页面中已有视频真实地址

//v9-xg-web-s.ixigua.com/ac99e1bf75dd0faa6854d9e5367fac3f/5fe894d7/video/tos/cn/tos-cn-ve-4/626cf09c0830417da4b70982950cedd9/?a=1768&br=3891&bt=1297&cd=0%7C0%7C0&cr=0&cs=0&cv=1&dr=0&ds=3&er=0&l=20201227210214010204050203275E2F92&lr=default&mime_type=video_mp4&qs=0&rc=anQ3aWdzNjd2dDMzZjczM0ApPDQ2NjU8aGU3NzplMzZoNWdfMWguMmA0NWFfLS02LS9zczIwXjBfY2A2MmIvXjMyLjI6Yw%3D%3D&vl=&vr=

在这里插入图片描述
在这里插入图片描述
只要请求这个网址即可下载保存视频。

无水印视频

无水印的视频下载比较麻烦,首先它是音频和视频画面分离的
在这里插入图片描述
水印是没有水印,但是视频是没有声音的。
在这里插入图片描述

如何找音频和视频地址呢?

使用开发者工具,在XHR里面是有相对对应链接的

音频地址:

https://v9-xg-web-s.ixigua.com/79457295a8a89bf86bdcd157eb848175/5fe895f4/video/tos/cn/tos-cn-vd-0026/43771a1a38ea473d9cb5b8e7c0f651f3/media-audio-und-mp4a/?a=1768&br=0&bt=0&cd=0%7C0%7C0&cr=0&cs=0&cv=1&dr=0&ds=&er=0&l=20201227210659010028033025224FC377&lr=default&mime_type=video_mp4

在这里插入图片描述
视频画面地址:

https://v9-xg-web-s.ixigua.com/9b4e18f3b29244557c83b8e88f13dd1b/5fe895f4/video/tos/cn/tos-cn-vd-0026/86a41ef8ebd3496585db455ae56b3ff3/media-video-avc1/?a=1768&br=12159&bt=4053&cd=0%7C0%7C0&cr=0&cs=0&cv=1&dr=0&ds=4&er=0&l=20201227210659010028033025224FC377&lr=default&mime_type=video_mp4

在这里插入图片描述
所以如果想要爬取西瓜视频无水印版本的话,不仅要下载视频,还要下载音频,然后在合成视频和音频两个文件,和之前的爬取B视频有相似之处。

西瓜视频水印版本下载

1、获取源代码提取视频播放地址以及标题

def main(html_url):
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
    }
    response = requests.get(url=html_url, headers=headers)
    response.encoding = response.apparent_encoding
    play_url = re.findall('"embedUrl":"(.*?)"', response.text)[0]
    title = re.findall('<title data-react-helmet="true">(.*?)</title>', response.text)[0].replace(' - 西瓜视频', '')

2、获取视频真实下载地址

这里使用selenium主要是因为,链接的变化规律问题。每次请求网页都参数都不一样,比较难以分析,但是前端网页中是有显示真实的视频地址,所以可以使用selenium直接提取。

def get_video_url(html_url):
    """传入播放地址,获取视频下载地址"""
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    os.system("taskkill /f /im chromedriver.exe")
    driver = webdriver.Chrome(executable_path='chromedriver.exe', options=chrome_options)
    driver.get(html_url)
    driver.implicitly_wait(10)
    video_url = driver.find_element_by_css_selector('#player_default video').get_attribute('src')
    driver.close()
    return video_url

3、视频下载保存

方式一:正常保存方式

def save(video_url, video_title):
    filename = 'video\\' + video_title + '.mp4'
    video_headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
    }
    video_response = requests.get(url=video_url, headers=video_headers).content
    with open(filename, mode='wb') as f:
        f.write(video_response)
        print('正在下载保存:', video_title)

运行效果:
在这里插入图片描述
方式二:实现下载进度条

def progressbar(video_url, video_title):
    start = time.time()  # 下载开始时间
    response = requests.get(video_url, stream=True)  # stream=True必须写上
    size = 0  # 初始化已下载大小
    chunk_size = 1024  # 每次下载的数据大小
    content_size = int(response.headers['content-length'])  # 下载文件总大小
    try:
        if response.status_code == 200:  # 判断是否响应成功
            print('Start download,[File size]:{size:.2f} MB'.format(
                size=content_size / chunk_size / 1024))  # 开始下载,显示下载文件大小
            filepath = 'video\\' + video_title + '.mp4'  # 设置图片name,注:必须加上扩展名
            with open(filepath, 'wb') as file:  # 显示进度条
                for data in response.iter_content(chunk_size=chunk_size):
                    file.write(data)
                    size += len(data)
                    print('[下载进度]:%s%.2f%%' % ('▇' * int(size * 50 / content_size), float(size / content_size * 100)),
                          end='\n')
        end = time.time()  # 下载结束时间
        print('Download completed!,times: %.2f秒' % (end - start))  # 输出下载用时时间
        print(f'视频【 {video_title} 】已经保存完毕')
    except:
        print('Error')

运行效果:
在这里插入图片描述
只要输入视频的ID即可下载视频,之后也可以做一个简单GUI桌面应用软件。

标签:视频,Python,爬取,url,video,头条,response,下载,size
来源: https://blog.csdn.net/fei347795790/article/details/111855390

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有