Python获取央视节目单的实现代码
本文提供基于Python的央视节目单抓取脚本。通过命令行指定频道编号(1至20)与日期,利用urllib请求页面并配合正则表达式提取上下午播出内容,最终在终端格式化输出当日节目列表。附带参数校验与版本兼容说明,适合批量查询或自动化监控场景。
实现原理与目标
该脚本旨在通过Python标准库自动拉取央视各频道的当日播出计划。核心逻辑分为三步:首先根据用户输入的频道代号拼接目标URL,随后向服务器发起HTTP请求获取HTML源码;接着使用正则表达式定位包含上下午排期的区块,并按时间字段拆分上午与下午的节目清单;最后在终端以对齐表格的形式打印结果。全程依赖内置模块,无需安装第三方依赖包,代码结构清晰,便于二次开发与集成到定时任务中。
运行准备条件
- 系统环境:预装Python 3.6及以上版本的操作系统(Windows/macOS/Linux均可)。
- 网络要求:运行主机需能正常访问电视播客官网(tv.cctv.com)。
- 依赖组件:仅使用内置标准库(
urllib、re、sys、time),开箱即用。 - 安全提醒:由于涉及外部网络请求,建议在受信任的网络环境中运行。若脚本频繁调用,请注意控制请求频率以避免触发目标站点的反爬限制。
完整代码实现
以下为适配现代Python环境的完整实现。代码已修复旧版语法,增加了网络超时保护、非法输入拦截及页面结构容错处理,确保在实际使用中更稳定。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import urllib.request
import re
import sys
from time import strftime, localtime
CHANNELS = {
"1": "CCTV-1", "2": "CCTV-2", "3": "CCTV-3", "4": "CCTV-4亚洲",
"5": "CCTV-4欧洲", "6": "CCTV-4美洲", "7": "CCTV-5", "8": "CCTV-6",
"9": "CCTV-7", "10": "CCTV-8", "11": "CCTV-9", "12": "CCTV-10",
"13": "CCTV-11", "14": "CCTV-12", "15": "CCTV新闻", "16": "CCTV少儿",
"17": "CCTV音乐", "18": "CCTV_E", "19": "CCTV-F", "20": "CCTV高清"
}
if __name__ == "__main__":
print("@@ 你可以在命令行后输入数字(1-20)来选择频道")
print("@@ 通过在命令行后键入 help 获取频道列表")
print("@@")
if len(sys.argv) == 1:
select = "8"
else:
cmd = sys.argv[1]
if cmd == "help":
for i, name in enumerate(CHANNELS.values(), 1):
print(f"{i:>3} : {name}", end=" ")
if i % 4 == 0:
print()
sys.exit(0)
if not cmd.isdigit() or not (1 <= int(cmd) <= 20):
print("Out of Range. Please Select 1-20.")
sys.exit(0)
select = cmd
print('正在获取节目单,请稍后...')
date = strftime('%Y%m%d', localtime())
url = f"http://tv.cctv.com/soushi/28/0{select}/{date}.shtml"
headers = {"User-Agent": "Mozilla/5.0"}
req = urllib.request.Request(url, headers=headers)
try:
with urllib.request.urlopen(req, timeout=10) as response:
html = response.read().decode('utf-8', errors='ignore')
except Exception as e:
print(f"请求失败: {e}")
sys.exit(0)
list_html = re.findall(r'上午节目(.*?)<script', html, re.S)
if not list_html:
print("无法解析页面结构,可能网站已更新或网络异常。")
sys.exit(0)
list_items = re.findall(r'<li>(.*?)</li>', list_html[0], re.S)
morning, afternoon = [], []
for item in list_items:
clean_text = re.sub(r'<.*?>', '', item).strip()
if not clean_text:
continue
try:
hour = int(clean_text[:2])
if hour >= 12:
afternoon.append(clean_text)
else:
morning.append(clean_text)
except ValueError:
continue
listnum = max(len(morning), len(afternoon))
print("-" * 80)
print(" "*13 + "上午节目" + " "*26 + "下午节目")
print(" "*14 + "========" + " "*26 + "========")
for i in range(listnum):
m_time = morning[i][:5] if i < len(morning) else ""
m_detail = morning[i][5:] if i < len(morning) else ""
pm_time = afternoon[i][:5] if i < len(afternoon) else ""
pm_detail = afternoon[i][5:] if i < len(afternoon) else ""
print(f"{m_time:<4} {m_detail:<29} {pm_time:<4} {pm_detail:<30}")
print("-" * 80)
print(" "*24, strftime("%Y年%m月%d日"), CHANNELS.get(select, "") + " 节目单")
实际操作步骤
第1步:保存文件与基础验证
将上述代码完整复制至文本编辑器,保存为 cctv_schedule.py。打开终端或命令提示符,切换至文件所在目录。首次运行时无需附加参数即可触发默认频道(CCTV-6)的查询流程,验证基础网络连通性与依赖加载是否正常。
第2步:执行带参查询
在命令行输入以下指令格式并回车:python cctv_schedule.py <频道数字>
例如查询CCTV-1新闻综合频道,输入:python cctv_schedule.py 1。脚本会自动计算当天日期并拼接URL,请求返回后会等待约数秒进行DOM节点过滤,期间保持网络连接畅通。
第3步:查看帮助与退出
若不确定可选频道范围,可在参数位置输入 help:python cctv_schedule.py help。终端将列出1至20的完整映射表,此时按任意键或关闭窗口即可安全退出程序。
完成判断与注意事项
成功运行的标志是终端输出整齐的横向排版表格,表头显示当前年月日与对应频道名称,下方行列对应上下午节目单。当观察到 正在获取节目单,请稍后... 之后紧接分隔线表格时,即代表解析完成。
需注意两点实际使用情况:
- 目标网站结构可能随改版调整CSS类名或DOM层级,若多次运行均提示
无法解析页面结构,属于上游页面元素变更,需手动抓取新页面结构更新正则规则中的匹配路径。 - 脚本采用同步阻塞式请求,若在低延迟网络下运行卡顿属正常现象。如需接入自动化流水线,建议将
timeout参数调高,或在异步框架中封装该逻辑。
以上就是使用Python获取央视节目单的详细内容,更多关于Python轻量级网页解析与命令行数据处理资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













