python 制作火车时刻表
程序员文章站
2022-05-18 21:26:17
...
python 制作火车时刻表
火车时刻表是一种方便快捷的查询火车班次信息的工具,那么,如何实现用python实现爬取这些网站的时刻表数据呢?
一、访问 http://www.ip138.com/ 查询网的火车时刻表工具:http://qq.ip138.com/train/
选择“列车车次查询”,并使用CHROME开发者工具,可以发现并没有有关数据的XHR包,这是我们选择用正则表达式提取数据。
选择车次,可发现网址格式为:
http://qq.ip138.com/train/<车次号>.htm
标题正则
<h1>.*</h1>
火车类型数据正则:
列车类型:.*
车站名正则
<a href="/train.*" target="_blank">.*</a>
时间数据正则(记得不要第一个):
([0-9]{2}:[0-9]{2})|(---)
通过python的RE模块,可以很方便的查询正则数据。
附上源代码(prettytable模块用于显示表格数据,colorama用于设置文本颜色)
import requests
# from urllib import parse
import prettytable
import re
import colorama
def real(l):
for i in l:
if(i != ''):
return i
return -1
code=input("输入班次:\n")
url="http://qq.ip138.com/train/%s.htm"%code
data=requests.get(url)
encode=data.encoding
# print(encode)
if(data.status_code == 404):
print("没有查到:%s"%code)
exit(1)
data=data.content.decode("gb2312")
title=re.search("<h1>.*</h1>",data).group(0)
title=title.replace("<h1>","")
title=title.replace("</h1>","")
start=re.search("从.*开往",title).group(0).replace("从","")\
.replace("开往","")
end=re.search("往.*%s"%code.lower(),title).group(0).replace("往","").replace(code.lower(),"")
train_type=re.search("列车类型:.* ",data).group(0).replace(" ","").replace("</td>","").replace("<td>","")
print(title)
print()
print(colorama.Style.BRIGHT+"从%s开往%s"%(start,end)+
colorama.Style.RESET_ALL)
print(train_type)
train_station=re.findall("<a href=\"/train.*\" target=\"_blank\">.*</a>",data)
# print("-"*100)
train_time=re.findall("([0-9]{2}:[0-9]{2})|(---)",data)
train_time.pop(0)
# print(train_time)
print("")
tableHead=["车站","到达时间","发车时间","走行时间(小时)"]
for i in tableHead:
tableHead[tableHead.index(i)]=colorama.Fore.GREEN+i+colorama.Fore.RESET
tableObj=prettytable.PrettyTable(tableHead)
tableObj.header=True
tableObj.horizontal_char = '-'
tableObj.junction_char='|'
cnt=0
for i in train_station:
row=[]
j=i.replace("</a>","")
e=j.index(">")
# print(j[e+1:],
# real(train_time[cnt]),
# real(train_time[cnt+1]),
# real(train_time[cnt+2]))
row.append(colorama.Fore.RED+j[e+1:]+colorama.Fore.RESET)
# print(colorama.Back.BLACK)
row.append(colorama.Fore.LIGHTMAGENTA_EX+real(train_time[cnt]))
row.append(real(train_time[cnt+1]))
row.append(real(train_time[cnt+2]))
print(colorama.Fore.RESET)
tableObj.add_row(row)
cnt=cnt+3
# print(colorama.Back.BLACK)
print(tableObj)
# print(colorama.Back.RESET)
real模块用于避免findall函数显示不对
仓库:https://gitee.com/pybilly/train_timetable/tree/master/
上一篇: 如何用python“优雅的”调用有道翻译
下一篇: java邮件发送