找回密码
 会员注册
查看: 27|回复: 0

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

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
72027
发表于 2024-9-9 08:58:04 | 显示全部楼层 |阅读模式
文章目录爬虫爬取视频指定url发送请求UA伪装请求页面获取想要的数据解析定位定位音视频位置存放视频完整代码实现总结爬虫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=4b1ef23e5d47e143cfb702705740719d1指定url打开开发者控制台,找到页面的url:url="https://www.bilibili.com/video/BV12z421z75d/?spm_id_from=333.1007.tianma.2-1-4.click&vd_source=4b1ef23e5d47e143cfb702705740719d"1发送请求在前前面的内容中,我们提到过,使用fake_useragent包进行UA伪装给自己一个访问身份,其实在页面中有给我们准备好的UA,只是使用fake_useragent包更方便,这次我们爬取视频,用页面给的UA。UA伪装同时,对于视频的爬取,网站都是有很强的反爬取能力,所以我们除此以外还需要在申请访问页面时,输入Referer防盗链以及Cookie身份信息(记得登录网站哦!),和找寻url时一样,在同一个页面往下滑就能找到页面给的Cookie身份信息。接着往下滑:同样的,找到Referer防盗链和页面给的UA。head={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/126.0.0.0Safari/537.36Edg/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"}#自己的网页登录信息1234567将页面给的UA、Referer防盗链和Cookie身份信息都放在head中。请求页面response=requests.get(url,headers=head)1获取想要的数据我们在爬取图片时,我们在寻找图片的地址,那我们视频的位置在哪里?怎么获取呐?第一步点击Element,第二部找到html标签,在该标签下,找到第四个script标签。如下:这里面就是我们要获取的视频信息啦,前20个字符不需要。解析定位fromlxmlimportetreetree=etree.HTML(res_text)base_info="".join(tree.xpath("/html/head/script[4]/text()"))[20:] #前20个字符我们不要#print(base_info)#可以打印看看,有没有获取数据1234我们看到,视频信息看到的是字典形式,但是获取信息时返回的是字符串形式,我们要将其转换一下:info_dict=json.loads(base_info) #将获取到的数据变成字典形式1因为b站的视频,视频和音频时分开的,所以我们得从信息中分别定位到视频和音频位置。但是这个信息密密麻麻的看起来很不方便,我们去响应Response中寻找它:打开响应Response,然后找到第四个script标签,我们能看到有个video标签,获取音频url,同样的在第四个script标签下面还有audio视频url。定位音视频位置这样我们对视频与音频的位置进行访问(记住!!获取的数据已经被转换成字典了!!):#字典的取值是通过取健的位置得到值:以下代码理解为:在data中取dash的值,然后再dash的值中取video的值………………最后取到音视频urlvideo_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).content1234567存放视频withopen()可以自己创建文件存放。withopen("video.wmv","wb")asf:f.write(video_content)withopen("audio.mp4","wb")asfp:fp.write(audio_content)1234完整代码实现importjsonimportfake_useragentimportrequestsfromlxmlimportetreeif__name__=='__main__':head={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/126.0.0.0Safari/537.36Edg/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、urlurl="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)withopen("b.html","w",encoding="utf8")asf: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).contentaudio_content=requests.get(audio_url,head).contentwithopen("video.wmv","wb")asf:f.write(video_content)withopen("audio.mp4","wb")asfp:fp.write(audio_content)12345678910111213141516171819202122232425262728293031323334353637383940414243444546爬取成功显示:查看视频去文件夹中打开查看,由于音视频是分开的,可以通过剪映等视频剪辑软件将他们拼接在一起。总结本篇介绍了网页视频的爬取:指定url发送请求UA伪装:UA、Referer防盗链和Cookie身份信息都放在head中获取你想要的数据在Element获取视频信息数据解析在响应Response中,定位视频的具体位置,请求访问它特别注意:其实与爬取文本和图片区别不大,主要是定位到视频的位置。网页都有反爬虫意识,反复多次爬取可能会拒绝你获取信息。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 23:00 , Processed in 0.432797 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表