爬虫实现基本流程
一 数据来源分析
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链接,视频标题
- 发送请求:
- 请求 https://bizapi.csdn.net/edu-academy-web/v1/material/info?materialId=638733&courseId=39353&cId=39353&playerVersion=2&isFree=2&isMember=2
- 获取数据
- 获取返回响应数据
- 解析数据
- 提取m3u8链接 / 视频标题
第二次请求: 请求m3u8链接,获取所有ts链接-
- 发送请求:
- 请求 m3u8文件链接
- 获取数据
- 获取返回响应数据
- 解析数据
- 提取所有视频片段链接(ts文件)
第三次请求: 请求ts链接,获取视频内容
- 发送请求:
- 请求 ts文件链接 (视频片段)
- 获取数据
- 获取视频内容
- 保存数据
- 把所有视频片段保存并且合并成完整的视频内容
代码:
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)
2318

被折叠的 条评论
为什么被折叠?



