首页 > Python资料 博客日记
Python爬虫(5) --爬取网页视频
2024-10-10 01:00:08Python资料围观29次
爬虫
Python 爬虫是一种自动化工具,用于从互联网上抓取网页数据并提取有用的信息。Python 因其简洁的语法和丰富的库支持(如 requests、BeautifulSoup、Scrapy 等)而成为实现爬虫的首选语言之一。
Python爬虫获取浏览器中的信息,实际上是模仿浏览器上网的行为。上一篇中,我们尝试着爬取了一个网站页面的图片内容,完成获取信息需要完成四步:
- 指定url
- 发送请求
- 获取你想要的数据
- 数据解析
这次我们来试试用同样的方法爬取网站页面的视频看看可以成功吗?
爬取视频
我们来试试爬取以下网页的视频:
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)
爬取成功显示:
查看视频去文件夹中打开查看,由于音视频是分开的,可以通过剪映等视频剪辑软件将他们拼接在一起。
总结
本篇介绍了网页视频的爬取:
- 指定url
- 发送请求
- UA伪装:UA、Referer防盗链和Cookie身份信息都放在head中
- 获取你想要的数据
- 在Element获取视频信息
- 数据解析
- 在响应Response中,定位视频的具体位置,请求访问它
特别注意:
其实与爬取文本和图片区别不大,主要是定位到视频的位置。
网页都有反爬虫意识,反复多次爬取可能会拒绝你获取信息。
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj