Python爬虫(5) --爬取网页视频

news2024/11/23 22:10:42

文章目录

  • 爬虫
  • 爬取视频
    • 指定url
    • 发送请求
      • UA伪装
      • 请求页面
    • 获取想要的数据
      • 解析定位
      • 定位音视频位置
  • 存放视频
  • 完整代码实现
  • 总结

爬虫

Python 爬虫是一种自动化工具,用于从互联网上抓取网页数据并提取有用的信息。Python 因其简洁的语法和丰富的库支持(如 requests、BeautifulSoup、Scrapy 等)而成为实现爬虫的首选语言之一。

Python爬虫获取浏览器中的信息,实际上是模仿浏览器上网的行为。上一篇中,我们尝试着爬取了一个网站页面的图片内容,完成获取信息需要完成四步:

  1. 指定url
  2. 发送请求
  3. 获取你想要的数据
  4. 数据解析

这次我们来试试用同样的方法爬取网站页面的视频看看可以成功吗?

爬取视频

我们来试试爬取以下网页的视频:

https://www.bilibili.com/video/BV12z421z75d/?spm_id_from=333.1007.tianma.2-1-4.click&vd_source=4b1ef23e5d47e143cfb702705740719d

指定url

打开开发者控制台,找到页面的url:

url = "https://www.bilibili.com/video/BV12z421z75d/?spm_id_from=333.1007.tianma.2-1-4.click&vd_source=4b1ef23e5d47e143cfb702705740719d"

发送请求

在前前面的内容中,我们提到过,使用fake_useragent包进行UA伪装给自己一个访问身份,其实在页面中有给我们准备好的UA,只是使用fake_useragent包更方便,这次我们爬取视频,用页面给的UA。

UA伪装

同时,对于视频的爬取,网站都是有很强的反爬取能力,所以我们除此以外还需要在申请访问页面时,输入Referer防盗链以及Cookie身份信息(记得登录网站哦!),

在这里插入图片描述

和找寻url时一样,在同一个页面往下滑就能找到页面给的Cookie身份信息。

接着往下滑:

在这里插入图片描述

同样的,找到Referer防盗链和页面给的UA。

head = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
    # 防盗链
    , "Referer": "https://www.bilibili.com/" # 网页自带的防盗链,我们告诉它从哪里向网页发送的请求
    ,
    "Cookie": "buvid3=C05B40CB-6A34-98BA-39D6-53A15FB1331D09014infoc; b_nut=1721443209; b_lsid=7E252C23_190CE02D1EA; bsource=search_bing; _uuid=2A4DF7DB-1415-18110-810D10-61B6E716441309713infoc; enable_web_push=DISABLE; header_theme_version=undefined; bmg_af_switch=1; bmg_src_def_domain=i1.hdslb.com; buvid_fp=4737552723e0dc057e8798fde01861bc; buvid4=8B3D0C60-C137-8D41-1DA5-4FB60839F89009729-024072002-402qiK5%2F0O1ew%2BiXfV11Kg%3D%3D; home_feed_column=5; browser_resolution=1872-966; CURRENT_FNVAL=4048; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjE3MDI0MjksImlhdCI6MTcyMTQ0MzE2OSwicGx0IjotMX0.rVZ9CiFYg3l5zrKtSm5jk880b2vYdADHdnTpO64kMog; bili_ticket_expires=1721702369; rpdid=|(J|)|~~|YYl0J'u~kuRRJkRu; SESSDATA=fd47394e%2C1736996380%2C3b724%2A71CjCpXPh-TmqNj96oUDW0altJZ6Iw84xOinBCAAhuZ1G-wxw0FFQR-j2_HvZPJtNgLl0SVmRDc2R6RWg3azBMUzVnVklNRGxBSGVXbWZiT2FydVNZVjM2MU1sQzkzQ3ZYMlNwLTdteUFQby0tWjlSaS1oWkVnbXVfRE8zOEd4VEFQbkNFNktMMVNRIIEC; bili_jct=643bc60a12be959fcaf2a7435e37b218; DedeUserID=152019087; DedeUserID__ckMd5=abf7b9e65385947c; sid=5voxt773"
} #自己的网页登录信息

