搶火車票這個事吧,其實我也能做!(python黑科技)

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

又是一年,馬上就要回家過年了,還沒有買到票的小伙伴們是否已經像熱鍋上的螞蟻了無腦的開始找黃牛了?

俗話說的好,求人不如求自己,搶票這玩意,其實我覺得我也可以~

來來來,直接入正題吧! 這里有兩種方案,一種是基于Selenium2的自動化框架控制瀏覽器實現,另一種方案則是基于Python自身的爬蟲package如request,urllib等來實現,本文實現第一種方案,第二種方案也在摸索中。

實現過程

一、新版12306官網主要頁面網址

https://kyfw.12306.cn/otn/resources/login.html
https://kyfw.12306.cn/otn/view/index.html
https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc

二、瀏覽器驅動信息

這里使用的是chrome瀏覽器

在此處下載
https://sites.google.com/a/chromium.org/chromedriver/downloads

三、初始化必要信息

買票必要信息,比如乘車人,來往車站,車次類型等等

# 乘客姓名
passengers_input = 'xxx'
passengers = passengers_input.split(",")#乘車日期,格式為2019-01-10
from_time = '2019-01-31'# 城市cookie字典
city_list = {'sz':'%u6DF1%u5733%2CSZQ', #深圳'zz':'%u90D1%u5DDE%2CZZF', #鄭州'gz':'%u5E7F%u5DDE%2CGZQ', #廣州
}
# 出發站
from_station = '%u5E7F%u5DDE%2CGZQ'# 終點站
to_station = '%u90D1%u5DDE%2CZZF'# 車次編號
numbers = ['Z90','Z190','Z14','Z168','Z98','T124','T370']# 座位類型
seat_type = '硬臥'#通知郵件
receiver_email = 'xxxxxxxxx@163.com'

注意:城市字典是將城市簡寫和城市代碼之間聯系起來。如果沒有你想要到城市,可以在打開12306的查票頁面,然后打開瀏覽器的開發者模式,輸入對應的城市,然后查看請求信息。

image.png

四、登錄功能實現

登錄我們需要手動登錄,掃碼或者輸入賬號都可以。登錄后記錄session,供后面搶票使用


def do_login(self):"""登錄功能實現,手動識別驗證碼進行登錄"""self.driver.visit(self.login_url)sleep(1)# 選擇登陸方式登陸print('請掃碼登陸或者賬號登陸……')while True:if self.driver.url != self.init_my_url:sleep(1)else:break

五、搶票功能實現

核心功能實現,通過掃描關鍵字來確認是否有余票,然后實現點擊頁面,進而走向下一步。

current_tr = self.driver.find_by_xpath('//tr[@datatran="' + number + '"]/preceding-sibling::tr[1]')
if current_tr:if current_tr.find_by_tag('td')[self.seat_type_index].text == '--':print('無此座位類型出售,已結束當前刷票,請重新開啟!')sys.exit(1)else:# 有票,嘗試預訂print('刷到票了(余票數:' + str(current_tr.find_by_tag('td')[self.seat_type_index].text) + '),開始嘗試預訂……')current_tr.find_by_css('td.no-br>a')[0].click()sleep(1)key_value = 1for p in self.passengers:# 選擇用戶print('開始選擇用戶……')self.driver.find_by_text(p).last.click()# 選擇座位類型print('開始選擇席別……')if self.seat_type_value != 0:self.driver.find_by_xpath("//select[@id='seatType_" + str(key_value) + "']/option[@value='" + str(self.seat_type_value) + "']").first.click()key_value += 1sleep(0.2)if p[-1] == ')':self.driver.find_by_id('dialog_xsertcj_ok').click()print('正在提交訂單……')self.driver.find_by_id('submitOrder_id').click()sleep(2)print('正在確認訂單……')self.driver.find_by_id('qr_submit_id').click()

六、搶票成功后郵件通知自己

一個很簡單的功能,不過卻是必要的,避免自己錯過!

