python 爬取CSDN 视频

爬虫实现基本流程

一 数据来源分析

1.明确需求

明确采集的网站及数据内容

  • 目标:爬取csdn免费学习课程
  • 网址:https://edu.csdn.net/learn/39353/638733?spm=1002.2001.3001.4157
  • 数据:视频内容/视频标题

2. 抓包分析

通过浏览器开发者工具分析对应数据位置

视频网站类型

  • 普通视频网站

开发者工具->网络(network)->媒体文件(media)->视频链接->关键字使用视频链接中的一段参数进行搜索

  • m3u8流媒体文件:把完整的视频内容,分割成N个片段(ts文件),所有片段内容都在于m3u8文件中

如果点击 网络->媒体,没有加载视频链接,而点击全部数据包查看是否存在大量xx.ts文件,则可以判定为使用m3u8流媒体文件
搜索关键词m3u8->找到请求后缀为.m3u8->查看预览,则会发现大量的ts链接

该网站的视频类型:m3u8流媒体文件
(1) 点击开发者工具,选择网络的媒体文件,刷新网站发现无链接。
在这里插入图片描述
(2) 输入关键字:m3u8->找到URL的后缀为.m3u8->查看预览
搜索

分析:完整视频内容 ->分成N个ts片段 ->m3u8文件中
思路:因此我们可以直接请求m3u8链接获取视频内容,然后获取所有ts链接,将所有视频链接组装成一个视频

m3u8数据包地址:https://bizapi.csdn.net/edu-academy-web/v1/material/info?materialId=638733&courseId=39353&cId=39353&playerVersion=2&isFree=2&isMember=2
查看该数据包的预览信息,发现采用AES加密,因此首先需要请求URI得到KEY,其次将偏移量IV转为16进制,然后后根据KEY和IV制作解码器,最后在请求每一个ts获取视频内容后,利用解码器解密后以追加模式保存视频内容。
在这里插入图片描述

进一步分析,m3u8链接从哪里获取?
根据m3u8请链接搜索,找到包含m3u8的数据包地址,解析数据包从而获得m3u8的地址。

二.代码实现步骤

1. 发送请求

模拟浏览器对于url地址发送请求
模拟浏览器

  • headers快速构建小技巧
在开发者工具中可以复制
		- 开发者工具->网络->点击对应数据包 ->标头->请求标头
headers格式:字典形式
  • 快速构建键值对小技巧
1. 选中替换的内容 ctrl+R
2. 勾选 .*通过正则表达式进行快速替换
   (.*?):(.*)
   '$1': '$2',

发送请求

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

2.获取数据

获取服务器返回响应数据

获取响应数据三种方式:

  • response.text
  • response.json()
    • 必须是完整的json数据格式
  • response.content
    • 获取响应二进制数据 -> 二进制
      • 常用于获取图片/音频/视频/特定格式文件,内容
      • 作为获取数据进行保存的时候

3.解析数据

提取我们需要的数据内容
解析方法

  • 解析方法
    • re正则:通过元字符对于字符串进行数据解析
    • css: 根据标签属性提取数据内容
    • xpath:根据标签节点提取数据内容
    • json解析:字典取值/jsonpath
    • 直接处理:字符串高级方法 split,replace
如何选择解析方法
1. 根据返回响应情况针对性选择
2. 根据个人喜好

re正则表达式简单应用

re.findall(pattern,string) ->调用re模块里面findall方法
pattern
" . " 表示匹配任意字符(除了\n以外)
" * " 表示匹配前一个字符0个或者多个
" ? " 非贪婪匹配模式(通常用于提取字符中中间的字符)

在这里插入图片描述

4.保存数据

把提取数据进行本地保存
基本步骤:请求视频信息链接,获取m3u8链接,视频标题->请求m3u8链接,获取所有ts链接->请求ts链接,获取视频内容

第一次请求: 请求视频信息链接,获取m3u8链接,视频标题

  1. 发送请求:
  • 请求 https://bizapi.csdn.net/edu-academy-web/v1/material/info?materialId=638733&courseId=39353&cId=39353&playerVersion=2&isFree=2&isMember=2
  1. 获取数据
    • 获取返回响应数据
  2. 解析数据
    • 提取m3u8链接 / 视频标题

第二次请求: 请求m3u8链接,获取所有ts链接-

  1. 发送请求:
    • 请求 m3u8文件链接
  2. 获取数据
    • 获取返回响应数据
  3. 解析数据
    • 提取所有视频片段链接(ts文件)

第三次请求: 请求ts链接,获取视频内容

  1. 发送请求:
    • 请求 ts文件链接 (视频片段)
  2. 获取数据
    • 获取视频内容
  3. 保存数据
    • 把所有视频片段保存并且合并成完整的视频内容

代码:

import requests
from pprint import pprint
import re
#导入加密模块
from Crypto.Cipher import AES

import os
# 模拟浏览器
#复制浏览器请求的所有标头
headers = {

}

#第一次请求,请求视频信息链接,获取m3u8_url,视频标题
# url='https://bizapi.csdn.net/edu-academy-web/v1/material/info?materialId=638733&courseId=39353&cId=39353&playerVersion=2&isFree=2&isMember=2'
url='https://bizapi.csdn.net/edu-academy-web/v1/material/info?materialId=639976&courseId=39353&cId=39353&playerVersion=2&isFree=2&isMember=2'
response=requests.get(url,headers=headers)
JsonData=response.json()
#提取m3u8_url,视频标题
m3u8_url= JsonData["data"]["info"]["playUrl"]
title=JsonData["data"]["title"]



#请求m3u8链接,获取所有ts链接-
m3u8=requests.get(m3u8_url,headers=headers).text

"""新建解码器"""
#提取密钥
key_url=re.findall('URI="(.*?)"',m3u8)[0]
#获取密钥内容
key =requests.get(url=key_url).content
#提取偏移量
iv=re.findall('IV=(.*)',m3u8)[0][2:]
#16进制转字节
IV=bytes.fromhex(iv)
#解码器
ic=AES.new(key,AES.MODE_CBC,IV=IV)

ts_list=re.findall(",\n(.*?)\n#",m3u8)
for ts in ts_list:
    ts_url='https://course.csdnimg.cn/asset/ed9e92517b1a25cd1c1d228e0ca37d0a/play_video/'+ts
    """请求ts链接,获取视频内容"""
    ts_content =requests.get(url=ts_url).content
    #对于视频内容进行解密
    content=ic.decrypt(ts_content)
    #数据保存
    with open('video\\'+ title +'.mp4', mode='ab') as f:
        f.write(content)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值