【首发】工作中需要MP4视频文件怎么办?用Python随手采集一些

举报
梦想橡皮擦 发表于 2022/02/16 09:47:14 2022/02/16
【摘要】 需求分析今天测试数据用到了 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。