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

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

详细内容参见置顶评论

需求分析

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

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

寻找分页逻辑

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

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

分页地址如下所示

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')
复制代码

运行结果如下所示:

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

记录时间

2022年度 Flag,写作的 561 / 1024 篇。 可以关注我,点赞我、评论我、收藏我啦。

Guess you like

Origin juejin.im/post/7074778567602601998