Python网络爬虫——爬取视频网站源视频

标签: python  http  爬虫  后端  

学习前提

1、了解python基础语法
2、了解re、selenium、BeautifulSoup、os、requests等python第三方库

1.引入库

爬取网站视频需要引入的第三方库:

import os 
from selenium import webdriver 
import requests 
from bs4 import BeautifulSoup 
import re 

模块用处:

1、os模块:文件目录操作模块,用于创建或者删除目录或文件。
2、selenium模块:python请求模块之一,用于某些特殊请求。
3、requests模块:用于请求网页地址。
4、BeautifulSoup模块:用于解析网页,获取页面元素或内容。
5、re模块:正则表达式,本程序中用于匹配视频链接。


2.请求网页地址

请求页面:

"""请求页面"""
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"
} #请求
url = "http://www.kakadm.com/anime/2417/" #网页地址,这里以卡卡动漫中的无限斯特拉托斯为例
r = requests.get(url, headers=header)
html = r.text #以二进制打印页面

由上述代码获取如下页面:
请求开始页面

请求头(反爬机制中的一种):

headers中包含网页请求中的请求头,每一个浏览器都有属于自己的请求头,因此需要更改,以免请求失败


3.解析网页,获取播放链接

解析上述页面:

"""解析页面"""
soup = BeautifulSoup(html, "html.parser")
urls = soup.find("div", class_="movurl").find_all("a") #查找视频播放链接

videourls = []
for u in urls:
    videourls.append(u.get("href")) #由分析网页元素可知,仅获取链接部分内容

# 获取视频播放地址
str = "http://www.kakadm.com/"
for index, item in enumerate(videourls):
    videourls[index] = str + item #加上前缀,获取13个视频播放链接

由上述代码获取如下页面:
在这里插入图片描述


4.解析网页,获取视频源链接,即获取后缀名含.mp4的链接

由上述代码获取视频播放页面后,获取源视频链接:

# 请求获取视频源mp4
videos = []
title = []
chrome_options = webdriver.ChromeOptions()
# 使用headless无界面浏览器模式,即不需要打开浏览器
chrome_options.add_argument('--headless')  # 增加无界面选项
chrome_options.add_argument('--disable-gpu')  # 如果不加这个选项,有时定位会出现问题
flag = 0
name = ''
for u in videourls:
    # 启动浏览器,获取网页源代码
    b = webdriver.Chrome(options=chrome_options)  # 建立Chrome的驱动
    b.implicitly_wait(10)  # 隐式等待,动态查找元素
    b.get(u)  # 在Chrome上打开网址

    # 获取视频名字,如:无限斯特拉托斯
    if flag == 0:
        soup = BeautifulSoup(html, "html.parser")
        name = soup.find("title").string.split('-')[0]  # 获取标签内的内容
        flag = 1

    # 进入iframe内嵌网页
    b.switch_to.frame("playbox")  # 针对iframe标签,(id)
    html = b.page_source  # 打印页面

    soup = BeautifulSoup(html, "html.parser")
    t = soup.find("title").string.split(' ')[0]  # 视频命名
    v = re.findall(r'(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+\.mp4)',
                   html)  # 获取mp4网址
    t = name + " " + t
    title.append(t)
    videos.append(v)
    print(v)
    b.quit()  # 退出

由上述代码获取如下视频源链接:
在这里插入图片描述

注意:
在本例子中,卡卡动漫里的视频源链接放在ifame标签中,这是基本反爬机制之一。ifame标签会隐藏其内的内容,用requests模块不能直接访问,需要在浏览器中访问,即需要selenium模块,通过针对iframe标签的方法b.switch_to.frame(id)
打开浏览器来访问iframe标签,并获取隐藏其中的视频源链接。

5.下载视频,并储存到指定文件夹

由上述代码获取视频源链接后,下载到指定文件目录:

"""下载mp4视频"""
i = 0  # 显示当前下载第几个视频
j = 0  # 遍历视频标题列表
# 创建视频文件目录
path = 'D:\Softdownload\Python\\videos\{}\\'.format(name)
if os.path.exists(path) == False:  # 如果文件不存在
    os.mkdir(path)
for index, item in enumerate(videos):
    i += 1
    print("正在下载第{}个视频".format(i))
    file_name = title[j] + '.mp4'  # 命名成mp4格式
    j += 1
    r = requests.get(videos[index][0], headers=header)  # 请求里面的网址
    with open(path + file_name, 'wb') as f:  # 在指定文件夹下载视频,没有就创建
        f.write(r.content)

