爬虫案例-西瓜视频爬取

 

网站分析

在爬虫之前,我们还是分析一下要爬取的网站

这里是西瓜视频的首页:

 

 我们随便点进一个视频当中,进行相关查看:我们随便点进一个视频当中,进行相关查看:

 

 

通过控制台我们发现,在源码中并没有关于视频的相关路径,这里就需要使用network进行相关请求的截取进行分析:

 

 

刷新页面之后会获得这个页面的请求,右面部分就是获取的相关源码,这里的源码它有一部分进行了压缩,看起来不是很方便,我们可以将其复制到pycharm当中,进行代码的整理:

 

在源码中会发现很多的链接,其中有一个json数据,在里面可以发现一个有价值的链接(这里查看的时候建议结合键对应的中文解释进行查找):

 

复制源码之后会发现来到了一个单独视频的页面:

 

再次用控制台查看源码:

 

 

 可以看到里面有一个src属性,将它的属性值复制,来到一个新的页面中进行粘贴,就会发现这个视频的地址了。

在这个视频当中,是有水印的,接下来尝试去找到无水印的的相关视频。

无水印视频获取思路

无水印视频相对而言下载难度较大,因为它的视频和音频是分开的。

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

音频部分:

 

 

示例:

https://v9-xg-web-s.ixigua.com/1765c3316bd4bba625b6d446a8e98376/5fe990e6/video/tos/cn/tos-cn-vd-0026/6790ea3d232441f5a9379d9d6a263a3a/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=202012281444200102040312274A0344D8&lr=default&mime_type=video_mp4

 

 视频部分:

 

 

示例:

https://v9-xg-web-s.ixigua.com/dfecd8669fbb66169c12615919593f35/5fe990e6/video/tos/cn/tos-cn-vd-0026/6790ea3d232441f5a9379d9d6a263a3a/media-video-avc1/?a=1768&br=7293&bt=2431&cd=0%7C0%7C0&cr=0&cs=0&cv=1&dr=0&ds=4&er=0&l=202012281444200102040312274A0344D8&lr=default&mime_type=video_mp4

 

说明:这里视频和音频是分开存放的,当完成两部分下载之后,需要进行合成。如果提取正常,在浏览器中新建一个空白页面,根据地址进行请求之后就可以拿到对应的内容了,就是速度相对来说比较慢。

 

 

 

相关代码(未测试)

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


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


# 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')


def main(html_url):
    headers = {
        'cookie': '输入你自己的cookie',
        'referer': 'https://www.ixigua.com/?wid_try=1',
        '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(' - 西瓜视频', '')
    video_url = get_video_url(play_url)
    progressbar(video_url, title)


if __name__ == '__main__':
    video_id = input('请输入你要下载的视频ID:')
    url = f'https://www.ixigua.com/{video_id}'
    main(url)

 

posted @ 2020-12-28 15:17  苦行僧95  阅读(1196)  评论(0)    收藏  举报