2-3-09 作业:开发短视频资讯平台

有video.csv视频库文件,其中有999条短视频数据,格式如下:【 video.csv 文件已为大家提供好,在day15课件目录下。 】

image

  • 项目的核心功能有:
    • 分页看新闻(每页显示10条),提示用户输入页码,根据页码显示指定页面的数据。

      • 提示用户输入页码,根据页码显示指定页面的数据。
      • 当用户输入的页码不存在时,默认显示第1页
    • 搜索专区

      • 用户输入关键字,根据关键词筛选出所有匹配成功的短视频资讯。
      • 支持的搜索两种搜索格式:
        • id=1715025,筛选出id等于1715025的视频(video.csv的第一列)。
        • key=文本,模糊搜索,筛选包含关键字的所有新闻(video.csv的第二列)。
    • 下载专区

      • 用户输入视频id,根据id找到对应的mp4视频下载地址,然后下载视频到项目的files目录。
        • 视频的文件名为:视频id-年-月-日-时-分-秒.mp4

        • 视频下载代码示例

          import requests
          
          res = requests.get(
              url='https://video.pearvideo.com/mp4/adshort/20210105/cont-1715046-15562045_adpkg-ad_hd.mp4'
          )
          
          # 视频总大小(字节)
          file_size = int(res.headers['Content-Length'])
          
          download_size = 0
          with open('xxx.mp4', mode='wb') as file_object:
              # 分块读取下载的视频文件(最多一次读128字节),并逐一写入到文件中。 len(chunk)表示实际读取到每块的视频文件大小。
              for chunk in res.iter_content(128):
                  download_size += len(chunk)
                  file_object.write(chunk)
                  file_object.flush()
                  message = "视频总大小为:{}字节,已下载{}字节。".format(file_size, download_size)
                  print(message)
              file_object.close()
          
          res.close()
          
        • 下载的过程中,输出已下载的百分比,示例代码如下:

          import time
          
          print("正在下载中...")
          for i in range(101):
              text = "\r{}%".format(i)
              print(text, end="")
              time.sleep(0.2)
          
          print("\n下载完成")
          

作业:
db中放入video.csv 文件
config.py 路径配置文件

import os  
  
# 获取相对路径  
BASE_DIR = os.path.dirname(os.path.abspath(__file__))  
# 路径拼接  
VIDEO_PATH = os.path.join(BASE_DIR,"db","video.csv")

src/service/download.py 参数文件

"""  
下载专区  
  
    - 用户输入视频id,根据id找到对应的mp4视频下载地址,然后下载视频到项目的files目录。  
      - 视频的文件名为:`视频id-年-月-日-时-分-秒.mp4`  
      - 下载的过程中,输出已下载的百分比,示例代码如下:  
"""  
import os  
import re  
from datetime import datetime  
  
import requests  
import config  
  
  
def get_mp4_url(video_id):  
    """ 根据视频ID或者视频链接"""  
    with open(config.VIDEO_PATH, mode='r', encoding='utf-8') as file_object:  
        for line in file_object:  
            vid = line[0]  
            url = line[-1]  
            if video_id == vid:  
                return url  
  
  
def download_mp4(video_id, video_url):  
    '''  
    视频下载  
    :param video_id: ID名称  
    :param video_url: url    :return:  
    '''    # 设置:年-月-日-时-分-秒  
    current_datetime = datetime.now().strptime("%Y-%m-%d-%H-%M-%S")  
    # 视频名称拼接 id加time  
    file_path = os.path.join(config.BASE_DIR, 'files', "{}-{}.mp4".format(video_id, current_datetime))  
    # 下载视频  
    res = requests.get(url=video_url)  
  
    print("正在下载中...")  
    # 视频总大小(字节)  
    file_size = int(res.headers['Content-Length'])  
  
    download_size = 0  
    with open(file_path, mode='wb') as file_object:  
        # 分块读取下载的视频文件(最多一次读128字节),并逐一写入到文件中。 len(chunk)表示实际读取到每块的视频文件大小。  
        for chunk in res.iter_content(128):  
            download_size += len(chunk)  
            file_object.write(chunk)  
            file_object.flush()  
            # download_size :已下载字节  
            # file_size :总字节  
            percent = "\r{}%".format(int(round(download_size / file_size, 2) * 100))  
            print(percent, end='')  
    print("\n下载完成")  
  
    res.close()  
  
  
def execute():  
    print("下载专区")  
    while True:  
        video_id = input("请输入要下载的视频ID(q/Q退出):")  
        if video_id.upper() == 'Q':  
            break  
        # 判断ID 是否正确  
        match_group = re.match("\d{7}", video_id.strip())  
        if not match_group:  
            print("ID格式错误,请重新输入")  
            continue  
  
        video_url = get_mp4_url(video_id)  
        if not video_url:  
            print("视频不存在,请重新输入")  
            continue  
  
        download_mp4(video_id,video_url)

src/service/page.py 参数文件

