你见过A站的小姐姐吗?超级漂亮的哦
哈喽,大家好,今天给大家带来的是足足的干货,爬取A站视频。相信大家都看过短视频吧,那么有想过用Python把他们爬取回来吗?下面让我们一起学习视频的爬取下载方法吧! 1.引入所需包 这里需要注意的是几个可能不常见的包。首先是os包,这就是一个处理文件的包;tqdm库是会使完成某项任务在控制台进度条显示;zipfile 模块实现对 zip 文件的解压,在本次中主要是压缩视频文件为MP4。
import os
import zipfile
import requests
import re
from tqdm import tqdm
2.思路: 按照爬虫的常规思路,肯定要先分析网站,由于此次爬取的是视频格式,而网页上不断进入观看不同视频可以发现每个视频都有一个可以看作自己ID的代号,所以爬取网页链接就可以轻松得到了;然后就是如何爬取回来,在某一视频里分析可发现缓存的视频为ts格式只有2秒的,所以就是把这些2秒的文件都一一下载回来,然后再链接一起就可以得到完整视频了。
具体实现如下:
3.获取响应
首先设置一个想要下载视频的部分重要ID,通过正常的请求获得网页源码。在浏览器端打开A站然后搜索某词,本次爬取关键词是小姐姐,然后点开一个视频,网页链接上面可以找到其对应ID,这样通过requests请求就可以得到对应的源代码。其中设置UA比较随意,如有需要请另外添加参数。
video_id = input("请输入视频ID:")
url = f'https://www.acfun.cn/v/{video_id}'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0'
}
html = requests.get(url=url, headers=headers).text
3.截取所需数据链接 源码有了,就是寻找视频链接并保存了,而在浏览器检查界面下,网络一栏下,点击XHR意为浏览器缓存的文件,大家都很轻松理解浏览器会自动帮我们缓存视频,而XHR正是显示缓存文件的请求(大部分为英文界面,那就是network下的XHR);点击清除,播放视频,可以看出有新请求出现,点击几个成功的请求,可以发现链接有其相同部分,在控制台源码中可以查到其属于backup标签下,那么利用正则表达式截取所有链接。(这里的链接是“假”视频链接,可以看作请求连接视频)
m3u8_url = re.findall('backupUrl(.*?)\"]', html)[0].replace('"', '').split('\\')[2]
4.获取标题 利用正则表达式从页面直接寻找标题。
title_search = '<title >(.*?) - AcFun弹幕视频网 - 认真你就输啦 \(\?\ω\?\)ノ- \( ゜- ゜\)つロ</title>'
title = re.findall(title_search, html)[0]
print(title)
5.筛选有用数据 大家爬取爬取之后就会发现,前面获取的多个视频链接响应的代码中带有我们需要的真正视频下载链接,其他无用信息,而我们需要的只是剔除无效信息,保留我们需要的链接,然后下载下来就OK了。
m3u8_data = requests.get(m3u8_url, headers=headers).text
m3u8_data = re.sub('#EXTM3U', '', m3u8_data)
m3u8_data = re.sub('#EXT-X-VERSION:\d', '', m3u8_data)
m3u8_data = re.sub('#EXT-X-TARGETDURATION:\d', '', m3u8_data)
m3u8_data = re.sub('#EXT-X-MEDIA-SEQUENCE:\d', '', m3u8_data)
m3u8_data = re.sub('#EXTINF:\d.\d+,', '', m3u8_data)
m3u8_data = re.sub('#EXT-X-ENDLIST', '', m3u8_data).split()
6.美化界面 通过链接爬取各个2s视频保存本地,为了界面更美就添加了一个进度条显示功能,也使爬虫的进行更加有序化,方便我们的观察。
for link in tqdm(m3u8_data):
ts_url = 'https://tx-safety-video.acfun.cn/mediacloud/acfun/acfun_video/hls/' + link
ts_name = link.split('.')[1]
ts_content = requests.get(ts_url, headers=headers).content
with open(filename+ts_name+'.ts', mode='wb') as f:
f.write(ts_content)
print(ts_name)
7.转化为MP4格式 使用zipfile方法将该文件夹里的ts文件压缩为MP4格式。
with zipfile.ZipFile(filename + f'{title}' + '.mp4', mode='w') as z:
for file in files:
path = filename + file
z.write(path)
os.remove(path)
print("已下载,请验收")
8.代码正常运行成功如下
最终在文件夹里会只有一个MP4格式的视频,此次爬取就到此为止了。 END 这次的A站小姐姐视频爬取就这样完美落幕了,小姐姐是真的漂亮,以后小编要慢慢欣赏,哈哈! 下附完整源码:
import os
import zipfile
import requests
import re
from tqdm import tqdm
video_id = input("请输入视频ID:")
url = f'https://www.acfun.cn/v/{video_id}'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0'
}
html = requests.get(url=url, headers=headers).text
m3u8_url = re.findall('backupUrl(.*?)\"]', html)[0].replace('"', '').split('\\')[2]
title_search = '<title >(.*?) - AcFun弹幕视频网 - 认真你就输啦 \(\?\ω\?\)ノ- \( ゜- ゜\)つロ</title>'
title = re.findall(title_search, html)[0]
filename = f'{title}\\'
if not os.path.exists(filename):
os.mkdir(filename)
m3u8_data = requests.get(m3u8_url, headers=headers).text
m3u8_data = re.sub('#EXTM3U', '', m3u8_data)
m3u8_data = re.sub('#EXT-X-VERSION:\d', '', m3u8_data)
m3u8_data = re.sub('#EXT-X-TARGETDURATION:\d', '', m3u8_data)
m3u8_data = re.sub('#EXT-X-MEDIA-SEQUENCE:\d', '', m3u8_data)
m3u8_data = re.sub('#EXTINF:\d.\d+,', '', m3u8_data)
m3u8_data = re.sub('#EXT-X-ENDLIST', '', m3u8_data).split()
for link in tqdm(m3u8_data):
ts_url = 'https://tx-safety-video.acfun.cn/mediacloud/acfun/acfun_video/hls/' + link
ts_name = link.split('.')[1]
ts_content = requests.get(ts_url, headers=headers).content
with open(filename+ts_name+'.ts', mode='wb') as f:
f.write(ts_content)
print(ts_name)
print('=='*100)
print("开始合并视频。。。。。。")
files = os.listdir(filename)
with zipfile.ZipFile(filename + f'{title}' + '.mp4', mode='w') as z:
for file in files:
path = filename + file
z.write(path)
os.remove(path)
print("已下载,请验收")
|