python 製作火車時刻表

python 製作火車時刻表

火車時刻表是一種方便快捷的查詢火車班次信息的工具,那麼,如何實現用python實現爬取這些網站的時刻表數據呢

一、訪問 http://www.ip138.com/ 查詢網的火車時刻表工具:http://qq.ip138.com/train/

網頁截圖

選擇“列車車次查詢”,並使用CHROME開發者工具,可以發現並沒有有關數據的XHR包,這是我們選擇用正則表達式提取數據。

選擇車次,可發現網址格式爲:

http://qq.ip138.com/train/<車次號>.htm

標題正則

<h1>.*</h1>

火車類型數據正則:

列車類型:.*&nbsp;

車站名正則
 

<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("列車類型:.*&nbsp;",data).group(0).replace("&nbsp;","").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/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章