当前位置: 首页 > article >正文

python爬虫----爬取视频实战

python爬虫-爬取视频

在这里插入图片描述

  • 本次爬取,还是运用的是requests方法

  • 首先进入此网站中,选取你想要爬取的视频,进入视频页面,按F12,将网络中的名称栏向上拉找到第一个并点击,可以在标头中,找到后续我们想要的一些信息。
    在这里插入图片描述

  • 爬取视频的步骤大致分为

    • 1、UA伪装
    • 2、获取url
    • 3、发送请求
    • 4、获取响应的数据
    • 5、数据解析
      • 获取存放视频和音频数据的"window.playinfo"文本内容
      • 分别获取视频和音频的url
      • 将获取到的视频和音频数据存放在两个不同的文件中
  • UA伪装

    • 找到Cookie并复制—>用户登陆此网站的个人Cookie信息,每个人的都不同

    • 找到Referer并复制—>每个网站的防盗链

    • 找到User-Agent并复制—>标头的最下面
      在这里插入图片描述

在这里插入图片描述

# UA伪装
 head = {
     "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
     "Referer":"https://search.bilibili.com/all?",
     "Cookie":"buvid_fp_plain=undefined; DedeUserID=121991448; DedeUserID__ckMd5=9e0883af22947c47; CURRENT_BLACKGAP=0; buvid4=B52817A7-548A-24AF-F6D1-671539F8D84A46089-022112911-pIOydL%2Bx%2FtJ0KaVCrqVHDnapk68hRLXn0o6mnH1vuNcEyHPeCVTwrg%3D%3D; is-2022-channel=1; enable_web_push=DISABLE; header_theme_version=CLOSE; rpdid=|(m))m~uRmm0J'u~|RJlulkm; FEED_LIVE_VERSION=V_WATCHLATER_PIP_WINDOW2; PVID=1; fingerprint=d26d60ed0ec0d0f7a6b5056693a8acbb; buvid_fp=d26d60ed0ec0d0f7a6b5056693a8acbb; CURRENT_QUALITY=80; buvid3=7F1C4251-972B-A6E5-38AD-63626520698301889infoc; b_nut=1733312401; _uuid=CC9A4FE3-ECB2-A4DD-710310-83446BD14310A02817infoc; home_feed_column=5; browser_resolution=1707-946; bp_t_offset_121991448=1012262974930288640; b_lsid=C3B8510D4_193F8977A84; bmg_af_switch=1; bmg_src_def_domain=i1.hdslb.com; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzUzMDE2OTgsImlhdCI6MTczNTA0MjQzOCwicGx0IjotMX0.9UDClgiB9GUJu1e6ZsyN6e-qeKtxbDOL1V8OdLFuIJo; bili_ticket_expires=1735301638; SESSDATA=43e92030%2C1750594499%2C7d892%2Ac1CjDdpJOFi23g70Eic2Tw3nEMZnLYzkVoT_5Nm4swH5FTg8uq5rFABX3tQAXj3SfJX0USVkFXWGRFSlhwS0hHWHdoc0tzLVBhVEZJWWI4OWdxeVZJLTBUdldEY2lZS1dOUmFJSTJwYklaM0ktVjJYb0lJZW9vdTcyWUlLOXJBM0h0VERtWWF1RzhBIIEC; bili_jct=d581670c772ec7051f16a05ec30fcb8b; sid=79g6fnjf; CURRENT_FNVAL=4048"
 }

  • 获取url

    • 可以在标头中看到请求URL
      在这里插入图片描述
    url ="https://www.bilibili.com/video/BV1N84y1P7en/?spm_id_from=333.337.search-card.all.click&vd_source=15b581d46c0893c3904b6158b122aca5"
    
  • 发送请求

    • 可以在标头中看到请求方式,这里的请求方式是GET方法
      在这里插入图片描述
    # 发送请求,这里的请求方式是get方法
    response = requests.get(url, headers = head)
    
  • 获取响应的数据

    • 这里使用requests中的response.text方法
    # 获取响应的数据
    res_text = response.text
    
  • 数据解析

    • 使用 lxml 库中的 etree 方法
    • 并将获取到的数据写入到一个html的文件中,进入这个文件可以通过浏览器打开,查看是否是我们将要获取视频的页面
    tree = etree.HTML(res_text)
    
    with open("bili2.html", "w", encoding="utf-8") as f:
        f.write(res_text)
    
    • 获取存放视频和音频数据的"window.–playinfo–"文本内容

      • 因为视频和音频的数据都存在window.–playinfo–中,因此我们需要在元素栏下通过标签定位到它,但是我们只需要其内容
      • 因为window.–playinfo–的内容是一个大json字符串,所以我们可以通过json.loads的方法将它变成一个字典,方便后面通过键来取视频和音频的数据
        在这里插入图片描述
      base_info = "".join(tree.xpath("/html/head/script[4]/text()"))[20:]
      info_dict = json.loads(base_info)
      
    • 分别获取视频和音频的url

      • 在元素栏中可以看出window.–playinfo–的内容太多了,不利于我们寻找视频和音频的数据,我们可以在网络栏下,名称中第一个数据的响应中也可以找到,耐心一点向下慢慢通过标签找到window.–playinfo–,再在其中找到视频和音频的baseUrl
      • 注意也可以使用Ctrl+f进行输入查找速度更快,更利于我们排除并查找
      • 获取后,再次通过get请求方式,发送请求
      • 注意:图片,视频和音频都是二进制内容,所以用content属性获取
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
      video_url = info_dict["data"]["dash"]['video'][0]["baseUrl"]
      audio_url = info_dict["data"]["dash"]['audio'][0]["baseUrl"]
      
      video_content = requests.get(video_url, headers=head).content
      audio_content = requests.get(audio_url, headers=head).content
      
  • 最后将获取到的视频和音频的数据分别存放在两个不同的文件中,视频可以是MP4或者是wmv格式,音频是MP4格式

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