将页面给的UA、Referer防盗链和Cookie身份信息都放在head中。

请求页面

response = requests.get(url, headers=head)

获取想要的数据

我们在爬取图片时,我们在寻找图片的地址,那我们视频的位置在哪里?怎么获取呐?

在这里插入图片描述

第一步点击Element,第二部找到html标签,在该标签下,找到第四个script标签。如下:

在这里插入图片描述

这里面就是我们要获取的视频信息啦,前20个字符不需要。

解析定位

from lxml import etree
tree = etree.HTML(res_text)
base_info = "".join(tree.xpath("/html/head/script[4]/text()"))[20:]	#前20个字符我们不要
#print(base_info)  #可以打印看看,有没有获取数据

我们看到,视频信息看到的是字典形式,但是获取信息时返回的是字符串形式,我们要将其转换一下:

info_dict = json.loads(base_info)	#将获取到的数据变成字典形式

因为b站的视频,视频和音频时分开的,所以我们得从信息中分别定位到视频和音频位置。但是这个信息密密麻麻的看起来很不方便,我们去响应Response中寻找它:

在这里插入图片描述

在这里插入图片描述

打开响应Response,然后找到第四个script标签,我们能看到有个video标签,获取音频url,同样的在第四个script标签下面还有audio视频url。

定位音视频位置

这样我们对视频与音频的位置进行访问(记住!!获取的数据已经被转换成字典了!!):

#字典的取值是通过取健的位置得到值:
以下代码理解为:在data中取dash的值,然后再dash的值中取video的值………………最后取到音视频url
video_url = info_dict["data"]["dash"]['video'][0]["baseUrl"]
audio_url = info_dict["data"]["dash"]['audio'][0]["baseUrl"]

video_content = requests.get(video_url, head).content	#和图片一样,访问后用content接收存储
audio_content = requests.get(audio_url, head).content

存放视频

with open()可以自己创建文件存放。

with open("video.wmv", "wb") as f:
    f.write(video_content)
with open("audio.mp4", "wb") as fp:
    fp.write(audio_content)

完整代码实现

import json
import fake_useragent
import requests
from lxml import etree

if __name__ == '__main__':
    head = {
       "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
       # 防盗链
       , "Referer": "https://www.bilibili.com/" # 网页自带的防盗链,我们告诉它从哪里向网页发送的请求
       ,
       "Cookie": "buvid3=C05B40CB-6A34-98BA-39D6-53A15FB1331D09014infoc; b_nut=1721443209; b_lsid=7E252C23_190CE02D1EA; bsource=search_bing; _uuid=2A4DF7DB-1415-18110-810D10-61B6E716441309713infoc; enable_web_push=DISABLE; header_theme_version=undefined; bmg_af_switch=1; bmg_src_def_domain=i1.hdslb.com; buvid_fp=4737552723e0dc057e8798fde01861bc; buvid4=8B3D0C60-C137-8D41-1DA5-4FB60839F89009729-024072002-402qiK5%2F0O1ew%2BiXfV11Kg%3D%3D; home_feed_column=5; browser_resolution=1872-966; CURRENT_FNVAL=4048; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjE3MDI0MjksImlhdCI6MTcyMTQ0MzE2OSwicGx0IjotMX0.rVZ9CiFYg3l5zrKtSm5jk880b2vYdADHdnTpO64kMog; bili_ticket_expires=1721702369; rpdid=|(J|)|~~|YYl0J'u~kuRRJkRu; SESSDATA=fd47394e%2C1736996380%2C3b724%2A71CjCpXPh-TmqNj96oUDW0altJZ6Iw84xOinBCAAhuZ1G-wxw0FFQR-j2_HvZPJtNgLl0SVmRDc2R6RWg3azBMUzVnVklNRGxBSGVXbWZiT2FydVNZVjM2MU1sQzkzQ3ZYMlNwLTdteUFQby0tWjlSaS1oWkVnbXVfRE8zOEd4VEFQbkNFNktMMVNRIIEC; bili_jct=643bc60a12be959fcaf2a7435e37b218; DedeUserID=152019087; DedeUserID__ckMd5=abf7b9e65385947c; sid=5voxt773"
    } #自己的网页登录信息

    # 1、url
    url = "https://www.bilibili.com/video/BV12z421z75d/?spm_id_from=333.1007.tianma.2-1-4.click&vd_source=4b1ef23e5d47e143cfb702705740719d"

    #2、发送请求
    response = requests.get(url, headers=head)

    # 3、获取想要的数据
    res_text = response.text

    # 4、数据解析
    tree = etree.HTML(res_text)

    with open("b.html", "w", encoding="utf8") as f:
       f.write(res_text)
	
    base_info = "".join(tree.xpath("/html/head/script[4]/text()"))[20:]    #前20个字符我们不要
    # print(base_info)

    info_dict = json.loads(base_info)  #将获取到的数据变成字典形式
	
    #定位音视频位置
    video_url = info_dict["data"]["dash"]['video'][0]["baseUrl"]
    audio_url = info_dict["data"]["dash"]['audio'][0]["baseUrl"]

    video_content = requests.get(video_url, head).content
    audio_content = requests.get(audio_url, head).content


    with open("video.wmv", "wb") as f:
       f.write(video_content)
    with open("audio.mp4", "wb") as fp:
       fp.write(audio_content)