def send_mail(self, receiver_address, content):"""發送郵件通知"""# 連接郵箱服務器信息host = 'xxxx.163.com'port = 25sender = 'xxxxxx@163.com'  # 你的發件郵箱號碼pwd = 'xxxxx'  # 第三方授權登錄嗎,不是登錄密碼!!# 發件信息receiver = receiver_addressbody = '<h2>溫馨提醒:</h2><p>' + content + '</p>'msg = MIMEText(body, 'html', _charset="utf-8")msg['subject'] = '搶票成功通知!'msg['from'] = sendermsg['to'] = receivers = smtplib.SMTP(host, port)# 開始登陸郵箱,并發送郵件s.login(sender, pwd)s.sendmail(sender, receiver, msg.as_string())

過程演示

  • 執行代碼

  • 登錄12306網站

  • 搶票成功

  • 等待支付

  • 郵件通知


總結:

總的來說是成功的,但還不是完全自動化的。不過相比手動搶票還是快很多的。其實網上這種代碼很多,只不過因為12306網站的更新大多數不能用了,我也是在前輩們的基礎上修改完成的。想要最新源碼的同學可以關注的我公眾號,回復搶票源碼!

轉載于:https://my.oschina.net/dingxiaoshui/blog/3000044

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252564.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252564.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252564.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用 Python+openpose 實現抖音尬舞機

游戲開始后&#xff0c;隨著音樂會給出不同的動作提示&#xff0c;用戶按照提示擺出正確動作即可得分。援引官方說法&#xff0c;“尬舞機”主要應用了今日頭條 AI Lab 自主開發的“人體關鍵點檢測技術”&#xff0c;依靠這項技術&#xff0c;抖音能夠檢測到圖像中所包含人體的…

PHP獲取中文字符拼音首字母

在項目中遇到需要把游戲進行字母排序&#xff0c;于是百度到一個格式化的首字母的方法。 /*** name php獲取中文字符拼音首字母* param $str* return null|string*/public function getFirstCharter($str){if (empty($str)) {return ;}$fchar ord($str{0});if ($fchar > or…

Array類型

一、轉換方法 toString() 調用數組的toString()方法會返回由數組中每個值的字符串形式拼接而成的一個以逗號分割的字符串 valueOf() 返回的還是數組 實際上&#xff0c;為了創建這個字符串會調用數組每一項的toString()方法 二、棧方法 push() pop() 只發生在棧的頂部 三…

Create a Service Catalog Request via REST API

http://wiki.servicenow.com/index.php?titleUseful_Catalog_Scripts#Eureka http://wiki.servicenow.com/index.php?titleService_Catalog_Script_API#gsc.tab0 Service Catalog APIhttps://docs.servicenow.com/bundle/istanbul-servicenow-platform/page/integrate/inboun…

MYSQL和JAVA(課堂筆記)

MYSQL  數據庫管理工具 JAVA    編程語言 數據庫驅動&#xff08;JAVA和MYSQL對接方式&#xff09; 到官網上下載驅動    加載驅動 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement;public class S…

解密昇騰AI處理器--Ascend310簡介

Ascend310 AI處理器規格 Ascend310 AI處理器邏輯架構 昇騰AI處理器本質上是一個片上系統&#xff08;System on Chip&#xff0c;SoC&#xff09;&#xff0c;主要可以應用在和圖像、視頻、語音、文字處理相關的應用場景。其主要的架構組成部件包括特制的計算單元、大容量的存儲…

銀盒子掃碼下單在線訂單開啟商品售賣時段使用說明

1&#xff0c;登陸管理員賬號&#xff0c;子賬號下&#xff0c;配置管理--店鋪配置--掃碼下單Tab頁&#xff0c;是否開啟商品售賣時段&#xff0c;選擇“是” 2&#xff0c;在商家后臺登陸相應的子賬號&#xff0c;在店鋪管理--商品售賣時段里配置售賣時間以及相應時段售賣的商…

使用pandas時遇到ValueError: numpy.dtype has the wrong size, try recompiling

[問題]使用pandas時遇到ValueError: numpy.dtype has the wrong size, try recompiling [原因] 這是因為 Python 包的版本問題&#xff0c;例如安裝了較舊版本的 Numpy&#xff0c;但安裝了較新版本的 Pandas。 [解決方法] 查看Numpy版本號 python -c "import numpy; prin…

『Python基礎-12』各種推導式(列表推導式、字典推導式、集合推導式)