完整代码

import requests
from lxml import etree
import json

if __name__ == '__main__':
    # UA伪装
    head= {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
        "Referer": "https://search.bilibili.com/all?",
        "Cookie": "buvid_fp_plain=undefined; DedeUserID=121991448; DedeUserID__ckMd5=9e0883af22947c47; CURRENT_BLACKGAP=0; buvid4=B52817A7-548A-24AF-F6D1-671539F8D84A46089-022112911-pIOydL%2Bx%2FtJ0KaVCrqVHDnapk68hRLXn0o6mnH1vuNcEyHPeCVTwrg%3D%3D; is-2022-channel=1; enable_web_push=DISABLE; header_theme_version=CLOSE; rpdid=|(m))m~uRmm0J'u~|RJlulkm; FEED_LIVE_VERSION=V_WATCHLATER_PIP_WINDOW2; PVID=1; fingerprint=d26d60ed0ec0d0f7a6b5056693a8acbb; buvid_fp=d26d60ed0ec0d0f7a6b5056693a8acbb; CURRENT_QUALITY=80; buvid3=7F1C4251-972B-A6E5-38AD-63626520698301889infoc; b_nut=1733312401; _uuid=CC9A4FE3-ECB2-A4DD-710310-83446BD14310A02817infoc; home_feed_column=5; browser_resolution=1707-946; bp_t_offset_121991448=1012262974930288640; b_lsid=C3B8510D4_193F8977A84; bmg_af_switch=1; bmg_src_def_domain=i1.hdslb.com; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzUzMDE2OTgsImlhdCI6MTczNTA0MjQzOCwicGx0IjotMX0.9UDClgiB9GUJu1e6ZsyN6e-qeKtxbDOL1V8OdLFuIJo; bili_ticket_expires=1735301638; SESSDATA=43e92030%2C1750594499%2C7d892%2Ac1CjDdpJOFi23g70Eic2Tw3nEMZnLYzkVoT_5Nm4swH5FTg8uq5rFABX3tQAXj3SfJX0USVkFXWGRFSlhwS0hHWHdoc0tzLVBhVEZJWWI4OWdxeVZJLTBUdldEY2lZS1dOUmFJSTJwYklaM0ktVjJYb0lJZW9vdTcyWUlLOXJBM0h0VERtWWF1RzhBIIEC; bili_jct=d581670c772ec7051f16a05ec30fcb8b; sid=79g6fnjf; CURRENT_FNVAL=4048"
    }

    # 1、指定url
    url ="https://www.bilibili.com/video/BV1N84y1P7en/?spm_id_from=333.337.search-card.all.click&vd_source=15b581d46c0893c3904b6158b122aca5"

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

    # 3、获取响应的数据
    res_text = response.text

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

    with open("bili2.html", "w", encoding="utf-8") as f:
        f.write(res_text)

    base_info = "".join(tree.xpath("/html/head/script[4]/text()"))[20:]
    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, headers=head).content
    audio_content = requests.get(audio_url, headers=head).content

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

注意:video2.wmv和audio2.mp4视频和音频文件是分开的,故此需要借助其他一些剪辑工具进行合并比如剪映,再次就不展示了,可以自行尝试
在这里插入图片描述
需要进入到文件夹进行打开视频和音频
仅教学爬取使用,请合法爬取。


http://www.kler.cn/a/453166.html

相关文章:

  • Python实现机器学习驱动的智能医疗预测模型系统的示例代码框架
  • Glossary 词汇表中英文对照
  • 论文研读:AnimateDiff—通过微调SD,用图片生成动画
  • cannot import name ‘_C‘ from ‘pytorch3d‘
  • 《计算机网络(第7版)-谢希仁》期末考试复习题和答案(总结整理)
  • 查询 MySQL 默认的存储引擎(SELECT @@default_storage_engine;)
  • <数据集>风力发电机损伤识别数据集<目标检测>
  • 基于 LMS 算法的离散傅里叶分析器
  • 2024年12月26日Github流行趋势
  • 以太坊的演变:二层扩容的无限潜力和一键多链
  • 2023 年 12 月青少年软编等考 C 语言四级真题解析
  • git--批量修改本地用户名和邮箱
  • ovirt-engine登录报错
  • Lazydocker:高效便捷的Docker管理工具
  • Linux编程中的性能优化方法和工具
  • 精准识别花生豆:基于EfficientNetB0的深度学习检测与分类项目
  • @RequestParam和@PathVariable的解释与区别
  • 从自动驾驶到具身智能漫谈
  • 正则表达式(三剑客之sed)
  • HarmonyOS NEXT 实战之元服务:静态案例效果---每日玩机技巧
  • 跨境电商培训:云手机的新舞台
  • 某车之家appso层签名逆向
  • 2024楚慧杯WP
  • CultureLLM 与 CulturePark:增强大语言模型对多元文化的理解
  • 力扣-数据结构-3【算法学习day.74】
  • 存储块的获取与释放