php 抓取网页源码(爬取A站视频爬取下载方法,你值得拥有! )
优采云 发布时间: 2022-03-10 19:07php 抓取网页源码(爬取A站视频爬取下载方法,你值得拥有!
)
你见过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 = {
# 'Referer': 'https://www.acfun.cn/',
'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就是显示缓存文件的请求(多为英文,即网络下的XHR);点击清除,播放视频,可以看到出现了一个新的请求,点击几个成功的请求,可以发现链接有相同的部分,可以在控制台源码中找到它属于备份标签,然后使用正则表达式拦截所有链接。(这里的链接是“假”视频链接,可以看成是连接视频的请求)
m3u8_url = re.findall('backupUrl(.*?)\"]', html)[0].replace('"', '').split('\\')[2]
4.获取标题
使用正则表达式直接从页面中查找标题。
title_search = '(.*?) - AcFun弹幕视频网 - 认真你就输啦 \(\?\ω\?\)ノ- \( ゜- ゜\)つロ'
title = re.findall(title_search, html)[0]
打印(标题)
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()#.split()分割成列表
6.美化界面
通过链接抓取每个2s的视频保存在本地。为了让界面更美观,增加了进度条显示功能,也让爬虫更加有序,方便我们观察。
# tqdm(m3u8_data) 进度条显示
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格式的视频,本次爬取到此结束。
结尾
这一次,A*敏*感*词*姐在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 = {
# 'Referer': 'https://www.acfun.cn/',
'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
# 寻找ts文件url
m3u8_url = re.findall('backupUrl(.*?)\"]', html)[0].replace('"', '').split('\\')[2]
# print(m3u8_url)
# \转义
title_search = '(.*?) - AcFun弹幕视频网 - 认真你就输啦 \(\?\ω\?\)ノ- \( ゜- ゜\)つロ'
title = re.findall(title_search, html)[0]
# print(title)
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()#.split()分割成列表
# print(m3u8_data)
# tqdm(m3u8_data) 进度条显示
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("已下载,请验收")