爬蟲實戰篇---12306搶票爬蟲

(1)、前言

(此代碼經過我的實測具有較強的實用型)每逢佳節,大家對于回家搶票這件事是不是特別頭疼呢?今天我在網上發現了這個代碼,通過一天的學習,與大家分析下,大家可以直接拿來進行12306搶票,也可以進行優化,進行諸如演唱會的搶票,等等。該代碼主要使用了模擬瀏覽器方式而并沒有采用分析請求。

(2)、技術路線

selenium + chromedriver

(3)、思路分析

1、模擬瀏覽器登錄搶票界面,手動進行登錄

2、登錄完成后讓瀏覽器跳轉到購票界面

3、手動輸入出發地、目的地、 出發日,檢查上面三個信息輸入完成后,找到查詢按鈕,進行車次查詢

4、查找我們需要的車次,看下是否有余票(顯示有或數子),找到車次的預定的按鈕,進行點擊,如果沒有以上兩種情況出現,就循環查詢

5、一旦檢查到有票,執行預定按鈕的點擊事件,找到乘客信息,執行點擊事件,再找到提交訂單按鈕,執行點擊事件

6、點擊完提交訂單按鈕,會彈出確認的對話框,找到確認按鈕,執行點擊事件,完成搶票

7、之后完成付款操作

(4)、全部代碼

  1 #author: "xian"
  2 #date: 2018/6/9
  3 #使用selenium是不保存登錄信息的(cookies)
  4 from selenium import webdriver
  5 from selenium.webdriver.support.ui import WebDriverWait
  6 from selenium.webdriver.support import expected_conditions as EC #期望的條件
  7 from selenium.webdriver.common.by import By
  8 
  9 
 10 
 11 class Qiangpiao(object):
 12     #初始化函數
 13     def __init__(self):
 14         self.login_url = 'https://kyfw.12306.cn/otn/login/init'
 15         self.initmy_url = 'https://kyfw.12306.cn/otn/index/initMy12306'
 16         self.search_url = 'https://kyfw.12306.cn/otn/leftTicket/init'
 17         self.confirmPassenger = 'https://kyfw.12306.cn/otn/confirmPassenger/initDc'
 18         self.driver = webdriver.Chrome() #驅動chrome瀏覽器進行操作
 19 
 20     def wait_input(self):
 21         self.from_station = input('出發地:')
 22         self.to_station = input('目的地:')
 23         #時間格式一定要對應
 24         self.depart_time = input('出發時間:')
 25         #名字一定要存在于常用聯系人中間
 26         self.passengers = input('乘客姓名:(如有多個乘客使用英文逗號分割)').split(',')
 27         self.trains = input('車次:(如有多個車次使用英文逗號分割)').split(',') #結果[G234,...]
 28 
 29     #_login只想在類中調用
 30     def _login(self):
 31         self.driver.get(self.login_url) #打開登錄界面
 32         #顯示等待(解釋:你與心上人約會,以對方來或不來為等待條件即事件是否發生為條件)
 33         #隱示等待(解釋:你與心上人約會,以等待時間為條件)
 34         WebDriverWait(self.driver,1000).until(EC.url_to_be(self.initmy_url))
 35         print('恭喜您,您已登錄成功了!')
 36 
 37 
 38     def _order_ticket(self):
 39         #1、跳轉到查余票的界面
 40         self.driver.get(self.search_url)
 41         #2、等待出發地是否輸入正確
 42         WebDriverWait(self.driver ,1000).until(EC.text_to_be_present_in_element_value((By.ID,"fromStationText"),self.from_station))
 43         #3、等待目的地是都輸入正確
 44         WebDriverWait(self.driver, 1000).until(EC.text_to_be_present_in_element_value((By.ID,"toStationText"),self.to_station))
 45         #4、等待出發日期是否輸入正確
 46         WebDriverWait(self.driver, 1000).until(EC.text_to_be_present_in_element_value((By.ID,"train_date"),self.depart_time))
 47         #5、等待查詢按鈕是否可用
 48         WebDriverWait(self.driver, 1000).until(EC.element_to_be_clickable((By.ID, "query_ticket")))
 49         #6、如果可以點擊找到查詢按鈕執行點擊事件
 50         searchBotton = self.driver.find_element_by_id("query_ticket")
 51         searchBotton.click()
 52         #7、點擊查詢按鈕之后等待車票信息頁面被加載完成
 53         WebDriverWait(self.driver, 1000).until(EC.presence_of_element_located((By.XPATH,".//tbody[@id = 'queryLeftTable']/tr")))
 54         #8、找到所有沒有datatrain屬性的tr標簽
 55         tr_list = self.driver.find_elements_by_xpath(".//tbody[@id ='queryLeftTable']/tr[not(@datatran)]")
 56         #9、遍歷所有滿足條件的tr標簽
 57         for tr in tr_list:
 58             train_number = tr.find_element_by_class_name('number').text
 59             if train_number in self.trains:
 60                 left_ticket = tr.find_element_by_xpath('.//td[3]').text #找到第四個td標簽下的文本
 61                 if left_ticket == '' or left_ticket.isdigit: #判斷輸入的車次是否在列表中
 62                     orderBotton = tr.find_element_by_class_name('btn72')
 63                     orderBotton.click()
 64 
 65                     #等待是否來到乘客確認頁面
 66                     WebDriverWait(self.driver, 1000).until(EC.url_to_be(self.confirmPassenger))
 67                     #等待所有的乘客信息被加載完畢
 68                     WebDriverWait(self.driver, 1000).until(EC.presence_of_element_located((By.XPATH,".//ul[@id = 'normal_passenger_id']/li")))
 69                     #獲取所有的乘客信息
 70                     passanger_labels = self.driver.find_elements_by_xpath(".//ul[@id = 'normal_passenger_id']/li/label")
 71                     for passanger_label in passanger_labels: #遍歷所有的label標簽
 72                         name = passanger_label.text
 73                         if name in self.passengers:#判斷名字是否與之前輸入的名字重合
 74                             passanger_label.click() #執行點擊操作
 75 
 76                             #獲取提交訂單的按鈕
 77                             submitBotton = self.driver.find_element_by_id('submitOrder_id')
 78                             submitBotton.click()
 79                             #顯示等待確人訂單對話框是否出現
 80                             WebDriverWait(self.driver, 1000).until(EC.presence_of_element_located((By.CLASS_NAME,'dhtmlx_wins_body_outer')))
 81                             #顯示等待確認按鈕是否加載出現,出現后執行點擊操作
 82                             WebDriverWait(self.driver, 1000).until(EC.presence_of_element_located((By.ID,'qr_submit_id')))
 83                             ConBotton = self.driver.find_element_by_id('qr_submit_id')
 84                             ConBotton.click()
 85                             while ConBotton:
 86                                 ConBotton.click()
 87                                 ConBotton = self.driver.find_element_by_id('qr_submit_id')
 88 
 89                             return
 90 
 91 
 92 
 93 
 94 
 95 
 96 
 97 
 98     def run(self):
 99         self.wait_input()
