标题开发短视频资讯平台——基于Python
有video.csv视频库文件,其中有999条短视频数据,格式如下:
项目的核心功能有:
- 分页看新闻(每页显示10条),提示用户输入页码,根据页码显示指定页面的数据。
- 提示用户输入页码,根据页码显示指定页面的数据。
- 当用户输入的页码不存在时,默认显示第1页
- 搜索专区
- 用户输入关键字,根据关键词筛选出所有匹配成功的短视频资讯。
- 支持的搜索两种搜索格式:
id=1715025
,筛选出id等于1715025的视频(video.csv的第一列)。
key=文本
,模糊搜索,筛选包含关键字的所有新闻(video.csv的第二列)。
- 下载专区
- 用户输入视频id,根据id找到对应的mp4视频下载地址,然后下载视频到项目的files目录。
视频的文件名为:视频id-年-月-日-时-分-秒.mp4
- 用户输入视频id,根据id找到对应的mp4视频下载地址,然后下载视频到项目的files目录。
'''
项目的核心功能有:
分页看新闻(每页显示10条),提示用户输入页码,根据页码显示指定页面的数据。
搜索专区
- 用户输入关键字,根据关键词筛选出所有匹配成功的短视频资讯。
下载专区
- 用户输入视频id,根据id找到对应的mp4视频下载地址,然后下载视频到项目的files目录。
'''
import os
import math
import re
import requests
from datetime import datetime
DTTE_LIST = list()
ID_LIST = list()
count = 1
DIR_PATH = os.path.dirname(os.path.abspath(__file__))
path = os.path.join(DIR_PATH, 'video.csv')
with open(path, mode='r+', encoding='utf-8') as file_object:
for line in file_object.readlines():
line_date = (count, line.strip().split(','))
DTTE_LIST.append(line_date)
ID_LIST.append(line_date[1][0])
count += 1
def news_watch(date_list):
'''
实现翻页看新闻功能:
:param date_list: 传入文件数据
:return: 无返回值
'''
line_count = len(date_list)
page_count = math.ceil(line_count / 10)
print('读新闻专区')
while True:
# 提示用户输入页码
page_number = input('\n共{}页,每页10条,请输入页数(Q或q退出):'.format(page_count))
if page_number.upper() == 'Q':
break
elif not page_number.isdecimal():
print('输入错误,重新输入')
# 当用户输入的页码不存在时,默认显示第1页
elif int(page_number) <= 0 or int(page_number) > page_count:
print('\n第1页')
for i in range(10):
date = date_list[i]
print('{} {}'.format(date[0], date[1][1]))
# 根据页码显示指定页面的数据
else:
print('\n第{}页'.format(page_number))
for i in range(10):
if (int(page_number) - 1) * 10 + i + 1 > line_count:
continue
date = date_list[(int(page_number) - 1) * 10 + i]
print('{} {}'.format(date[0], date[1][1]))
def news_search(date_list):
'''
实现搜索功能
- 支持的搜索两种搜索格式:
:param date_list: 传入文件数据
:return: 无返回
'''
print('搜索专区')
while True:
# 提示用户输入支持的两种搜索格式:
choose = input('请输入搜索条件,支持[id=1715007 或 key=文本](Q或q退出):')
if choose.upper() == 'Q':
break
# id搜索,例如:`id=1715025`,筛选出id等于1715025的新闻信息并输出。
elif re.findall('id=\d{7}', choose):
print('\nid搜索')
if choose[3:] not in ID_LIST:
print('此id无效,请重新输入')
continue
else:
for date in date_list:
if choose[3:] == date[1][0]:
ind = date_list.index(date)
break
print('1 {}'.format(date_list[ind][1][1]))
# key搜索,例如:key=文本,筛选包含关键字的所有新闻信息并输出。
elif re.findall('key=\w+', choose):
count = 0
for date in date_list:
if choose[4:] not in date[1][1]:
continue
else:
count += 1
print('{} {}'.format(count, date[1][1]))
else:
print('输入错误,重新输入')
def news_download(date_list):
'''
实现下载视频功能
:param date_list: 传入文件数据
:return: 无返回
'''
print('下载专区')
while True:
download_id = input('请输入下载id(Q或q退出):')
if download_id.upper() == 'Q':
break
elif not download_id.isdecimal():
print('输入有误,重新输入')
else:
if download_id not in ID_LIST:
print('id错误,请重新输入')
# 根据用户输入的视频id找到对应的mp4视频下载地址,然后下载视频到项目的files目录。
else:
dex = ID_LIST.index(download_id)
url = date_list[dex][1][-1]
res = requests.get(
url,
headers={
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
}
)
file_size = int(res.headers['Content-Length'])
download_size = 0
download_dir = os.path.join(DIR_PATH, 'files')
if not os.path.isdir(download_dir):
os.makedirs(download_dir)
# 视频的文件名为:`视频id-年-月-日-时-分-秒.mp4`
time = datetime.now()
time_text = time.strftime("%Y-%m-%d-%H-%M-%S")
file = open(os.path.join(download_dir, '{}-{}.mp4'.format(download_id, time_text)), mode='wb')
for chunk in res.iter_content(int(file_size / 500)):
download_size += len(chunk)
file.write(res.content)
file.flush()
message = '\r已下载{}%'.format(round(download_size / file_size * 100, 2))
print(message, end='')
print('下载完成')
file.close()
def run():
'''
实现提示页面,根据用户输入对应需要返回相应函数并执行
:return: 无返回
'''
kind_dict = {'1': news_watch, '2': news_search, '3': news_download}
while True:
text = '\n请输入需求(1——3),Q/q退出:\n\t1——看新闻\t2——搜索专区\t3——下载专区\n'
ans = input(text)
if ans.upper() == 'Q':
break
elif int(ans) > 3 or int(ans) < 0:
print('输入错误,请按提示输入')
continue
kind_dict.get(ans)(DTTE_LIST)
if __name__ == '__main__':
run()