您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關使用python3.X怎么抓取火車票信息,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
實現后如圖所示:
首先我們需要抓取一些基礎的數據,各大火車站信息!
import urllib from urllib import request import re url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8955' req = urllib.request.Request(url) r = urllib.request.urlopen(req).read().decode('utf-8') stations = re.findall(r'([\u4e00-\u9fa5]+)|([A-Z]+)', r) stations = dict(stations) stations = dict(zip(stations.keys(),stations.values()))
上面的代碼通過抓取,網頁信息,返回一個字典數據:
stations = dict(zip(stations.keys(),stations.values()))#
這行代碼在后面進行了建值互換,這里沒有進行過修改,這是原文的數據。
火車站的數據抓取成功,我們接下來抓取查詢數據,代碼如下:
from station import stations import warnings def change_date(d1) : if '.' in d1 : d1 = d1.replace('.', '-') if not d1.startswith('0') : d1 = str(0) + d1 if '-' in d1[-2] : d1 = d1[:-1] + '0' + d1[-1] return d1 def student_or_not(student) : if 'y' in student[0].lower() : return '0X00' else : return 'ADULT' f1 = input('請輸入開始城市:\n') f = stations[f1] t1 = input('請輸入目的城市:\n') t = stations[t1] d1 = input('請輸入出發時間:\n') d = str('2018-') + change_date(d1) student = input('是否為學生票,輸入(yes/no)') print('正在查詢' + f1 + '至' + t1 + '的列車,請聽聽音樂......') url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=aegqsqibtmh&leftTicketDTO.from_station={f}&leftTicketDTO.to_station={t}&purpose_codes={student}' url = url.format(f=f, d=d, t=t, student=student_or_not(student)) warnings.filterwarnings("ignore")
這里本人增加了兩個函數 change_date() 和 student_or_not()
change_date()
這個函數對用戶輸入日期的行為進行了簡化,提高了用戶體驗,可以直接輸入比如7.3這樣的日期,其他的符號,我們可以自己進行擴展。
student_or_not()
這個函數的作用是判斷查詢的是普通票還是學生票
美化顯示,區分到站和出發站點的顏色,我們加入如下函數
def colored(color, text) : table = { 'red' : '\033[91m', 'green' : '\033[92m', 'nc' : '\033[0m' } cv = table.get(color) nc = table.get('nc') return ''.join([cv, text, nc])
最后我們進行數據處理展示:
import requests from get_urltrain import url from prettytable import PrettyTable from color_set import colored from station import stations def chair_lists(row_list) : chair_list = [] for i in range(len(row_list) - 5, 21, -1) : if row_list[i] != '' : chair_list.append(row_list[i]) else : chair_list.append('--') return chair_list headers = { 'user-agent' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36' } r = requests.get(url, verify=False, headers=headers) # 請求網址1的內容 rows = r.json()['data']['result'] # 將內容解析為列表 trains = PrettyTable() trains.field_names = ["車次", "車站", "時間", "歷時", "商務座\特等座", "一等座", "二等座", "高級軟臥", "軟臥", "動臥", "硬臥 ", "軟座 ", "硬座", "無座", "其他"] # 設置table的header num = len(rows) # 打印列表的個數 # station1 = dict([v, k] for k, v in stations.items()) station_list = dict(zip(stations.values(), stations.keys())) for row in rows : # 列表循環 row_list = row.split('|') chair_list = chair_lists(row_list) trains.add_row([row_list[3], '\n'.join([colored('green', station_list[row_list[6]]), colored('red', station_list[row_list[7]])]), '\n'.join([colored('green', row_list[8]), colored('red', row_list[9])]), row_list[10], ] + chair_list) print('查詢結束,共有 %d 趟列車。' % num) # 列表個數也就是列車個數 print(trains)
這里我增加了 chair_lists()
函數進行循環處理對應的表段
用于空數據替換成‘–'
station_list = dict(zip(stations.values(), stations.keys())) #station_list 進行了建值互換方便下面的循環中的調用 trains.add_row([row_list[3], '\n'.join([colored('green', station_list[row_list[6]]), colored('red', station_list[row_list[7]])]), '\n'.join([colored('green', row_list[8]), colored('red', row_list[9])]), row_list[10], ] + chair_list)
關于使用python3.X怎么抓取火車票信息就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。