爬取成功显示:

在这里插入图片描述

查看视频去文件夹中打开查看,由于音视频是分开的,可以通过剪映等视频剪辑软件将他们拼接在一起。

总结

本篇介绍了网页视频的爬取:

  1. 指定url
  2. 发送请求
    1. UA伪装:UA、Referer防盗链和Cookie身份信息都放在head中
  3. 获取你想要的数据
    1. 在Element获取视频信息
  4. 数据解析
    1. 在响应Response中,定位视频的具体位置,请求访问它

特别注意:

其实与爬取文本和图片区别不大,主要是定位到视频的位置。

网页都有反爬虫意识,反复多次爬取可能会拒绝你获取信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1943920.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

typora激活问题

不使用激活码解决。 1.右键桌面图标,打开文件位置 2.按照 Typora路径到 —> resources —> page-dist —> static —> js 这个路径找到这两个文件 LicenseIndex.180dd4c7.xxxxxxx.chunk.js LicenseIndex.180dd4c7.xxxxxxx.chunk.js (也可…

MySQL简介(超详细)

课程目标 • 了解数据库基本概念 • 熟悉MySQL数据库的常用操作 • 掌握Insert、Delete、Update、Select等常用SQL语句 • 理解MySQL数据库的事务,索引以及函数 • 了解MySQL数据库的存储过程和触发器 一、什么是数据库? 概念:数据库(D…

立创梁山派--移植开源的SFUD和FATFS实现SPI-FLASH文件系统

本文主要是在sfud的基础上进行fatfs文件系统的移植,并不对sfud的移植再进行过多的讲解了哦,所以如果想了解sfud的移植过程,请参考我的另外一篇文章:传送门 正文开始咯 首先我们需要先准备资料准备好,这里对于fatfs的…

Windows图形界面(GUI)-MFC-C/C++ - MFC项目工程框架解析

公开视频 -> 链接点击跳转公开课程博客首页 -> e​​​​​​链接点击跳转博客主页 目录 MFC项目 项目选择 配置安装 程序引导 MFC框架 环境设置 程序框架 代码编写 MFC解析 程序入口 执行流程 代码结构 应用程序类 窗口框架类 消息处理 消息类型 消息…

探索扫描二维码登录的奥秘:从前端到后端的无缝连接

🎉 博客主页:【剑九 六千里-CSDN博客】 🎨 上一篇文章:【React中的无状态组件:简约之美】 🎠 系列专栏:【面试题-八股系列】 💖 感谢大家点赞👍收藏⭐评论✍ 文章目录 1、…

[Jenkins]jenkins-cli.jar调用用户token启动任务

背景:项目入了一群od伙伴,但是od伙伴有单独的构建工程需要提交,由于jenkins的版本太拉闸,不能配置根据role和项目分权限,插件安装失败,不得已想到一个办法。让OD伙伴,在本地,用java&…

音频剪辑里的几种基础操作

音频对于视频的重要性,怎么强调都不为过,它在视频里扮演着举足轻重的角色,对观众有着极为深远的影响。下面为您阐述音频在视频中的关键意义: ① 情感传递:音频有强大的情感传达能力,借助声音的起伏变化、音…

windows网络应急排查

一、系统排查 msinfo32 #GUI显示的系统信息systeminfo #简单了解系统信息用户信息排查 排查恶意账号: 黑客喜欢建立相关账号用作远控: 1.建立新账号2.激活默认账号3.建立隐藏账号(windows中账号名$)cmd方法 net user #打印用户账号信息 ---看不到$结尾的隐藏账…

postgresql 使用navicat 导出报 gs_package 关系不存在问题解决。

1. 问题描述 临时接手的项目,使用的数据库是postgresql,使用navicat 17 Lite 免费版,导出就会报如下图所示的错误:2. 尝试的办法: 1) 换navicat 17 和navicat 17 for postgresql 试用版本 还是一样的错误。 2) 换pos…

