python3.X 抓取火車票信息【修正版】
代碼是在源代碼的基礎(chǔ)上進(jìn)行的修改。希望對(duì)你有所幫助!
實(shí)現(xiàn)后如圖所示:
首先我們需要抓取一些基礎(chǔ)的數(shù)據(jù),各大火車站信息!
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()))
上面的代碼通過抓取,網(wǎng)頁(yè)信息,返回一個(gè)字典數(shù)據(jù):
stations = dict(zip(stations.keys(),stations.values()))#
這行代碼在后面進(jìn)行了建值互換,這里沒有進(jìn)行過修改,這是原文的數(shù)據(jù)。
火車站的數(shù)據(jù)抓取成功,我們接下來(lái)抓取查詢數(shù)據(jù),代碼如下:
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('請(qǐng)輸入開始城市:\n') f = stations[f1] t1 = input('請(qǐng)輸入目的城市:\n') t = stations[t1] d1 = input('請(qǐng)輸入出發(fā)時(shí)間:\n') d = str('2018-') + change_date(d1) student = input('是否為學(xué)生票,輸入(yes/no)') print('正在查詢' + f1 + '至' + t1 + '的列車,請(qǐng)聽聽音樂......') url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=vvxyksv9kd&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")
這里本人增加了兩個(gè)函數(shù) change_date() 和 student_or_not()
change_date()
這個(gè)函數(shù)對(duì)用戶輸入日期的行為進(jìn)行了簡(jiǎn)化,提高了用戶體驗(yàn),可以直接輸入比如7.3這樣的日期,其他的符號(hào),我們可以自己進(jìn)行擴(kuò)展。
student_or_not()
這個(gè)函數(shù)的作用是判斷查詢的是普通票還是學(xué)生票
美化顯示,區(qū)分到站和出發(fā)站點(diǎn)的顏色,我們加入如下函數(shù)
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])
最后我們進(jìn)行數(shù)據(jù)處理展示:
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) # 請(qǐng)求網(wǎng)址1的內(nèi)容 rows = r.json()['data']['result'] # 將內(nèi)容解析為列表 trains = PrettyTable() trains.field_names = ["車次", "車站", "時(shí)間", "歷時(shí)", "商務(wù)座\特等座", "一等座", "二等座", "高級(jí)軟臥", "軟臥", "動(dòng)臥", "硬臥 ", "軟座 ", "硬座", "無(wú)座", "其他"] # 設(shè)置table的header num = len(rows) # 打印列表的個(gè)數(shù) # station1 = dict([v, k] for k, v in stations.items()) station_list = dict(zip(stations.values(), stations.keys())) for row in rows : # 列表循環(huán) 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('查詢結(jié)束,共有 %d 趟列車。' % num) # 列表個(gè)數(shù)也就是列車個(gè)數(shù) print(trains)
這里我增加了 chair_lists()
函數(shù)進(jìn)行循環(huán)處理對(duì)應(yīng)的表段
用于空數(shù)據(jù)替換成‘–'
station_list = dict(zip(stations.values(), stations.keys())) #station_list 進(jìn)行了建值互換方便下面的循環(huán)中的調(diào)用 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)
這個(gè)抓取案例我們可以舉一反三,可以拓展很多功能,方便我們進(jìn)行數(shù)據(jù)快速查詢,比如展示價(jià)格等等!
源代碼在:https://github.com/morganlions/train
總結(jié)
以上所述是小編給大家介紹的python3.X 抓取火車票信息【修正版】,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Python使用爬蟲抓取美女圖片并保存到本地的方法【測(cè)試可用】
- Python爬蟲實(shí)現(xiàn)抓取京東店鋪信息及下載圖片功能示例
- Python基于分析Ajax請(qǐng)求實(shí)現(xiàn)抓取今日頭條街拍圖集功能示例
- Python使用Selenium模塊模擬瀏覽器抓取斗魚直播間信息示例
- Python使用Selenium模塊實(shí)現(xiàn)模擬瀏覽器抓取淘寶商品美食信息功能示例
- Python爬蟲之網(wǎng)頁(yè)圖片抓取的方法
- Python實(shí)現(xiàn)爬蟲抓取與讀寫、追加到excel文件操作示例
- python抓取網(wǎng)站的圖片并下載到本地的方法
- 對(duì)python抓取需要登錄網(wǎng)站數(shù)據(jù)的方法詳解
- Python selenium抓取微博內(nèi)容的示例代碼
- Python爬蟲抓取代理IP并檢驗(yàn)可用性的實(shí)例
- 使用Python抓取豆瓣影評(píng)數(shù)據(jù)的方法
相關(guān)文章
python3中編碼獲取網(wǎng)頁(yè)的實(shí)例方法
在本篇文章里小編給大家整理了一篇關(guān)于python3中編碼獲取網(wǎng)頁(yè)的實(shí)例方法,有興趣的朋友們可以學(xué)習(xí)下。2020-11-11Python之a(chǎn)scii轉(zhuǎn)中文的實(shí)現(xiàn)
這篇文章主要介紹了Python之a(chǎn)scii轉(zhuǎn)中文的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05python實(shí)現(xiàn)定時(shí)播放mp3
這篇文章主要介紹了python實(shí)現(xiàn)定時(shí)播放mp3,程序非常簡(jiǎn)單,功能很實(shí)用,主要是使用python實(shí)現(xiàn)了一首mp3歌每半小時(shí)播放一次,有需要的小伙伴可以參考下。2015-03-03Python中字典(dict)和列表(list)的排序方法實(shí)例
這篇文章主要介紹了Python中字典(dict)和列表(list)的排序方法實(shí)例,總結(jié)來(lái)說(shuō)優(yōu)先使用內(nèi)置的sort()方法進(jìn)行排序,需要的朋友可以參考下2014-06-06Python網(wǎng)絡(luò)通訊之TCP協(xié)議實(shí)現(xiàn)服務(wù)器和客戶端實(shí)例
這篇文章主要介紹了Python網(wǎng)絡(luò)通訊之TCP協(xié)議實(shí)現(xiàn)服務(wù)器和客戶端實(shí)例, socket編程一種獨(dú)立于協(xié)議的網(wǎng)絡(luò)編程接口,應(yīng)用程序可以通過它發(fā)送或接收數(shù)據(jù),可對(duì)其進(jìn)行像對(duì)文件一樣的打開、讀寫和關(guān)閉等操作,需要的朋友可以參考下2023-08-08