【首发】工作中需要MP4视频文件怎么办?用Python随手采集一些
【摘要】 需求分析今天测试数据用到了 MP4 格式的视频文件,问题来了?从哪里去获取短小又精彩的MP4文件呢,我打开了时光网,从这里找预告片就好了。打开站点http://news.mtime.com/,如下图所示,在里面检索带播放图片的内页地址。 寻找分页逻辑经过反复测试,得到的结论如下页面一次会加载60条数据前台进行的交互分页累计可以获取10页数据分页地址如下所示http://news.mtime...
需求分析
今天测试数据用到了 MP4 格式的视频文件,问题来了?从哪里去获取短小又精彩的MP4文件呢,我打开了时光网,从这里找预告片就好了。
打开站点http://news.mtime.com/,如下图所示,在里面检索带播放图片的内页地址。
寻找分页逻辑
经过反复测试,得到的结论如下
- 页面一次会加载60条数据
- 前台进行的交互分页
- 累计可以获取10页数据
分页地址如下所示
http://news.mtime.com/index.html
http://news.mtime.com/index-2.html
http://news.mtime.com/index-3.html
编码时间
对于该类定向爬虫,核心用 requests
模块即可完成全部任务,页面解析使用 lxml
模块。
整体逻辑描述如下
- 第一步:使用目标首页地址解析网页,获取网页源码
- 第二步:从源码中提取包含视频文件的详情页
- 第三步:进入详情页获取视频文件地址
- 第四步:下载视频文件,通过 res.content 获取二进制流
首先拿第一页做一下测试(后续直接扩展到全部页面即可,可预生成)。
import requests
from lxml import etree
import time
def get_html(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"
}
res = requests.get(url, headers=headers, timeout=3)
html_data = res.text
bodyelement = etree.HTML(html_data)
org_divs = bodyelement.xpath('//div[@class="news-cont"]')
for div in org_divs:
video_element = div.xpath('.//em[@class="pic-video"]')
if video_element:
link = div.xpath('./a/@href')[0]
print(link)
if __name__ == '__main__':
get_html('http://news.mtime.com/index.html')
上述代码的重点在解析包含 em[@class="pic-video"]
的标签,即通过上图中的播放器图标判断详情页是否包含MP4视频文件。
后续的工作就变得简单了,进入详情页获取视频文件地址,然后下载目标视频文件。
为了便于大家学习,我将所有的代码都单独写成一个个的函数,如下所示(其中重要逻辑已经用注释进行标记):
import requests
from lxml import etree
import time
def get_html(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"
}
res = requests.get(url, headers=headers, timeout=3)
html_data = res.text
bodyelement = etree.HTML(html_data)
org_divs = bodyelement.xpath('//div[@class="news-cont"]')
# 获取所有目标 DIV
for div in org_divs:
video_element = div.xpath('.//em[@class="pic-video"]')
# 通过特定标签判定详情页是否包含视频文件
if video_element:
link = div.xpath('./a/@href')[0]
get_video(link)
def get_video(_url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"
}
res = requests.get(_url, headers=headers, timeout=3)
element_dom = etree.HTML(res.text)
# 解析视频地址
videosrc = element_dom.xpath("//video/@src")[0]
down_video(videosrc)
def down_video(video_url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36",
"Host": "vfx.mtime.cn"
}
res = requests.get(video_url, headers=headers, timeout=3)
# 写入视频文件
with open(str(int(time.time()))+".mp4",'wb') as f:
f.write(res.content)
if __name__ == '__main__':
get_html('http://news.mtime.com/index.html')
运行结果如下所示:
上述代码获取的仅有一页数据,如果希望扩展到全部页面,只需要在爬取视频前获取所有的列表页地址即可,可以使用列表解析器进行生成。
记录时间
2022年度 Flag,写作的 561 / 1024 篇。
可以关注我,点赞我、评论我、收藏我啦。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)