100         self._login()
101         self._order_ticket()
102 
103 if __name__ == '__main__':
104     spider = Qiangpiao()
105     spider.run()

(5)、運行效果圖

之后大家只要在30分鐘之內完成在線支付即可,方便實用!

(6)、使用說明

請使用前確保已安裝好一個python編譯器并完成pyhon的配置windows下推薦使用pycharm,并下載chrome和chromedriver驅動,并將chromedriver配置進python包(如果沒配置只要指定路徑亦可!)

復制代碼按命令行提示操作即可完成搶票

轉載于:https://www.cnblogs.com/518894-lu/p/9158843.html

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

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

相關文章

php和mysql處理樹狀_分級_無限分類_分層數據的方法_PHP和MySQL處理樹狀、分級、無限分類、分層數據的方法...

文章標題中的多個詞語表達的其實是一個意思,就是遞歸分類數據,分級數據非常類似數據結構中的樹狀結構,即每個節點有自己的孩子節點,孩子結點本身也是父親節點。這是一個遞歸、分層形式。可以稱之為樹形層級數據。層級數據結構是編…

LeetCode 70. Climbing Stairs

You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? 一開始想用排列組合的方式,但是公式不太好些,后來想用遞歸的方式&#x…

04 java 基礎:數據類型

java 數據類型:基本類型與引用類型 基本類型:數值型,其中數值型分為整型、浮點型,整型包括 byte、short 、int、long ,默認為 int 類型。浮點類型分為單精度、雙精度,分為 float、double ,默認為…

Git 遠程倉庫分支管理

目錄 目錄速查表關聯遠程代碼倉庫克隆遠程倉庫 分支管理創建分支 切換分支合并分支刪除分支解決沖突速查表 指令作用git branch查看分支git branch newBranchName創建分支git checkout branchName切換分支giit checkout -b newBranchName創建切換分支git merge branchName合并分…

call,apply