大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

运维团队如何借助分布式部署提升监控效率与可靠性

随着企业IT基础设施的日益复杂和分布式架构的广泛应用,传统的监控解决方案已经难以满足现代运维团队的需求。在这样的背景下,分布式部署作为一种新型的监控架构,以其灵活性、可扩展性和高可用性,成为了运维团队提升监控效率与可靠…

uni-app pinia搭建

1.新建store文件 新建index.js,代码: // import { // createPinia // } from pinia //const store createPinia() import * as Pinia from pinia const pinia Pinia.createPinia() export * from "./modules/user" export * from ".…

MATLAB算法实战应用案例精讲-【数模应用】Kappa一致性检验(附MATLAB、python和R语言代码实现)

目录 前言 算法原理 Kappa系数 什么是一致性检验? 如何完成一致性检验? (一)ICC组内相关系数 (二)Kappa一致性系数 (三)Kendall W 协调系数 (四)Bland-Altman图 检验一致性方法 SPSS SPSSAU 一、案例介绍 二、问题分析 三、软件操作及结果解读 四、结…

【中项】系统集成项目管理工程师-第4章 信息系统架构-4.8云原生架构

前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…

【BUG】已解决:ValueError: All arrays must be of the same length

ValueError: All arrays must be of the same length 目录 ValueError: All arrays must be of the same length 【常见模块错误】 【解决方案】 问题原因 解决方法 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰&…

Transformer论文理解

学习一个东西之前首先要明白要去了解什么? 概念(组成),性质,特点,作用(用处) 概念: transformer是一种自然语言处理(NLP)和其他序列到序列(seq2seq)任务&…

大数据技术--实验01-Hadoop的安装与使用【实测可行】

使用下面表中的软件版本进行配置: 准备好后,按照下面的步骤进行配置。 配置VMware网络 在VMWare主界面,点击“编辑”>“虚拟网络编辑”菜单进入虚拟网卡参数设置界面。选择VMnet8条目,点击“NAT设置”按钮后可以看到我们的VM…

遇到not allow unquoted fieldName怎么办

前言 Exception in thread "main" com.alibaba.fastjson2.JSONException: not allow unquoted fieldName, offset 2, character , line 1, column 3, fastjson-version 2.0.25 { "data":null, "code":200, "msg":"成功"…

使用Django Rest Framework构建API

Django Rest Framework (DRF) 是一个强大且灵活的工具集,用以构建Web API。它基于Django,一个非常流行的Python Web框架。在本文中,我们将深入探讨如何使用DRF来构建一个高效、结构化的API。 目录 使用Django Rest Framework构建API 一、环…

c#Action委托和Func委托

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Action委托 {internal class Program{static void PrintString(){Console.WriteLine("hello world.");}static void PrintInt(int …