Python获取央视节目单的实现代码

沿途有光
沿途有光
发布时间:2026-10-12| 3人浏览过
原创

本文提供基于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的完整映射表,此时按任意键或关闭窗口即可安全退出程序。

完成判断与注意事项

成功运行的标志是终端输出整齐的横向排版表格,表头显示当前年月日与对应频道名称,下方行列对应上下午节目单。当观察到 正在获取节目单,请稍后... 之后紧接分隔线表格时,即代表解析完成。

需注意两点实际使用情况:

  1. 目标网站结构可能随改版调整CSS类名或DOM层级,若多次运行均提示 无法解析页面结构,属于上游页面元素变更,需手动抓取新页面结构更新正则规则中的匹配路径。
  2. 脚本采用同步阻塞式请求,若在低延迟网络下运行卡顿属正常现象。如需接入自动化流水线,建议将 timeout 参数调高,或在异步框架中封装该逻辑。

以上就是使用Python获取央视节目单的详细内容,更多关于Python轻量级网页解析与命令行数据处理资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。