基于Python實(shí)現(xiàn)火車(chē)票搶票軟件

    目錄

    導(dǎo)語(yǔ)

    每年得節(jié)假日一到,大家頭疼得總時(shí)同一個(gè)問(wèn)題:你買(mǎi)到回家得票了嗎?

    尤其是大型得節(jié)日:”比如國(guó)慶、春節(jié)......“

    數(shù)以?xún)|計(jì)得人口遷移,讓車(chē)票成了一年里最難買(mǎi)到得那張票。

    跨站買(mǎi)票、買(mǎi)短途票上車(chē)補(bǔ)票、準(zhǔn)點(diǎn)撿漏等已是老生常談得技巧。隨著互聯(lián)網(wǎng)得發(fā)展,搶票軟件成為購(gòu)票熱門(mén)渠道。搶票軟件得到底靠譜嘛?能搶到票嘛?

    近日,小編給大家就正式編寫(xiě)一款Python實(shí)現(xiàn)查票以及自動(dòng)購(gòu)票搶票得小程序給大家,希望大家如愿!

    環(huán)境準(zhǔn)備

    1)運(yùn)行環(huán)境:Python 3 、Pycharm、谷歌瀏覽器、谷歌驅(qū)動(dòng) 。

    2)模塊準(zhǔn)備: 

    requests ---> pip install requests (數(shù)據(jù)請(qǐng)求模塊)

    prettytable ---> pip install prettytable (打印好看一些 )

    selenium ---> pip install selenium==3.141.0 (模擬人得行為去操作瀏覽器)

    json ---> 內(nèi)置模塊 不需要安裝

    PS小編有話(huà)說(shuō):(新手看過(guò)來(lái))

    模塊安裝問(wèn)題:

    如果安裝python第三方模塊:

    1. win + R 輸入 cmd 點(diǎn)擊確定, 輸入安裝命令 pip install 模塊名 (pip install requests) 回車(chē)

    2. 在pycharm中點(diǎn)擊Terminal(終端) 輸入安裝命令

    安裝失敗原因:

    失敗一: pip 不是內(nèi)部命令

    解決方法: 設(shè)置環(huán)境變量

    失敗二: 出現(xiàn)大量報(bào)紅 (read time out)

    解決方法: 因?yàn)槭蔷W(wǎng)絡(luò)鏈接超時(shí),  需要切換鏡像源

    例如:pip3 install -i https://pypi.doubanio.com/simple/ 模塊名

    失敗三: cmd里面顯示已經(jīng)安裝過(guò)了, 或者安裝成功了, 但是在pycharm里面還是無(wú)法導(dǎo)入

    解決方法: 可能安裝了多個(gè)python版本 (anaconda 或者 python 安裝一個(gè)即可) 卸載一個(gè)就好

    或者你pycharm里面python解釋器沒(méi)有設(shè)置好。

    如何配置pycharm里面得python解釋器?

    1. 選擇file(文件) >>> setting(設(shè)置) >>> Project(項(xiàng)目) >>> python interpreter(python解釋器)

    2. 點(diǎn)擊齒輪, 選擇add

    3. 添加python安裝路徑

    pycharm如何安裝插件?

    1. 選擇file(文件) >>> setting(設(shè)置) >>> Plugins(插件)

    2. 點(diǎn)擊 Marketplace  輸入想要安裝得插件名字 比如:翻譯插件 輸入 translation / 漢化插件 輸入 Chinese

    3. 選擇相應(yīng)得插件點(diǎn)擊 install(安裝) 即可

    4. 安裝成功之后 是會(huì)彈出 重啟pycharm得選項(xiàng) 點(diǎn)擊確定, 重啟即可生效

    項(xiàng)目思路

    12306 每天只能退票三次

    查票

    購(gòu)票

    建議谷歌或者火狐....

    爬蟲(chóng)采集數(shù)據(jù)思路:

    一. 分析數(shù)據(jù)來(lái)源

    車(chē)票信息, 來(lái)源那個(gè)數(shù)據(jù)包 <車(chē)票信息請(qǐng)求那個(gè)網(wǎng)站url地址可以得到>

    開(kāi)發(fā)者工具  1  2

    二. 代碼實(shí)現(xiàn)步驟:

    1. 發(fā)送請(qǐng)求, 對(duì)于剛剛分析得到url地址發(fā)送請(qǐng)求

    https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2022-07-02&leftTicketDTO.from_station=CSQ&leftTicketDTO.to_station=SHH&purpose_codes=ADULT

    2. 獲取數(shù)據(jù), 獲取服務(wù)器返回響應(yīng)數(shù)據(jù), response

    3. 解析數(shù)據(jù), 提取我們想要車(chē)次信息

    代碼展示

    import requests# 導(dǎo)入漂亮得表格輸出模塊 ---> 第三方模塊 需要 在cmd里面進(jìn)行 pip install prettytableimport prettytable as pt# 導(dǎo)入jsonimport json# 導(dǎo)入selenium模塊 ---> 第三方模塊 需要 在cmd里面進(jìn)行 pip install selenium==3.141.0from selenium import webdriver# 導(dǎo)入賬號(hào)密碼from password import account, Password# 導(dǎo)入selenium控制鍵盤(pán)from selenium.webdriver.common.keys import Keys# 創(chuàng)建瀏覽器 <打開(kāi)瀏覽器>  瀏覽器驅(qū)動(dòng)放在python安裝目錄里面就不需要添加路徑  def get_ticket(num, from_station, to_station, date_key):    driver = webdriver.Chrome()    # 輸入網(wǎng)址    driver.get('https://kyfw.12306.cn/otn/resources/login.html')    # 通過(guò)元素定位, 找到賬號(hào)輸入框 輸入賬號(hào) send_keys() 發(fā)送或者輸入內(nèi)容    driver.find_element_by_css_selector('#J-userName').send_keys(account)  # 通過(guò) css 選擇器查找元素    # 通過(guò)元素定位, 找到密碼輸入框 輸入密碼 send_keys() 發(fā)送或者輸入內(nèi)容    driver.find_element_by_css_selector('#J-password').send_keys(Password)  # 通過(guò) css 選擇器查找元素    # 通過(guò)元素定位, 找到登陸按鈕, 點(diǎn)擊登陸    driver.find_element_by_css_selector('#J-login').click()    # 隱式等待    driver.implicitly_wait(10)    # 通過(guò)元素定位, 點(diǎn)擊彈窗確定按鈕 .表示class # 表示ID    driver.find_element_by_css_selector('.modal-ft .btn').click()    # 通過(guò)元素定位, 點(diǎn)擊車(chē)票預(yù)定    driver.find_element_by_css_selector('#link_for_ticket').click()    # 通過(guò)元素定位, 點(diǎn)擊鍵盤(pán)回車(chē)    driver.find_element_by_css_selector('#fromStationText').send_keys(Keys.ENTER)    # 通過(guò)元素定位, 清空輸入框內(nèi)容    driver.find_element_by_css_selector('#fromStationText').clear()    # 通過(guò)元素定位, 點(diǎn)擊一下輸入框    driver.find_element_by_css_selector('#fromStationText').click()    # 通過(guò)元素定位, 輸入出發(fā)城市    driver.find_element_by_css_selector('#fromStationText').send_keys(from_station)    # 通過(guò)元素定位, 點(diǎn)擊鍵盤(pán)回車(chē)    driver.find_element_by_css_selector('#fromStationText').send_keys(Keys.ENTER)    driver.find_element_by_css_selector('#toStationText').clear()    driver.find_element_by_css_selector('#toStationText').click()    driver.find_element_by_css_selector('#toStationText').send_keys(to_station)    driver.find_element_by_css_selector('#toStationText').send_keys(Keys.ENTER)    date = driver.find_element_by_css_selector('.inp-w #train_date')    date.clear()    date.send_keys(date_key)    # 通過(guò)元素定位, 點(diǎn)擊查詢(xún)按鈕    driver.find_element_by_css_selector('#query_ticket').click()    if num == 1:        driver.find_element_by_css_selector(f'#queryLeftTable tr:nth-child({num}) a.btn72').click()    elif num != 1:        driver.find_element_by_css_selector(f'#queryLeftTable tr:nth-child({num + 1}) a.btn72').click()        # #normalPassenger_0    driver.find_element_by_css_selector('#normalPassenger_1').click()     driver.find_element_by_css_selector('#submitOrder_id').click()    driver.find_element_by_css_selector('#qr_submit_id').click()    driver.find_element_by_css_selector('#qr_submit_id').click()  f = open('city.json', encoding='utf-8')text = f.read()  # 讀取文件json_data = json.loads(text)from_city = input('請(qǐng)輸入你要出發(fā)城市: ')to_city = input('請(qǐng)輸入你要到達(dá)城市: ')date = input('請(qǐng)輸入你要出發(fā)得時(shí)間: ')from_station = json_data[from_city]to_station = json_data[to_city] """發(fā)送請(qǐng)求, 模擬瀏覽器對(duì)于url地址發(fā)送請(qǐng)求    快捷批量替換方法:        選中內(nèi)容, ctrl + R 輸入正則表達(dá)式命令點(diǎn)擊全部替換即可        (.*?): (.*)        '$1': '$2',"""# 確定請(qǐng)求網(wǎng)址 ---> 如果對(duì)于長(zhǎng)鏈接, 我們是可以分段寫(xiě) ? 后面都是屬于請(qǐng)求參數(shù)url = 'https://kyfw.12306.cn/otn/leftTicket/query'# 請(qǐng)求參數(shù) ---> 字典數(shù)據(jù)類(lèi)型, 構(gòu)建成完整鍵值對(duì), 鍵值對(duì)與鍵值對(duì)之間要用逗號(hào)隔開(kāi)data = {    'leftTicketDTO.train_date': date,    'leftTicketDTO.from_station': from_station,    'leftTicketDTO.to_station': to_station,    'purpose_codes': 'ADULT',}# 請(qǐng)求頭 ---> 偽裝模擬瀏覽器得, 把python代碼偽裝成瀏覽器發(fā)送請(qǐng)求headers = {    # User-Agent: 用戶(hù)代理, 表示瀏覽器基本身份標(biāo)識(shí)    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36',}# 發(fā)送請(qǐng)求 ---> 返回?cái)?shù)據(jù) <Response [200]> 響應(yīng)對(duì)象 200狀態(tài)碼表示請(qǐng)求成功response = requests.get(url=url, params=data, headers=headers) # 獲取數(shù)據(jù) response.json() 獲取響應(yīng)對(duì)象json字典數(shù)據(jù)# 解析數(shù)據(jù) ---> 根據(jù)數(shù)據(jù)類(lèi)型以及你想要獲取數(shù)據(jù)內(nèi)容, 選擇最合適提取方式 根據(jù)冒號(hào)左邊得內(nèi)容, 提取冒號(hào)右邊內(nèi)容result = response.json()['data']['result'] # 實(shí)例化對(duì)象tb = pt.PrettyTable()tb.field_names = [    '序號(hào)',    '車(chē)次',    '出發(fā)時(shí)間',    '到達(dá)時(shí)間',    '耗時(shí)',    '特等座',    '一等',    '二等',    '軟臥',    '硬臥',    '硬座',    '無(wú)座',]page = 0lis = []# for循環(huán) 就把列表里面元素一個(gè)一個(gè)提取出來(lái)for index in result:    # split() 字符串分割方法 --> 返回是列表    content_list = index.split('|')    #  根據(jù)列表索引位置提取內(nèi)容    num = content_list[3]  # 車(chē)次    start_time = content_list[8]  # 出發(fā)時(shí)間    end_time = content_list[9]  # 到達(dá)時(shí)間    use_time = content_list[10]  # 耗時(shí)    topGrade = content_list[25]  # 特等座    if topGrade:        pass    else:        topGrade = content_list[32]    first_class = content_list[31]  # 一等    second_class = content_list[30]  # 二等    hard_sleeper = content_list[28]  # 硬臥    hard_seat = content_list[29]  # 硬座    no_seat = content_list[26]  # 無(wú)座    soft_sleeper = content_list[23]  # 軟臥    dit = {        '車(chē)次': num,        '出發(fā)時(shí)間': start_time,        '到達(dá)時(shí)間': end_time,        '耗時(shí)': use_time,        '特等座': topGrade,        '一等': first_class,        '二等': second_class,        '軟臥': soft_sleeper,        '硬臥': hard_sleeper,        '硬座': hard_seat,        '無(wú)座': no_seat,    }    lis.append(dit)    tb.add_row([        page,        num,        start_time,        end_time,        use_time,        topGrade,        first_class,        second_class,        soft_sleeper,        hard_sleeper,        hard_seat,        no_seat,    ])    page += 1    # 更加方便直觀查看 索引位置 ---> 列表可以通過(guò)索引位置取值    # num = 0    # for i in content_list:    #     # i 列表里面元素, num 對(duì)應(yīng)列表索引位置    #     print(i, num)    #     num += 1    # breakprint(tb)  num = input('請(qǐng)輸入你想要購(gòu)買(mǎi)車(chē)票序號(hào): ') get_ticket(num=int(num), from_station=from_city, to_station=to_city, date_key=date)

    到此這篇關(guān)于基于Python實(shí)現(xiàn)火車(chē)票搶票軟件得內(nèi)容就介紹到這了,更多相關(guān)Python火車(chē)票搶票內(nèi)容請(qǐng)搜索之家以前得內(nèi)容或繼續(xù)瀏覽下面得相關(guān)內(nèi)容希望大家以后多多支持之家!

    聲明:所有內(nèi)容來(lái)自互聯(lián)網(wǎng)搜索結(jié)果,不保證100%準(zhǔn)確性,僅供參考。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。
    發(fā)表評(píng)論
    更多 網(wǎng)友評(píng)論1 條評(píng)論)
    暫無(wú)評(píng)論

    返回頂部

    主站蜘蛛池模板: 无码精品久久一区二区三区| 国产精品视频一区二区三区| 无码少妇一区二区性色AV| 国产一区二区精品久久| 2018高清国产一区二区三区| 精品一区狼人国产在线| 精品视频在线观看你懂的一区| 久久一区二区明星换脸| 亚洲Av永久无码精品一区二区| 一区二区三区福利| 亚洲一区二区在线免费观看| 夜夜高潮夜夜爽夜夜爱爱一区| 精品成人一区二区三区四区| 久久精品黄AA片一区二区三区| 日韩欧美一区二区三区免费观看| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 一区二区免费电影| 午夜精品一区二区三区免费视频| 亚洲a∨无码一区二区| 国产成人片视频一区二区| 精品一区二区三区免费毛片爱| 国产在线观看一区二区三区| 亚洲V无码一区二区三区四区观看| 亚洲国产欧美日韩精品一区二区三区| 男人的天堂精品国产一区| 国产午夜精品一区二区三区漫画| 精品国产一区二区三区AV| 国产一区二区三区高清在线观看 | 欧洲精品码一区二区三区免费看 | 丰满人妻一区二区三区视频53| 国产在线乱子伦一区二区| 丝袜无码一区二区三区| 国产精品熟女视频一区二区 | 波多野结衣一区在线观看| 亚洲av无码一区二区三区不卡| 国产丝袜无码一区二区视频| 中文字幕一区二区三匹| 国模无码人体一区二区| 精品视频午夜一区二区| 中文字幕无线码一区二区| 免费视频精品一区二区三区|