用PyQt5編輯 12306車票資訊爬取程式

專注的阿熊發表於2021-05-18

建立 query_request.py 檔案用於發現資料後的處理工作

from get_stations import *

import requests

'''5-7 目的地 3   車次 6   出發地 8   出發時間 9   到達時間 10 歷時 26 無坐 29 硬座

    24 軟座 28 硬臥 33 動臥 23 軟臥 21 高階軟臥 30 二等座 31 一等座 32 商務座特等座

'''

data = []  # 用於儲存整理好的車次資訊

type_data = []  # 儲存車次分類後最後的資料

headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',

            'Cookie':'_uab_collina=162044599452968647580256; JSESSIONID=ABB3D0F36AA12C3E5DAD5CD1D3CFF031; '

                     'RAIL_EXPIRATION=1620786883959; RAIL_DEVICEID=hu-C8-xxpDNSCuX_BiPS1CGOlxAyoXu-dncsv32QDPvmjG'                   'R9Ua0AUywoyJ6FDeqRWMoixIIL24hbMf9ucn2MrHcPWjgYFJ6y6Fon9ihvKvZV8SIiGDYmZTuR-S2OLu3wyezmWPPO'

                     'un2B-v2BR_Q0wEYkIrBLIE8j; _jc_save_fromStation=%u5317%u4EAC%2CBJP; _jc_save_toStation=%u4E0'

                     'A%u6D77%2CSHH; _jc_save_fromDate=2021-05-08; _jc_save_toDate=2021-05-08; _jc_save_wfdc_flag='

                     'dc; BIGipServerpassport=988283146.50215.0000; route=495c805987d0f5c8c84b14f60212447d; BIGipS'

                     'erverotn=417857802.50210.0000; BIGipServerportal=3084124426.17183.0000'}

def query(date, from_station, to_station):

     data.clear()  # 清空資料

     type_data.clear()  # 清空車次分類儲存的資料

     # 查詢請求地址

     url = '{}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(

         date, from_station, to_station)

     # 傳送查詢請求

     response = requests.get(url=url,headers=headers)

     # # json 資料轉換為字典型別,透過鍵值對取資料

     result = response.json()

     result = result['data']['result']

     # 判斷車站檔案是否存在

     if isStations() == True:

         stations = eval(read())  # 讀取所有車站並轉換為 dic 型別

         if len(result) != 0:  # 判斷返回資料是否為空

             for i in result:

                 # # 分割資料並新增到列表中

                 tmp_list = i.split('|')

                 # 因為查詢結果中出發站和到達站為站名的縮寫字母,所以需要在車站庫中找到對應的車站名稱

                 from_station = list(stations.keys())[list(stations.values()).index(tmp_list[6])]

                 to_station = list(stations.keys())[list(stations.values()).index(tmp_list[7])]

                 # 建立座位陣列,外匯跟單gendan5.com由於返回的座位資料中含有空既“”,所以將空改成 -- 這樣好識別

                 seat = [tmp_list[3], from_station, to_station, tmp_list[8], tmp_list[9], tmp_list[10]

                     , tmp_list[32], tmp_list[31], tmp_list[30], tmp_list[21]

                     , tmp_list[23], tmp_list[33], tmp_list[28], tmp_list[24], tmp_list[29], tmp_list[26]]

                 newSeat = []

                 # 迴圈將座位資訊中的空既“”,改成 -- 這樣好識別

                 for s in seat:

                     if s == "":

                         s = "--"

                     else:

                         s = s

                     newSeat.append(s)  # 儲存新的座位資訊

                 data.append(newSeat)

         return data  # 返回整理好的車次資訊

# 獲取高鐵資訊的方法

def g_vehicle():

     if len(data) != 0:

         for g in data:  # 迴圈所有火車資料

             i = g[0].startswith('G')  # 判斷車次首字母是不是高鐵

             if i:  # 如果是將該條資訊新增到高鐵資料中

                 type_data.append(g)

# 移除高鐵資訊的方法

def r_g_vehicle():

     if len(data) != 0 and len(type_data) != 0:

         for g in data:

             i = g[0].startswith('G')

             if i:  # 移除高鐵資訊

                 type_data.remove(g)

# 獲取動車資訊的方法

def d_vehicle():

     if len(data) != 0:

         for d in data:  # 迴圈所有火車資料

             i = d[0].startswith('D')  # 判斷車次首字母是不是動車

             if i == True:  # 如果是將該條資訊新增到動車資料中

                 type_data.append(d)

# 移除動車資訊的方法

def r_d_vehicle():

     if len(data) != 0 and len(type_data) != 0:

         for d in data:

             i = d[0].startswith('D')

             if i == True:  # 移除動車資訊

                 type_data.remove(d)

# 獲取直達車資訊的方法

def z_vehicle():

     if len(data) != 0:

         for z in data:  # 迴圈所有火車資料

             i = z[0].startswith('Z')  # 判斷車次首字母是不是直達

             if i == True:  # 如果是將該條資訊新增到直達資料中

                 type_data.append(z)

# 移除直達車資訊的方法

def r_z_vehicle():

     if len(data) != 0 and len(type_data) != 0:

         for z in data:

             i = z[0].startswith('Z')

             if i == True:  # 移除直達車資訊

                 type_data.remove(z)

# 獲取特快車資訊的方法

def t_vehicle():

     if len(data) != 0:

         for t in data:  # 迴圈所有火車資料

             i = t[0].startswith('T')  # 判斷車次首字母是不是特快

             if i == True:  # 如果是將該條資訊新增到特快車資料中

                 type_data.append(t)

# 移除特快車資訊的方法

def r_t_vehicle():

     if len(data) != 0 and len(type_data) != 0:

         for t in data:

             i = t[0].startswith('T')

             if i == True:  # 移除特快車資訊

                 type_data.remove(t)

# 獲取快速車資料的方法

def k_vehicle():

     if len(data) != 0:

         for k in data:  # 迴圈所有火車資料

             i = k[0].startswith('K')  # 判斷車次首字母是不是快車

             if i == True:  # 如果是將該條資訊新增到快車資料中

                 type_data.append(k)

# 移除快速車資料的方法

def r_k_vehicle():

     if len(data) != 0 and len(type_data) != 0:

         for k in data:

             i = k[0].startswith('K')

             if i == True:  # 移除快車資訊

                 type_data.remove(k)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2772836/,如需轉載,請註明出處,否則將追究法律責任。

相關文章