Python爬⾍进阶之爬取某视频并下载的实现
这⼏天在家闲得⽆聊,意外的挖掘到了⼀个资源⽹站(你懂得),但是⽹速慢⼴告多下载不了种种原因让我突然萌⽣了爬⾍的想法。
下⾯说说流程:
⼀、⽹站分析
⾸先进⼊⽹站,F12检查,本来以为这种低端⽹站很好爬取,是我太低估了web主。可以看到我刷新⽹页之后,出现了很多js⽂件,并且响应获取的代码与源代码不⼀样,这就不难猜到这个⽹站是动态加载页⾯。
⽬前我知道的动态⽹页爬取的⽅法只有这两种:1、从⽹页响应中到JS脚本返回的JSON数据;2、使⽤Selenium对⽹页进⾏模拟访问。源代码问题好解决,重要的是我获取的源代码中有没有我需要的东西。我再⼀次进⼊⽹站进⾏F12检查源代码,点击左上⾓然后在页⾯点击⼀个视频获取⼀个元素的代码,结果⾥⾯没有嵌⼊的原视频链接(看来我真的是把别⼈想的太笨了)。
没办法只有进⾏抓包,去js请求的接⼝。再⼀次F12打开⽹页调试⼯具,点击单独的⼀个视频进⾏播放,然后在Network中筛选⼀下,只看HXR响应(HXR全称是XMLHTTPRequest,HMLHTTP是AJAX⽹页开发技术的重要组成部分。除XML之外,XMLHTTP还能⽤于获取其它格式的数据,如JSON或者甚⾄纯⽂本。)。
然后我⼀项⼀项的去检查返回的响应信息,发现当我点击播放的时候有后缀为.m3u8的链接,随后就不断刷新.ts⽂件的链接。
本来以为这就是原视频的地址,我傻傻的直接从这个m3u8⽂件的headers中的URL直接进⼊⽹站看看,结果傻眼了,获取的是⼀串串.ts的⽂件名。没办法只能百度君了。科普了⼀下,也就说我们必须把ts⽂件都下载下来进⾏合并之后才能转成视频。
好了,视频原地址弄清楚了,现在我们开始从⼀个视频扩展到⾸页的整个页⾯的视频。再⼀次进⾏抓包分析,发现⼀个API中包含了⾸页的分类列表,然⽽⾥⾯并没有进⼊分类的URL地址,只有⼀个tagid值和图⽚的地址。
于是我⼜在主页点⼀个分类,再次进⾏抓包,发现了⼀个API中包含了⼀个分类的单页所有视频的信息,通过他们的headers中的URL对⽐发现,关于视频的前⼀部分都是https:xxxxxxx&c=video,然后m=categories,通过字⾯意思我们都可以知道是分类,⽽每个tagid值对应不同的分类。并且还发现每个URL中都追加了时间戳timestamp(这是web主为了确保请求不会在它第⼀次被发送后即缓存,看来还是有⼩⼼机啊)。当m=lists,则是每个分类下的视频列表,这⾥⾯我们就可以到每个视频对应的ID了。
通过id我们可以获取到视频的详细信息,并且还有m3u8⽂件URL地址的后⾯⼀部分。
好了,⽹站我们解析清楚了,现在开始堆码了。
⼆、写代码
导⼊相关模块
import requests
from datetime import datetime
executive summary什么意思import re
#import json
import time
import os
#视频分类和视频列表URL的前⼀段
url = "xxxxxxx/api/?d=pc&c=video&"
#m3u8⽂件和ts⽂件的URL前⼀段
jquery判断checkbox是否被选中
m3u8_url ='xxxxxxxxxxxxx/videos/cherry-prod/2020/03/01/2dda82de-5b31-11ea-b5ae-1c1b0da2bc3f/hls/480/'
#构造请求头信息
header = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2"}
#创建空列表存放视频信息
vediomassag=''
#返回当前时间戳
TimeStamp = int(datetime.w()))
2.定义函数,获取⽹站⾸页分类列表信息
#⾃定义函数获取分类
def get_vediocategory(url, TimeStamp):
cgURL = url + "m=categories×tamp=" + str(TimeStamp) + '&'
response = (cgURL, headers=header)
category =
# strrr='"%s"'%category
# return strrr
return category
3.定义函数,通过上⼀个函数返回的分类信息,根据分类对应的id,输⼊id并传输到当前URL中以便获取分类下的视频列表信息#获取分类后的视频列表
def get_vedioList(url, TimeStamp, tagID):
listURL = url + "m=lists×tamp=" + str(TimeStamp) + '&' + "page=1&tag_id=" + str(tagID) + "&sort_type=&is_vip=0"
response = (listURL, headers=header)
vedioLists =
return vedioLists
4.在视频列表信息中获取视频对应的id,获取单个视频详细信息的URL
#获取单个视频的详细信息
def get_vediomassages(url, TimeStamp, vedioID):
videoURL = url + "m=detail×tamp=" + str(TimeStamp) + '&' + "&id=" + str(vedioID)
response = (videoURL, headers=header)
vediomassag =
return vediomassag
5.在视频详细信息中到m3u8⽂件的下载地址,并将⽂件保存到创建的⽂件中
#将下载的m3u8⽂件放进创建的ts列表⽂件中
def get_m3u8List(m3u8_url,vediomassag):
lasturl = r'"m3u8_720_url":"(.*?)","download_url'
last_url =re.findall(lasturl,vediomassag)
lastURL=m3u8_url+str(last_url)
response = (lastURL, headers=header)
tsList =
cur_path='E:\\files' #在指定路径建⽴⽂件夹
try:
insertbefore用法if not os.path.isdir(cur_path): #确认⽂件夹是否存在
os.makedirs(cur_path)  #不存在则新建
except:
print("⽂件夹存在")
filename=cur_path+'\\t2.txt' #在⽂件夹中存放txt⽂件
python入门教程视屏f = open(filename,'a', encoding="utf-8")
f.write(tsList)
f.close
print('创建%s⽂件成功'%(filename))
return filename
6.将m3u8⽂件中的ts单个提取出来放进列表中。
# 提取ts列表⽂件的内容,逐个拼接ts的url,形成list
def get_tsList(filename):
ls = []
with open(filename, "r") as file:
line = f.readlines()
rest架构
for line in lines:
dswith(".ts\n"):
ls.append(line[:-1])
进制转换公式大全
return ls
7.遍历列表获取单个ts地址,请求下载ts⽂件放进创建的⽂件夹中
# 批量下载ts⽂件
def DownloadTs(ls):
length = len(ls)
root='E:\\mp4'
try:
if not ists(root):
os.mkdir(root)
except:
print("⽂件夹创建失败")
try:
for i in range(length):
tsname = ls[i][:-3]
ts_URL=url+ls[i]
print(ts_URL)
r = (ts_URL)
with open(root, 'a') as f:
f.t)
f.close()
print('\r' + tsname + " -->OK ({}/{}){:.2f}%".format(i, length, i * 100 / length), end='')
print("下载完毕")
except:
print("下载失败")
代码整合
import requests
from datetime import datetime
import re
#import json
import time
import os
url = "xxxxxxxx/api/?d=pc&c=video&"
m3u8_url ='xxxxxxxxxxxxxxx/videos/cherry-prod/2020/03/01/2dda82de-5b31-11ea-b5ae-1c1b0da2bc3f/hls/480/'
header = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2"} vediomassag=''
TimeStamp = int(datetime.w()))
#⾃定义函数获取分类
def get_vediocategory(url, TimeStamp):
cgURL = url + "m=categories×tamp=" + str(TimeStamp) + '&'
response = (cgURL, headers=header)
category =

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。