# 『Python基礎-12』各種推導式&#xff08;列表推導式、字典推導式、集合推導式&#xff09; 推導式comprehensions&#xff08;又稱解析式&#xff09;&#xff0c;是Python的一種獨有特性。推導式是可以從一個數據序列構建另一個新的數據序列的結構體。 共有三種推導&#x…

海思芯片選型表匯總

海思芯片選型表匯總_「違規用戶」的博客-CSDN博客_海思芯片型號大全

Docker中未指定掛載點容器間volume卷的數據共享

一 背景 在實際使用過程中&#xff0c;我們可能會經常遇到容器間數據共享的情況&#xff0c;怎么處理呢&#xff1f;通過 docker 命令中的一些選項&#xff0c;我們即可完成容器間的數據共享。 二 實驗步驟 2.1 創建容器 容器一&#xff1a;gysl-1 [rootdev ~]# docker run -it…

為什么早上和傍晚的太陽總是紅色,而中午的大陽卻是黃白色?

由太陽光本質決定&#xff0c;但會受環境影響。在地球上和火星上看到的太陽光也是有區別的&#xff0c;和太氣層物質及厚薄也有關系。太陽光是由赤橙黃綠青藍紫七色光組成的復合光是白色光。 在日出和日落的時候&#xff0c;地平線上所透過的大氣層厚度&#xff0c;一般要比白…

js把日期字符串轉換成時間戳

//獲取當前時間&#xff1a; var myDate new Date();//當前時間 var year myDate.getFullYear();//當前年份 var month myDate.getMonth() 1;//當前月份 var day myDate.getDate();//當前日 myDate.getYear(); //獲取當前年份(2位) myDate.getFullYear(); …

VS2008中開發智能設備程序的一些總結

原文鏈接&#xff1a;http://blog.csdn.net/citybug_nj/article/details/2598705 程序中包括四個部分&#xff1a; 系統配置這個部分用來配置系統中的相關參數&#xff0c;參數包括數據庫信息和串口的配置信息。這部分的主要技術是XML文件的讀取和寫入。 數據下載從數據庫中下載…

go語言值得學習的開源項目推薦

谷歌官方維護了一個基于go語言的開源項目列表&#xff1a; https://github.com/golang/go/wiki/Projects 其中有非常多的優秀項目值得學習&#xff0c;有幾百行代碼適合新手閱讀的項目&#xff0c;也有大型如nsq、docker等的項目。 下面推薦幾款適合學習的項目&#xff1a; 1、…

部分Nand flash uboot 命令詳解

nand info & nand device顯示flash的信息&#xff1a; DM365 :>nand info Device 0: NAND 32MiB 3,3V 8-bit, sector size 16 KiB DM365 :>nand device Device 0: NAND 32MiB 3,3V 8-bitnand read(.oob) addr off size 不管是讀取data, 使用nand read&#xff0c;還是…

java7

第八章 數組 1.數組的聲明定義 數據類型[]變量名 new 數據類型[長度]; 列&#xff1a;int[]ary new int[5]; 2.取值&#xff0c;賦值 取值&#xff1a;數據名[下標]; 列&#xff1a;int a ary[1]; 賦值&#xff1a;變量數據名[…

BZOJ 3564 信號增幅儀

題目鏈接&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id3564 題意&#xff1a;給出平面上n個點&#xff0c;畫出一個橢圓&#xff0c;橢圓的長軸是短軸的p倍&#xff0c;且長軸的方向為x軸逆時針旋轉a度。求這個橢圓短軸的最小值使得可以覆蓋所以點。 思路&…

CentOS 7 搭建JAVA環境

安裝環境&#xff1a; LSB Version: :core-4.1-amd64:core-4.1-noarch Distributor ID: CentOS Description: CentOS Linux release 7.3.1611 (Core) Release: 7.3.1611 Codename: Core 開始 運行java -version 檢查系統是否安裝JRE 或JDK&#xff0c;有則卸載系統自帶JAVA包輸…

串口波形分析

UART口發出數據按字節發送&#xff0c;發送數據8bit&#xff0c;實際量出波形為10bit&#xff0c;軟件底層驅動會自動加上起始位和停止位各1bit&#xff0c;起始位為0&#xff0c;停止位為1。下圖為用串口工具發送的數據和用示波器所量波形。 發送數據&#xff1a;0x34 0x43 示…