"""  
分页看新闻(每页显示10条),提示用户输入页码,根据页码显示指定页面的数据。  
    - 提示用户输入页码,根据页码显示指定页面的数据。  
    - 当用户输入的页码不存在时,默认显示第1页  
  
"""  
  
import config  
  
def get_page_data(page_num, per_page_count):  
    '''  
    根据页码获取要展示的数据列表  
    :param page_num: 页码  
    :param per_page_count: 每页数据条数  
    :return: 数据列表  
    '''  
    # 每次最开始条数  
    start_index = (page_num - 1) * per_page_count  
    # 每次最后条数  
    end_index = page_num * per_page_count  
  
    data_list = []  
    read_row_count = 0  
  
    with open(config.VIDEO_FILE_PATH, mode='r', encoding='utf-8') as file_object:  
        for line in file_object:  
            if start_index <= read_row_count < end_index:  
                data_list.append(line.strip())  
            if read_row_count >= end_index:  
                break  
            read_row_count += 1  
    return data_list  
  
  
def show_table(page_num, per_page_count, data_list):  
    """ 在页面展示分页信息(输出)  
    :param page_num:页码  
    :param per_page_count:每页数据条数  
    :param data_list:    :return:  
    """    index = (page_num - 1) * per_page_count + 1  
    for num, line in enumerate(data_list, index):  
        row_list = line.split(',')  
        print(num, row_list[1])  
  
def execute():  
    """ 分页看新闻 """    print("分页看新闻(每页显示10条)")  
  
    # 每页显示10条 & 总数据999条  
    per_page_count, total_count = 10, 999  
  
    # 计算页码最大值  
    max_page_num, remainder = divmod(total_count, per_page_count)  
    if remainder:  
        max_page_num += 1  
  
    while True:  
        num = input("输入页码[范围{}~{}](Q/q退出):".format(1, max_page_num))  
        if num.upper() == 'Q':  
            break  
        if not num.isdecimal():  
            print("页码错误,请重新输入!")  
            continue  
        num = int(num)  
        if num < 1 or num > max_page_num:  
            num = 1  
        page_string = "第{}页".format(num)  
        print(page_string)  
  
        data_list = get_page_data(num, per_page_count)  
        show_table(num, per_page_count, data_list)

src/service/search.py 参数文件

"""  
搜索专区  
    - 用户输入关键字,根据关键词筛选出所有匹配成功的短视频资讯。  
    - 支持的搜索两种搜索格式:  
      - `id=1715025`,筛选出id等于1715025的视频(video.csv的第一列)。  
      - `key=文本`,模糊搜索,筛选包含关键字的所有新闻(video.csv的第二列)。  
"""  
import re  
import config  
  
def search_by_id(value):  
    """ 根据ID精确搜索"""  
    data_list = []  
    with open(config.VIDEO_FILE_PATH, mode='r', encoding='utf-8') as file_object:  
        for line in file_object:  
            line = line.strip()  
            if value == line.split(',')[0]:  
                data_list.append(line)  
                break  
    return data_list  
  
  
def search_by_text(value):  
    """ 根据文本模糊搜索 """    data_list = []  
    with open(config.VIDEO_FILE_PATH, mode='r', encoding='utf-8') as file_object:  
        for line in file_object:  
            line = line.strip()  
            if value in line.split(',')[1]:  
                data_list.append(line)  
    return data_list  
  
  
def show_table(data_list):  
    """ 展示 """    for num, line in enumerate(data_list, 1):  
        row_list = line.split(',')  
        print(num, row_list[1])  
  
def execute():  
    print("搜索专区")  
  
    while True:  
        text = input("请输入搜索条件,支持 [ id=1711349 或 key=文本 ](Q/q退出):")  
        if text.upper() == 'Q':  
            break  
        match_object = re.match("(id|key)=(\w+)", text.strip())  
        if not match_object:  
            print("输入格式错误,请重新输入")  
            continue  
        #  v1 = match_object.group() # "id=1711349"  
        #  name,value = match_object.groups() # ("id","dfsdf")        name, value = match_object.groups()  
        mapping = {  
            "id": search_by_id,  
            "key": search_by_text,  
        }  
        data_list = mapping[name](value)  
        show_table(data_list)

src/handler.py 公共文件

from src.service import download, page, search  
  
  
def run():  
    '''  
    定义选择字典  
    :return:  
    '''    func_dict = {  
        "1": {"title": "分页看新闻", "func": page.execute},  
        "2": {"title": "下载专区", "func": download.execute},  
        "3": {"title": "搜索专区", "func": search.execute}  
    }  
  
    tie = ";".join(['{}.{}'.format(i, j['title']) for i, j in func_dict.items()])  
  
    while True:  
        choose = input("请输入序号(q/Q退出):")  
        if choose.upper() == "Q":  
            break  
        data_dict = func_dict.get(choose)  
        if not data_dict:  
            print("序号不存在,请重新输入!")  
            continue  
  
        data_dict['func']()

app.py 执行文件

from src.handler import run  
  
if __name__ == '__main__':  
    run()
posted @ 2022-10-26 23:36  布丁家的苏苏  Views(11)  Comments(0)    收藏  举报