python 爬取视频

一、概述

爬取步骤

第一步:获取视频所在的网页

第二步:F12中找到视频真正所在的链接

第三步:获取链接并转换成机械语言

第四部:保存

二、分析视频链接

获取视频所在的网页

以酷6网为例,随便点击一个视频播放链接,比如:https://www.ku6.com/video/detail?id=udfY7DjsSXbg8ghbDnhUwNTinOY

 

F12中找到视频真正所在的链接

按F12打开工具栏,network-->Media,这里会显示媒体文件

 

刷新页面,就能看到真正的视频加载链接

 

获取链接并转换成机械语言 

查看网页代码,找到js代码。这里面就可以看到真正的视频链接地址

那么通过正则匹配,就可以得到视频地址了。

直接打开这个视频地址,网页可以直接播放。

https://rbv01.ku6.com/wifi/o_1ej9q59hk1rpe7hm9os1v9v1btna

保存

可以直接播放的话,通过requests模块,就可以下载二进制文件了。

三、代码实现

完整代码

# !/usr/bin/python3
# -*- coding: utf-8 -*-
import re
from lxml import etree
import requests
import time
from tqdm import tqdm
import os
from urllib.request import urlopen

def download_from_url(url, dst):
    """
    @param: url to download file
    @param: dst place to put the file
    :return: bool
    """
    # 获取文件长度
    try:
        file_size = int(urlopen(url).info().get('Content-Length', -1))
    except Exception as e:
        print(e)
        print("错误,访问url: %s 异常" % url)
        return False

    # print("file_size",file_size)
    # 判断本地文件存在时
    if os.path.exists(dst):
        # 获取文件大小
        first_byte = os.path.getsize(dst)
    else:
        # 初始大小为0
        first_byte = 0

    # 判断大小一致,表示本地文件存在
    if first_byte >= file_size:
        print("文件已经存在,无需下载")
        return file_size


    header = {"Range": "bytes=%s-%s" % (first_byte, file_size)}

    pbar = tqdm(
        total=file_size, initial=first_byte,
        unit='B', unit_scale=True, desc=url.split('/')[-1])

    # 访问url进行下载
    req = requests.get(url, headers=header, stream=True)
    try:
        with(open(dst, 'ab')) as f:
            for chunk in req.iter_content(chunk_size=1024):
                if chunk:
                    f.write(chunk)
                    pbar.update(1024)
    except Exception as e:
        print(e)
        return False

    pbar.close()
    return True

def DownloadFile(url, name):
    """
    下载文件
    :param url:
    :param name:
    :return:
    """
    try:
        resp = requests.get(url=url, stream=True)
        content_size = int(resp.headers['Content-Length']) / 1024
        with open(name, "wb") as f:
            print("package total size is:", content_size, 'k,start...')
            for data in tqdm(iterable=resp.iter_content(1024), total=content_size, unit='k', desc=name):
                f.write(data)

        print("%s 下载成功"%url)
        return True
    except Exception as e:
        print(e)
        print("%s 下载失败" % url)
        return False

# 头部
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}

# 访问页面
response = requests.get('https://www.ku6.com/detail/371', headers=headers)
data = response.text

#构造了一个XPath解析对象并对HTML文本进行自动修正
html = etree.HTML(data)
# 获取视频播放链接
html_data = html.xpath('//div[@class="r_box"]/ul/li//a/@href')
# print("html_data", html_data, type(html_data))

# 遍历url
for i in html_data:
    url = "https://www.ku6.com%s" % i
    print(url)
        
    # 访问url
    response_1 = requests.get(url, headers=headers)
    data_1 = response_1.text
    # 正则匹配视频地址
    video = re.findall('type: "video/mp4", src: "(.*?)"',data_1)
    video_1 = video[0]
    print("video_1", video_1)
    x = video_1.split('/')[-1]
    
    # 本地保存视频文件名
    name = f'{x}.mp4'
    print("name", name)
    
    # 下载视频
    download_from_url(video_1, name)
    
    # 这里只演示第一个视频,直接break
    break
View Code

执行代码,效果如下:

本文参考链接:https://cloud.tencent.com/developer/article/1471132

 

Python爬取视频通常指的是从网页上下载视频文件到本地的过程。Python提供了很多库可以帮助完成这项任务,比如`requests`库可以用来发送网络请求,获取网页内容;`BeautifulSoup`或`lxml`等解析库可以用来解析网页内容;`youtube-dl`是一个专门用来下载YouTube等网站视频的命令行程序,也支持Python使用。 这里以`requests`和`BeautifulSoup`为例,简述一个基本的视频爬取流程: 1. 使用`requests`库发送GET请求获取目标网页内容。 2. 分析网页结构,确定视频资源的URL。 3. 如果视频资源是通过JavaScript动态加载的,可能需要使用`Selenium`等工具来模拟浏览器行为。 4. 使用`requests`库获取视频文件的二进制内容。 5. 将获取的视频内容写入文件。 下面是一个简化的代码示例: ```python import requests from bs4 import BeautifulSoup # 目标网页URL url = 'http://example.com/video-page.html' # 发送GET请求 response = requests.get(url) # 解析网页内容 soup = BeautifulSoup(response.text, 'html.parser') # 假设视频文件是通过<video>标签嵌入的 video_tag = soup.find('video') # 获取视频的真实地址,可能需要进一步解析 video_url = video_tag['src'] # 发送请求获取视频内容 video_response = requests.get(video_url, stream=True) # 确保请求成功 video_response.raise_for_status() # 写入文件 with open('video.mp4', 'wb') as file: for chunk in video_response.iter_content(chunk_size=1024): if chunk: # 过滤掉保持连接的新块 file.write(chunk) ``` 需要注意的是,爬取视频应遵守相关网站的服务条款和版权法规。一些网站明确禁止未经授权的视频下载,因此在进行爬取之前,应仔细检查网站的robots.txt文件和版权声明。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值