0
点赞
收藏
分享

微信扫一扫

#yyds干货盘点# 工作中需要MP4视频文件怎么办?用Python随手采集一些【订阅赠品】

hwwjian 2022-03-15 阅读 52

详细内容参见置顶评论

需求分析

今天测试数据用到了 MP4 格式的视频文件,问题来了?从哪里去获取短小又精彩的MP4文件呢,我打开了X光网,从这里找预告片就好了。

打开站点http://地址脱敏处理/,如下图所示,在里面检索带播放图片的内页地址。

寻找分页逻辑

经过反复测试,得到的结论如下

#yyds干货盘点# 工作中需要MP4视频文件怎么办?用Python随手采集一些【订阅赠品】

  • 页面一次会加载60条数据
  • 前台进行的交互分页
  • 累计可以获取10页数据

#yyds干货盘点# 工作中需要MP4视频文件怎么办?用Python随手采集一些【订阅赠品】

分页地址如下所示

http://地址脱敏处理/index.html
http://地址脱敏处理/index-2.html
http://地址脱敏处理/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://地址脱敏处理/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://地址脱敏处理/index.html')

运行结果如下所示:

#yyds干货盘点# 工作中需要MP4视频文件怎么办?用Python随手采集一些【订阅赠品】

上述代码获取的仅有一页数据,如果希望扩展到全部页面,只需要在爬取视频前获取所有的列表页地址即可,可以使用列表解析器进行生成。

记录时间

2022年度 Flag,写作的 <font color=red>561</font> / 1024 篇。
可以<font color=#04a9f4>关注</font>我,<font color=#04a9f4>点赞</font>我、<font color=#04a9f4>评论</font>我、<font color=#04a9f4>收藏</font>我啦。

举报

相关推荐

0 条评论