python查詢火車票(python判斷火車票座位代碼)

  • 1、python 火車票查票的代碼 其中 e=re.findall(‘%s\|([^|]+)’ % e,cont)[0]
  • 2、實驗樓python實現火車票查詢工具怎麼在windows上運行
  • 3、python爬蟲12306獲取是否有車票
  • 4、python如何判斷購買火車有沒有對應的列車,沒有就輸出未查詢到對應的車次?
  • 5、Python 實現一個火車票查詢的工具
  • 6、python新手代碼是什麼?

‘%s\|([^|]+)’ % e

這是” 格式化字符串%參數 “的形式 ‘%s\|([^|]+)’ 是用于格式化的字符串,%e e是參數

%s表示將e作為字符串打印 ‘\|([^|]+)’ 於’|([^|]+’)相同,如e 為hello,這個字符串就是

‘hello|([^|]+)’ 這就是實際傳給findall的正則表達式,這樣正則就不對吧

如果字符串前有r才對吧,e=re.findall(r’%s\|([^|]+)’ % e,cont)[0] ,這樣提取findall查找到的列表中下標為0的第一個值

把D:\python-2.7.3\加到path的環境變量裡面就行,不要寫成D:\python-2.7.3\python,我看你現在就寫成了後面那個。因為你加到path里的應該是一個目錄,然後你在命令行裡面輸入python的時候,它會自動到path變量裡面的各個目錄底下去找存不存在python.exe這個程序。所以你在path裡面輸入的應該是目錄,也就是D:\python-2.7.3\就可以了。然後到hello.py在的目錄底下,也就是D盤,執行pythonhello.py就行了。p.s.最簡單在某一個目錄底下打開命令行的方式是在“我的電腦”瀏覽那個目錄的時候“shift+右擊鼠標”,然後菜單裡面有一個“在此處打開命令窗口”就行了。這樣就不需要用cd去切換了。

看看這個可以嗎

功能:

1:全自動爬所有車站列表

2:爬所有車站之間的所有車次,過濾重複,保存文件

爬過程中保存文件

遇到http異常,停止繼續

腳本代碼

[python] view plaincopy

#coding:utf-8

__author__ = ‘watsy’

from sgmllib import SGMLParser

import urllib

import urllib2

import datetime

import json

import os

from time import sleep

# 城市對象

class cityObject(object):

def __init__(self, abbr_pinyin=””, full_pinyin=””,chinaname=””,shortCode=””):

self.abbr_pinyin = abbr_pinyin

self.full_piyin = full_pinyin

self.chinaname = chinaname

self.shortCode = shortCode

# 火車

class trainObject(object):

def __init__(self, tid=””, code=””, start_city=””, start_time=””, end_city=””, end_time=””, full_time=””):

self.tid = tid

self.code = code

self.start_city = start_city

self.start_time = start_time

self.end_city = end_city

self.end_time = end_time

self.full_time = full_time

def get_writestr(self):

# return (“%s,%s,%s,%s,%s,%s,%s”) % (self.tid, self.code, self.start_city.encode(‘utf-8’), self.start_time, self.end_city.encode(‘utf-8’), self.end_time, self.full_time)

str_return = self.tid + “,”;

str_return += self.code + “,”;

str_return += self.start_city + “,”;

str_return += self.start_time + “,”;

str_return += self.end_city + “,”;

str_return += self.end_time + “,”;

str_return += self.full_time;

return str_return

# 火車列表

class trainModel(list):

def isExist(self, train):

for sub_train in self:

if sub_train.code == train.code:

return True

return False

def save(self):

train = self[-1]

with open((“%s.txt”) % (train.code), “w”) as wf:

print train.get_writestr()

wf.write(train.get_writestr().encode(‘utf-8’))

# 解析城市

def parserCitys(data):

parser_citys = []

for original_city in data:

if original_city and len(original_city) 1:

split_city = original_city.split(‘|’)

parser_city = cityObject(split_city[0], split_city[3], split_city[1], split_city[2])

parser_citys.append(parser_city)

print len(parser_citys)

return parser_citys

# 生成url地址

def getBookingTrainListUrl(start_code, end_code, day):

strUrl = (“;”)

strUrl += (“orderRequest.train_date=%s”) % (day)

strUrl += (“orderRequest.from_station_telecode=%s”) % (start_code)

strUrl += (“orderRequest.to_station_telecode=%s”) % (end_code)

strUrl += (“orderRequest.train_no=trainPassType=QBtrainClass=QB%23D%23Z%23T%23K%23QT%23includeStudent=00seatTypeAndNum=orderRequest.start_time_str=00%3A00–24%3A00”)

return strUrl

trains = trainModel()

# 解析 預定車次列表

def parser_booking_str(str_booking):

json_book = json.loads(str_booking)

datas = json_book[‘datas’]

if datas and len(datas) 1:

# print datas.replace(” “,””)

trainlist = datas.replace(” “,””).split(“\\n”)

for train_str in trainlist:

train_str_list = train_str.split(‘,’)

if len(train_str_list) == 17:

str_id_and_code = train_str_list[1]

str_start_city_and_time = train_str_list[2]

str_end_city_and_time = train_str_list[3]

str_full_time = train_str_list[4]

# print str_id_and_code

str_id = str_id_and_code[13:25]

str_code = str_id_and_code[131:-7]

