寒假闲来无事,决定尝试一下用python写一个小网络爬虫批量下载视频。
由于是第一次写网络爬虫,可以说是两眼一抹黑,整个程序都是自己一点点试出来的,所以程序本身肯定有一些漏洞和缺陷,如果有建议请批评指正。
由于CSDN审核不允许出现具体网址否则会因为版权问题不通过审核(图片也不行),所以只好把所有带网址的内容都删掉。程序本身是可以运行的,如果想尝试的话做简单修改就好了。
首先,我们需要以下几个库:
requests,bs4,ffmpy3,re
import requests
from bs4 import BeautifulSoup
import ffmpy3
import re
首先,我搜罗到一个有我想要的资源的网址,搜索节目得到视频列表,
现在我们通过F12或者Ctrl+shift+C进入开发者模式,会出现一个界面,里面是HTML语言,也就是编写成这个网站的程序(就先叫他element界面)。
每一集的选项背后都是一个链接,点击之后就跳转到那一集的播放界面。我们的第一步是获取每一个播放界面的链接,然后储存到一个列表里面。
首先我们要把这整一个element界面的所有代码全部用程序扒拉下来,然后再慢慢分析处理。这里用requests库来发送请求,获取所有的代码。
seach_url=""#当前页面的网址
server=""#首页的网址
r=requests.post(url=seach_url)
r.encoding="utf-8"
乍一看,会发现element界面实在是让人眼花缭乱,里面面的代码一层包一层完全看不出个所以然,但是如果我们把鼠标移动到网页上的每一个选项或者图片之类的上面,element界面中会自动显示标记出我们鼠标指向的界面对应的代码,右键一下,就可以选定。然后,我们就可以通过人为观察,找到我们想要的播放链接。当然,我们不可能手动把所有播放链接都复制下来。如果仔细观察,会发现每个部分都会有“div”,“class”之类的标签,而且这些标签都是跟变量名一样独一无二的。所以我们就可以根据这些线索按图索骥,用程序寻找我们想要的内容对应的标签属性,然后定位我们想要的内容。
在这个网页里面,所有的视频播放界面的链接都藏在这里:
所以,我们可以通过定位div标签,id="vlink_1",class="videourl clearfix"来定位我们要的链接。
首先用beautifulsoup对扒拉到的资源进行一个处理,然后可以用相关方法很快捷的对数据进行查找分析。
search_html=BeautifulSoup(r.text,"lxml")#beautifulsoup是一个可以从HTML文件中提取数据的库,lxml用于解析HTML语言。
search_spans=search_html.find("div",id="vlink_1")
然后要做进一步的处理。仔细观察网页的element界面,会发现链接前面还有一个“a”的标签,然后我们利用这个特点进行进一步提取。
urls=search_spans.find_all("a")
现在我们离获取到视频链接只有一步之遥:
url_list=[]
for url in urls:
url_list.append(server+url.get("href"))
然后我们就获取了所有的视频播放界面的链接,接下来对每一个播放链接进行操作提取视频就可以了。
接下来,我们打开一个链接,进一步查找线索。然后这时我们会惊讶的发现,视频源文件找不到啊?按理说视频文件应该以mp4之类的格式保存,但事实上,根本没有这样的文件。那么我们的爬虫大计就要在此付诸东流了吗?并不会。经过我的了解,在这个网站里面(同时应该也对很多网站适用),视频以一个m3u8的格式的文件储存链接,文件里面是很多个ts视频文件的地址,每个ts文件都是视频的一小段。然后在读取这个m3u8文件之后,就按照上面的顺序进行视频播放,一个接一个就有了完整的视频。我们现在来实际验证一下这个说法。
现在我们打开视频开始播放,在图中鼠标所指的地方有一个network选项:
点开它,会发现有很多.ts文件,而且其中一个的数据正在快速的变化: 点击其中的一个,跳转到相应链接,会发现指向的是一小段视频,正是节目的一个片段,所以这个说法就得到了证明。
那么第二步,我们根据获得的视频播放界面,来获取m3u8文件,并储存。
import re
def getm3u8(url):
r=requests.post(url)
r.encoding="utf-8"
search_html=BeautifulSoup(r.text,"lxml")
vidlink=search_html.find("div",{"class":"player mb"})
vidlink=vidlink.find("script")
text="".join(list(vidlink))
text=re.split(string=text,pattern="\"")
pat="https://jisu.+index.m3u8"
for t in text:
matchurl=re.match(string=t,pattern=pat)
if matchurl !=None:
return matchurl.group(0)
m3u8list=[]
for u in url_list:
m3u8list.append(getm3u8(u))
print(m3u8list)
这个地方我的实现方式比较笨拙,先从视频播放界面爬取HTML代码然后用beautifulsoup进行处理,然后观察网页,用Ctrl+F查找m3u8文件:
然后不管我如何尝试,我都不能再用相同的方法在script下面再进行提取了,于是我想到一个方法:我把提取到的数据转换成字符串,然后用正则表达式进行查找,查找目标为以“https://jisu”开头,“index.m3u8”结尾的链接。最后程序可以成功运行,返回相应的index.m3u8
下一步,我们根据这个链接,用“ffmpy3”包来进行批量下载视频,这个包会自动连续读取ts文件,然后拼接成完整视频。下载完成之后会储存到当前文件夹下面。
import ffmpy3
for i,url in enumerate(m3u8list):
ffmpy3.FFmpeg(inputs={url: None}, \
outputs={'第{}集.mp4'.format(i):None}).run()
下载的比较慢,其实也可以采用多线程的方式来加速,不过我没有加这个功能。 文章来源:https://www.toymoban.com/news/detail-400596.html
总代码如下:(带有网址的字符串由于审核要求我全都去掉了,用的时候自己补上就好)文章来源地址https://www.toymoban.com/news/detail-400596.html
import requests
from bs4 import BeautifulSoup
seach_url=""
server=""
r=requests.post(url=seach_url)
r.encoding="utf-8"
search_html=BeautifulSoup(r.text,"lxml")
print(type(search_html))
search_spans=search_html.find("div",id="vlink_1")
urls=search_spans.find_all("a")
url_list=[]
for url in urls:
url_list.append(server+url.get("href"))
print(url_list)
import ffmpy3
import re
def getm3u8(url):
r=requests.post(url)
r.encoding="utf-8"
search_html=BeautifulSoup(r.text,"lxml")
vidlink=search_html.find("div",{"class":"player mb"})
vidlink=vidlink.find("script")
text="".join(list(vidlink))
text=re.split(string=text,pattern="\"")
pat=""
for t in text:
matchurl=re.match(string=t,pattern=pat)
if matchurl !=None:
return matchurl.group(0)
m3u8list=[]
for u in url_list:
m3u8list.append(getm3u8(u))
print(m3u8list)
import ffmpy3
for i,url in enumerate(m3u8list):
ffmpy3.FFmpeg(inputs={url: None}, \
outputs={'第{}集.mp4'.format(i):None}).run()
到了这里,关于简单python网络爬虫批量下载视频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!