使用Python实时查询北京车辆限行尾号
个基于Python的车辆限行查询工具
一、功能概述
本文将介绍一个基于Python的车辆限行查询工具,该工具能够实现以下功能:
- 实时爬取北京市交通管理局官网的节假日数据
- 自动计算当日及次日的限行尾号
- 智能识别节假日自动解除限行
- 支持未来日期限行预测
二、技术原理
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]
特殊日期处理规则:
- 法定节假日当天不限行
- 周末自动解除限行
三、代码结构解析
完整代码架构示意图:
├── 数据获取层
│ └── _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
--------------------------------------------
典型使用场景:
- 每日早晨出行前查询
- 出行规划系统集成
- 车载导航系统数据源
- 交通类APP功能扩展
五、法律声明
- 本代码仅用于技术交流
- 实际出行请以交管部门官方信息为准
- 网站数据抓取需遵守《网络安全法》
部分内容使用deepseek生成
最后修改于 2025-04-07