由上述代码会建立如下文件目录:
在这里插入图片描述

版权声明:本文为weixin_43552452原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43552452/article/details/109536703

智能推荐

css弹性盒模型详解----justify-content

本篇文章详细介绍justify-content 效果演示如下: 效果演示如下: 效果演示如下: 效果演示如下: 效果演示如下...

html5拖放--15行js代码实现两个div内容互换

本文首发于我的个人博客:http://cherryblog.site/ ,欢迎大家前去参观 本文项目地址,sortable插件地址:https://github.com/sunshine940326/sortable demo地址:https://github.com/sunshine940326/drag 在写我们后台的管理程序中需要有一个拖放的功能,然后我们有一个这样的功能,实现11个固定且大...

git切换分支报错,不管什么标题名字,都报非法字符,所以就不起名字了。

切换分支的时候,报了标题这么个错误,error: ”xxx did not match any file(s) known to git. 看见不能切换分支,我首先 git status 查看了一下当前状态,如下图 然后,就会发现,其实我的这个错误非常明显,就是在我的 beat 分支下有文件修改,所以切换不了。ok,解决方法: 1. 如果修改的这些文件没什么用,完全可以删除。(我这儿的...

Oracle分析函数之LEAD和LAG实际应用

Oracle分析函数之LEAD和LAG实际应用 在前几天的工作中按照客户的需求,需要对客户信息进行数据分析,即某人存在多个状态的账号,将客户信息账号状态分析出结果,和客户确认汇报,根据保留规则,保留唯一账号,以保证程序可用性。起初,根据聚合函数进行查询分析,需要写一大串的SQL,即不美观又复杂,很容易产生错误。后续想到Oracle分析函数中的lead和lag,SQL简洁了很多且容易产生报告数据。 ...

小知识积累(不断更新中)

判断变量的类型(数组,对象) tyopof:不推荐,因为无法区别数组与对象,数组是对象的子对象 instanceof:可以使用 还可以用来判断是否属于函数 Object.prototype.toString.call():最兼容,推荐使用 定时器的执行顺序或机制 js是单线程的,浏览器遇到setTimeout或者setInterval会把定时器推入浏览器的待执行事件队列里面但是不执行,先执行完当前...

猜你喜欢

ROS自学实践(6):ROS进行激光SLAM建图——gmapping

本节主要记录运行ROS自带的SLAM建模包gmapping方法,为后续理解这些代码,建立自己的SLAM算法打下基础。 基于粒子滤波算法 二维栅格地图 需要里程计信息 1.通过命令行安装gmapping包 2.配置gmapping节点 3.运行gazebo模型及gmapping节点 4.打开rviz 添加laserscan、map、robotmodel模型 5.移动小车,建立模型 6.保存当前地图 ...

face-api.js中加入MTCNN:进一步支持使用JS实时进行人脸跟踪和识别

如果你现在正在阅读这篇文章,那么你可能已经阅读了我的介绍文章(JS使用者福音:在浏览器中运行人脸识别)或者之前使用过face-api.js。如果你还没有听说过face-api.js,我建议你先阅读介绍文章再回来阅读本文。 和往常一样,本文中为你准备了一个代码示例。我们将解析一个小的应用程序,这个程序将在浏览器中访问摄像头图像执行实时人脸检测和人脸识别,让我们开始吧! 使用face-api.js进行...

Centos yum安装tomcat8 (阿里云的端口坑!!!)

1.官网下载上传至服务器并解压 2.将解压下来的文件移动到自己的目录下 3.进入tomcat 的bin目录启动服务 4.配置 5.阿里云的端口 阿里云服务器 阿里云控制台打开端口:...

idea springboot项目热更新

前言 在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果,往往需要重启应用查看改变效果。这种开发体验无疑是很差的,Springboot为我们提供了devtools来帮助我们实现热更新。 使用springboot提供的spring-boot-devtools 添加devtools依赖 springboot maven插件配置 application.properties配置 启动...

JavaScript中Map和ForEach的区别

译者按: 惯用Haskell的我更爱map。 原文: JavaScript — Map vs. ForEach - What’s the difference between Map and ForEach in JavaScript? 译者: Fundebug 为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。 如果你已经有使用JavaSc...