2-3-09 作业:开发短视频资讯平台
有video.csv视频库文件,其中有999条短视频数据,格式如下:【 video.csv 文件已为大家提供好,在day15课件目录下。 】

- 项目的核心功能有:
-
-
分页看新闻(每页显示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下载完成")
-
- 用户输入视频id,根据id找到对应的mp4视频下载地址,然后下载视频到项目的files目录。
-
作业:
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()

浙公网安备 33010602011771号