1.call要逐個傳入參數 2apply方法的必須 function curry(fn){var argsArray.prototype.slice.call(arguments,1);return function(){var innerArgsArray.prototype.slice.call(arguments);var finalArgsargs.concat(innerArgs);console.log(finalArgs);return fn(finalArgs);//…

2018美團CodeM編程大賽 Round A Problem 2 下棋 【貪心】

應該一眼看出來是貪心題,然后想最優解是什么。正確的貪心策略是【原棋盤上每個位置的棋子】都往最近的左邊【目標棋盤上棋子】移動,如果左邊沒有棋子了那就閑置最后處理,如果目標棋盤在該位置上也有棋子,那就算距離為0&#xff08…

idea清理svn信息_IntelliJ IDEA SVN的賬號修改 信息清除

來到編譯器的setting設置 搜索subversion 點擊subversion 找到下面的clear auth...按鈕,點擊一下 就可以了…如果我們不小心輸入svn賬號錯誤的話,后面就一直提示認證失敗,不能checkout代碼. 這個是因為svn把你輸入的賬號進行了緩存. 如果我們想重新輸入新的賬號,必須要清除緩存…

同步手繪板——json

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基于ECMAScript的一個子集。 JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習慣(包括C、C、C#、Java、JavaScript、Perl、Python等)。這些特性使JSON成為…

[HNOI2008]玩具裝箱TOY

洛谷題目連接:[HNOI2008]玩具裝箱TOY 題目描述 P教授要去看奧運,但是他舍不下他的玩具,于是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。P教授有編號為1...N的…

C語言-結構體內存對齊

C語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出一個struct,然后sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你聲明的變量總長度要大,這是怎么回…

nginx 二進制包安裝mysql_二進制安裝mysql5.7

下載地址:https://downloads.mysql.com/archives/community/[rootlocalhost soft]# lsmysql-5.7.17-linux-glibc2.5-x86_64.tar.gz nginx-1.12.2 nginx-1.12.2.tar.gz[rootlocalhost soft]#1.詳細描安裝的過程1.1關閉防火墻systemctl stop firewalld.service #停止f…

.NET 類型(Types)的那些事

引言 您是.Net工程師?那 .NetFramework中的類型您知道有三大類嗎?(除了引用類型和值類型,還有?) 引用類型一定在“堆”上,值類型一定在“棧”上? 那引用類型在內存中的布局細節您又知…

幾種去除數組中重復元素的方法、數組去重

工作中遇到的一個問題&#xff0c;就是去除數組中重復的元素&#xff0c;記錄一下幾種有效的方法&#xff1a; 第一種思路&#xff1a;遍歷要刪除的數組arr, 把元素分別放入另一個數組tmp中&#xff0c;在判斷該元素在arr中不存在才允許放入tmp中。 <!DOCTYPE html> <…

MongoDB學習使用

一、什么是MongoDB&#xff1f; MongoDB是一個高性能&#xff0c;開源&#xff0c;無模式的文檔型數據庫&#xff0c;是當前NoSql數據庫中比較熱門的一種。它在許多場景下可用于替代傳統的關系型數據庫或鍵/值存儲方式&#xff0c; NoSql&#xff0c;全稱是 Not Only Sql,指的是…

域賬號更改密碼之后代理需要重新配置

在使用域賬號的時候&#xff0c;如果需要配置賬戶和密碼&#xff0c;那么最好記錄下來&#xff0c;否則將來找不到就很尷尬了。 我遇到的問題是&#xff0c;因為在另外一臺電腦配置了域賬號&#xff0c;用來聯網&#xff0c;提供網絡給visual studio 1.Firefox 這個代理的賬號…

wcf精通1-15

隨筆- 197 文章- 0 評論- 3407 十五天精通WCF——第一天 三種Binding讓你KO80%的業務 轉眼wcf技術已經出現很多年了&#xff0c;也在.net界混的風生水起&#xff0c;同時.net也是一個高度封裝的框架&#xff0c;作為在wcf食物鏈最頂端的我們所能做的任務已經簡單的不能再簡單…

python如何實現共享報表系統_使用python來實現報表自動化-阿里云開發者社區

xlwt 常用功能xlrd 常用功能xlutils 常用功能xlwt寫Excel時公式的應用xlwt寫入特定目錄(路徑設置)xlwt Python語言中&#xff0c;寫入Excel文件的擴展工具。可以實現指定表單、指定單元格的寫入。支持excel03版到excel2013版。使用時請確保已經安裝python環境。百度百科xlrd Py…

去除inline-block元素間間距的N種方法

這篇文章發布于 2012年04月24日&#xff0c;星期二&#xff0c;22:38&#xff0c;歸類于 css相關。 閱讀 147771 次, 今日 52 次 by zhangxinxu from http://www.zhangxinxu.com 本文地址&#xff1a;http://www.zhangxinxu.com/wordpress/?p2357 一、現象描述 真正意義上的in…

Docker深入淺出2

Docker系統架構 Docker使用客戶端-服務端&#xff08;c/s&#xff09;架構模式&#xff0c;使用遠程api來管理和創建Docker容器。 docker容器通過Docker鏡像來創建。 容器與鏡像的關系類似于面向對象編程中的對象與類的關系 Docker面向對象容器對象鏡像類加速器配置&#xff1a…

mysql安裝包下載密碼_MySQL解壓包的安裝與下載的圖文教程

這篇文章主要為大家詳細介紹了mysql解壓包的安裝基礎教程&#xff0c;具有一定的參考價值&#xff0c;感興趣的小伙伴們可以參考一下由于換了新電腦&#xff0c;所以的環境都要到新電腦去配置。突然發現mysql的配置忘了&#xff0c;然后百度又重新來一遍。特地寫一篇文章記錄一…