# print str_start_city_and_time

if len(str_start_city_and_time) 50:

str_start_city = str_start_city_and_time[43:-9]

else :

str_start_city = str_start_city_and_time[0:-9]

str_start_time = str_start_city_and_time[-5:]

# print str_end_city_and_time

if len(str_end_city_and_time) 50:

str_end_city = str_end_city_and_time[42:-9]

else:

str_end_city = str_end_city_and_time[0:-9]

str_end_time = str_end_city_and_time[-5:]

tobj = trainObject(str_id, str_code, str_start_city, str_start_time, str_end_city, str_end_time, str_full_time)

if trains.isExist(tobj) == False:

trains.append(tobj)

trains.save()

#打開城市列表頁面

u = urllib2.urlopen(“”)

buffer = u .read()

u.close()

#獲取列表

buffer = buffer[20:-3]

unformatter_citys = buffer.split(‘@’)

#得到城市

parser_citys = parserCitys(unformatter_citys)

city_length = len(parser_citys)

today = datetime.date.today()

torrow = datetime.timedelta(days=1)

today = today + torrow

day_str = (“%s-%02d-%02d”) % (today.year, int(today.month), int(today.day))

print (day_str)

strPath = os.getcwd()

os.chdir(“%s/train/” % strPath)

for i in range(1, city_length):

for j in range(0 , len(parser_citys) – i):

try:

print (“[%d %d]” % (i , j))

sleep(0.09)

strurl = getBookingTrainListUrl(parser_citys[i].shortCode, parser_citys[j].shortCode, day_str)

url_add_header = urllib2.Request(strurl)

url_add_header.add_header(‘X-Requested-With’, “XMLHttpRequest”)

url_add_header.add_header(‘Referer’, “”)

url_add_header.add_header(‘Content-Type’, ‘application/x-www-form-urlencoded’)

url_add_header.add_header(‘Connection’, ‘keep-alive’)

resp = urllib2.urlopen(url_add_header)

urlread = resp.read()

resp.close()

parser_booking_str(urlread)

except urllib2.HTTPError as err:

print (“error : [%s] url=[%s]”) % (err, strurl)

exit(1)

os.chdir(strPath)

print len(trains)

登錄一下你購買的這一個車次之後,如果你確定成功的話,肯定就是已經購買成功,或者是你重新再購買一下,看一下是否可以下單不付款。

使用 python 實現一個查詢火車票的小工具

主要功能:

輸入出發車站,到達車站,時間,然後返回所有的車次信息,和余票信息

支持輸入附加選項查詢不同的火車的類型,比如高鐵,動車。

#查詢上海到北京2017-04-25的高鐵和動車的車票,-g -d 是附加選項 表示高鐵和動車

python3 trains.py -gd 上海 北京 2017-04-25

運行結果:

1. 對12306網站買票過程抓包分析

點擊查詢之後,通過抓包發現返回了一個json的文件,查看這個文件,就是保存着具體車次的信息。抓包如下圖所示。

請求的url 是:

GET /otn/leftTicket/query?leftTicketDTO.train_date=2017-04-20leftTicketDTO.from_station=TJPleftTicketDTO.to_station=TYVpurpose_codes=ADULT HTTP/1.1

發現這個請求使用的是get方法,然後傳遞了四個參數,一個是出發站,一個是到達車站,一個是成年人or學生,最後一個是時間。如下圖:

但是有一個問題是,我輸入的是天津到太原,但是這個卻轉換成了拼音的簡稱。必須要找到這個轉換的字典是什麼,這樣才能正確的使用這個接口。

在網頁的源代碼找到這個文件,station_name.js 文件,如下圖:

js文件的格式是,如下圖,使用的話,必須要想用正則表達式處理一下:

2. 使用正則表達式處理這個js文件

使用正則表達式,將js 文件裡面的車站名字和對應的簡稱提取出來,然後寫入到一個station.py 文件裡面,作為字典,程序運行的時候,將這個文件以模塊的形式包含進去。

關於正則表達式,先佔一個坑,以後在詳細的寫。

正則表達式的代碼:

運行的時候:

# 將輸出重定向到一個新的文件stations.py裡面python3 test3.py stations.py

3. 使用docopt 優雅的完成命令行的輸入

docopt 是一個很優雅的處理輸入的一個模塊,docopt可以根據你寫的文檔描述,可以自動為你生成解析器,可以非常容易的為你的python程序創建命令行界面。

4. 主程序

4.1 處理url

4.2 輸出

運行結果:

5. 使用prettytable模塊 優雅的輸出

詳細:

作者 sexycoder 本文轉載自簡書,轉載需授權

python新手代碼是:

1、shuizitiqu.py——————數字提取。

2、socker_ping.py——————長ping 檢測網絡狀態。

3、spider_tieba.py——————爬取百度貼吧圖片。

4、tianqi.py——————微信自動回復天氣。

5、ticket_searchTrain.py——————12306火車票查詢。

6、ticket_stations.py——————12306火車站點。

7、txt.py——————txt文件抽取。

8、weixinhuifu.py——————微信自動回復天氣。

9、xlsfile.py——————xls文件提取。

原創文章,作者:R1FGI,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/126138.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
R1FGI的頭像R1FGI
上一篇 2024-10-03 23:06
下一篇 2024-10-03 23:06

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論