使用Python实时查询北京车辆限行尾号
个基于Python的车辆限行查询工具

一、功能概述

本文将介绍一个基于Python的车辆限行查询工具,该工具能够实现以下功能:

  1. 实时爬取北京市交通管理局官网的节假日数据
  2. 自动计算当日及次日的限行尾号
  3. 智能识别节假日自动解除限行
  4. 支持未来日期限行预测

二、技术原理

2.1 数据获取模块

通过requests库抓取官网数据,使用BeautifulSoup解析网页内容:

def _getHoliday():
    url = "https://jtgl.beijing.gov.cn/"
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}
    response = requests.get(url, headers=headers)
    response.encoding = 'utf-8'

    soup = BeautifulSoup(response.text, 'html.parser')
    scripts = soup.find_all('script', attrs={'type': 'text/javascript'})

    # 用于存储Holiday数组的字符串
    holiday_script = ""

    # 查找包含Holiday数组定义的<script>标签
    for script in scripts:
        if script.string and "var Holiday=new Array" in script.string:
            holiday_script = script.string
            break

    # 使用正则表达式从JavaScript代码中提取日期
    return re.findall(r'"(\d{4}-\d{1,2}-\d{1,2})"', holiday_script)

关键点说明:

  • 模拟浏览器访问(User-Agent)
  • UTF-8编码处理
  • 正则表达式匹配日期格式
  • 动态JavaScript内容解析

2.2 限行计算算法

核心算法基于2014年4月14日开始的限行周期:

def _getXHNumber(tDate:datetime.datetime, sDate:datetime.datetime): # 来自官网的JavaScript逻辑
    nDayNum = tDate.weekday() + 1 
    if nDayNum > 5:
        return nDayNum
    nDiff = (tDate - sDate).days / (7 * 13)
    nDiff = math.floor(nDiff) % 5
    nDayNum = 5 - nDiff + nDayNum
    if nDayNum > 5:
        nDayNum -= 5
    return nDayNum

2.3 核心处理逻辑

def xianxing():  
    # 限行节假日数组(除去周六日)  
    sStartDate = '2014-04-14'  # 开始星期,周一的日期  
    x = [None,'5和0', '1和6', '2和7', '3和8', '4和9', '不限行', '不限行']  

    vStartDate = datetime.datetime.strptime(sStartDate, "%Y-%m-%d")  
    vToday = datetime.datetime.now()  # 客户端当天时间  

    nDayNum1 = _getXHNumber(vToday, vStartDate)  # 限行尾号数组值  
    vToday += datetime.timedelta(days=1)  
    nDayNum2 = _getXHNumber(vToday, vStartDate)  
    Holiday = _getHoliday()  # 获取节假日数组
    # 判断今天和明天是否为节假日  
    for holiday in Holiday:  
        tddate = datetime.datetime.strptime(holiday, "%Y-%m-%d")  
        if vToday.strftime("%Y-%m-%d") == tddate.strftime("%Y-%m-%d"):  
            nDayNum1 = 6  
        if (vToday + datetime.timedelta(days=1)).strftime("%Y-%m-%d") == tddate.strftime("%Y-%m-%d"):  
            nDayNum2 = 6
    # 返回今天和明天的限行情况
    return x[nDayNum1], x[nDayNum2]

特殊日期处理规则:

  1. 法定节假日当天不限行
  2. 周末自动解除限行

三、代码结构解析

完整代码架构示意图:

├── 数据获取层
│   └── _getHoliday()
├── 核心算法层
│   └── _getXHNumber()
└── 业务逻辑层
    └── xianxing()

主要函数说明表:

函数名 输入参数 输出结果 功能说明
_getHoliday 节假日日期列表 获取官网特殊日期数据
_getXHNumber 当前日期,基准日期 限行尾号索引 核心计算算法
xianxing (今日限行,明日限行) 整合数据和业务逻辑

四、使用示例

运行效果演示:

if __name__ == "__main__":
    today_limit, tomorrow_limit = xianxing()
    print("--------------------------------------------")
    print("今天限行尾号:", today_limit)     # 显示当天限行尾号
    print("明天限行尾号:", tomorrow_limit)  # 显示明天限行尾号
    print("--------------------------------------------")
--------------------------------------------
今天限行尾号: 3和8
明天限行尾号: 4和9
--------------------------------------------

典型使用场景:

  1. 每日早晨出行前查询
  2. 出行规划系统集成
  3. 车载导航系统数据源
  4. 交通类APP功能扩展

五、法律声明

  1. 本代码仅用于技术交流
  2. 实际出行请以交管部门官方信息为准
  3. 网站数据抓取需遵守《网络安全法》

部分内容使用deepseek生成


最后修改于 2025-04-07