[問題] 用 selenium 搶票

作者: kh555069 (yuan)   2017-11-08 10:39:50
各位大神好
新手如我最近用selenium寫了一個自動輸入個人資料的小爬蟲,只有驗證碼部分是手動輸
入,輸入完驗證碼之後就會自動跑完剩下的流程並完成訂票,code部分只有.get , find_
element , send_key跟click
之前有聽說,只要驗證碼是手動輸入就沒有違法問題,想確認這樣是否真的沒問題,感謝
各位
作者: wennie0433   2017-11-08 10:45:00
這事情我也幹過XD 後來發現人多網站都會掛就懶得用了應該是沒有違法 除非破解驗證碼
作者: neil987 (R5大小姐-EX人品崩壞)   2017-11-08 11:05:00
搶票 就是要做驗證碼識別 不過通常網站掛掉比較無解
作者: vi000246 (Vi)   2017-11-08 11:20:00
我之前有去pttlifelaw板問過了 你可以爬文看看
作者: f496328mm (為什麼會流淚)   2017-11-08 12:29:00
驗證碼識別蠻簡單的,我有做一個
作者: kh555069 (yuan)   2017-11-08 13:15:00
之前有看過vi大的討論串,那位回文的大大好像認定這樣是違法
作者: uranusjr (←這人是超級笨蛋)   2017-11-08 16:41:00
搶票的 bottleneck 從來都不是輸入資料的手速啊...
作者: HenryLiKing (HenryLiKing)   2017-11-08 16:58:00
樓上那句是什麼意思呀我查翻譯是 瓶頸 的意思耶(?)
作者: swallowcc (guest)   2017-11-08 19:56:00
意思就是問題一直都不是在輸入資料的速度R
作者: vi000246 (Vi)   2017-11-08 20:22:00
但是開多線程可以賭賭看 一定比手動搶到的機會大
作者: fordpines (阿福)   2017-11-08 22:16:00
驗證碼識別是用pytesser做的? 有點興趣
作者: Sunal (SSSSSSSSSSSSSSSSSSSSSSS)   2017-11-08 22:34:00
人家網站塞爆你輸入多快也沒用但是如果你用多開 這就有問題了
作者: kh555069 (yuan)   2017-11-09 02:22:00
感謝各位大大的回覆,我知道這種程度沒辦法搶演唱會等級的票。能幫家人搶到高鐵票就夠了,我只是想確認搶個2~3張會不會出事
作者: neil987 (R5大小姐-EX人品崩壞)   2017-11-09 06:54:00
高鐵票需要搶嗎QQ
作者: kh555069 (yuan)   2017-11-09 08:58:00
要啊QQ 學生票星期六早上本來還有7折時段,現在幾乎沒了QQ。上禮拜買早鳥 一張打折票都搶不到
作者: f496328mm (為什麼會流淚)   2017-11-09 10:04:00
驗證碼,自己做一個CNN就好了,麻煩的是,驗證碼是JS,直接抓會一直變,我是用selenium截圖後,再去處理另外我是手動做train data,目前1萬張
作者: goldflower (金色小黃花)   2017-11-09 12:16:00
這樣標解答好累R
作者: f496328mm (為什麼會流淚)   2017-11-09 13:39:00
很累啊,我也試過一大堆方法,都有現成套件,但都有些缺陷,結果都不好,demo時都很猛,實際上不見得好標解答,也可以寫成程式,盡量提高速度啦,我一開始一天就可以1萬張,5個驗證碼大約90%正確率,剩下就可以利用台鐵驗證碼系統,幫我上label啦簡單講,對或錯台鐵會幫我判定,對的就存label,這樣就變成自動上label啦,data會越來越多,有點類似reinforcement learning,當然這很像ddos攻擊,是不太好啦
作者: alan23273850   2017-11-09 15:54:00
哇感謝f大開示!這種gen資料的方式太聰明了啦
作者: goldflower (金色小黃花)   2017-11-09 16:19:00
喔喔這蠻聰明的@@ 反正不用把正確率提到最高 自動化比較重要
作者: f496328mm (為什麼會流淚)   2017-11-09 16:23:00
之後你data越多,基本上準確率越高
作者: goldflower (金色小黃花)   2017-11-09 18:52:00
不過data越多 如果錯的testing沒有標解答進去的話照理說之後看到一樣的驗證碼還是會認錯 因為還是沒學所以應該還是要把錯的驗證碼存下來手動輸入幾個
作者: f496328mm (為什麼會流淚)   2017-11-09 19:32:00
還有一點是,在辨識之前,你的影像處理好不好,對之後的辨識,影響很大另外台鐵算是最簡單的驗證碼,有些連人都很難辨識
作者: bluecadence (Maxwell's demon)   2017-11-09 20:02:00
餵CNN影像基本上不必處理 頂多丟掉對辨識沒幫助的彩色 轉成灰階。五個字整張圖餵進去練,99%辨識率很容易。不要一直餵已經答對的圖案,把辨識錯誤的圖加進去訓練很重要training set 3000 張基本上就可以 95% 了
作者: f496328mm (為什麼會流淚)   2017-11-09 20:11:00
是一整張圖辨識?我目前是切割,分開辨識
作者: bluecadence (Maxwell's demon)   2017-11-09 20:22:00
對不必切割 原圖整張餵
作者: f496328mm (為什麼會流淚)   2017-11-09 20:29:00
了解,因為切割也很麻煩,台鐵還算可以切,其他的很複雜
作者: bluecadence (Maxwell's demon)   2017-11-09 20:59:00
用傳統比對法 才有必要切割, 既然都用 cnn 了,就不必多此一舉了 :p
作者: vi000246 (Vi)   2017-11-09 21:52:00
想問台鐵黏在一起的字怎麼切 想看看演算法B大說不用切只要train 3000張 想問有範例嗎我之前找到一篇文章 不用切的話要四萬張才有9X%的成功率而且這驗證碼是自己產生自己訓練的 跟抓別人的驗證碼手動標label的效率差很多
作者: neil987 (R5大小姐-EX人品崩壞)   2017-11-10 00:20:00
還是不太理解不切圖的流程...求b大解釋大概流程
作者: aszx4510 (wind)   2017-11-10 00:44:00
我猜是用image-to-text吧 先用CNN encoder 接著再使用RNN decoder 產生一串字串如果可以肯定驗證碼必定五個字 那用傳統CNN分類就好了
作者: alan23273850   2017-11-10 01:06:00
獻醜一下,我之前用前處理+數字切割,再每個數字丟進別人已經用tensorflow訓練好的library去辨識,最後再合起來,辨識率只有1/8。因為前處理弄得不好,灰色的noise line其實跟數字很像,這學期正在學電腦視覺,希望能對前處理改良,應該會有幫助,不過我覺得還是不會比整張丟進 CNN 下去 train 還要好CNN 真的是一個大家都該會的東西呀......
作者: f496328mm (為什麼會流淚)   2017-11-10 07:00:00
單純用CNN做分類的話,5個數字,有10^5種組合耶,況且有時是4個數字,有時是6個,真的可以不切割?alan,我的數字影像處理,切割+旋轉,之後再用CNN,1萬張圖,大約80~90%正確率其實驗證碼的影像處理,網路上一大堆人做過,可以去找找
作者: bluecadence (Maxwell's demon)   2017-11-10 08:48:00
如果會切圖只辨識一個字母或數字,要訓練 1~Nmax 字流程一模一樣,重點是cnn幾層,模型怎麼建的。一般的網站都是固定字數,可以針對特定網站訓練。我使用三層 conv layer 一層 fully connected 然後output layer 。 我針對兩個網站都是五個字的圖做解析,每天抓上千筆資料 真的正確率就是 > 99% 很少看見錯誤的。我也是寫了這個tensorflow小程式 被 cnn的威力嚇到 開始小玩tensorflow文字數字是非常有特徵的物件 辨識真的不難阿...我不知道各位切圖一個字後怎麼做cnn,我的作法是把字母數字先向量化,整張圖一維化,然後餵進 nn 這好像是蠻標準的程序(之一)阿而且如果需要窮盡所有樣板可能性,才能讓NN學會,你需要的是一個完整可以比對的資料庫,不是NNNN的概念不就是要舉一反N嗎,而不是舉N反N我的確相信 NN 在訓練的過程中,把看過的東西都"記憶"下來了(在連結權重的網中),但你給他一張新的沒看過的五字辨識圖,它的確幫你判斷出來了,這是除了記憶外,它也歸類了辨識圖中的一些文字數字特徵,然後給出了正確答案。神經網路怎麼學習的,最近讀到一個 informationbottleneck 的說法,我覺得還蠻有趣的,可以 google關鍵字參考一下
作者: vi000246 (Vi)   2017-11-10 11:33:00
驗證碼有噪線、扭曲、不固定位置、顏色、相黏能直接餵資料的應該是比較簡單的驗證碼吧?或是位置、扭曲都固定 但很難切割的驗證碼
作者: bluecadence (Maxwell's demon)   2017-11-10 11:35:00
http://bsr.twse.com.tw/bshtm/http://www.tpex.org.tw/web/stock/aftertrading/brokerBS.php我不知道這種算難還是不難?位置不固定會旋轉我覺得更應該不切割直接餵這不就是cnn的優點強項嗎?人臉辨識 不在照片固定位置 角度不同 扭曲 不是都能作到某種程度了嗎?
作者: ron0803 (龍)   2017-11-10 12:14:00
B大是神,好強
作者: vi000246 (Vi)   2017-11-10 14:47:00
原來如此 謝謝B大說明
作者: f496328mm (為什麼會流淚)   2017-11-11 09:03:00
感謝開示一維化,所以沒有用到pooling?
作者: bluecadence (Maxwell's demon)   2017-11-11 10:27:00
推文打太快漏了字,一維化然後 reshape (所以還是二維陣列) 抱歉讓您誤會另外為什麼我說用有平移旋轉更應該用cnn 請google關鍵字 translation, rotation invariance + cnn
作者: f496328mm (為什麼會流淚)   2017-11-11 11:23:00
blue大有github可以參考嗎?感恩問一個問題,圖片本來不是2維嗎?為什麼要先一維化,再變2維?改變整張圖的大小嗎?
作者: bluecadence (Maxwell's demon)   2017-11-11 16:44:00
只是配合tensorflow語法保持彈性可以動態指定批次圖檔數量。我短時間內並沒有把程式碼放在github開源的打算。
作者: f496328mm (為什麼會流淚)   2017-11-11 18:36:00
ok,那我自己研究看看
作者: goldflower (金色小黃花)   2017-11-13 11:24:00
噪點那些問題在資料量夠多下照理說會自然在訓練的過程中被忽視 所以那些不用太在意不過有前處理做好可能收斂更快吧改變整張圖的大小也行啊 這樣你一個CNN 就能應用在多個網站上不過數字數量不固定的問題可能比較麻煩 但是如果training data有這個資訊 那就可以串兩個nn 一個先做好meta learning就能再丟到對應的CNN model 了
作者: alan23273850   2017-11-13 20:33:00
順便再推台大李弘毅老師的機器學習課程,專門給初學者聽的,我這學期正在修,覺得獲益良多,影片都在網路上,老師常用有趣的比喻說明,完全不會打瞌睡話說如果圖不切割的話最後的輸出不就要上萬個class?
作者: bluecadence (Maxwell's demon)   2017-11-13 22:02:00
可以反問一下alan大 為何需要輸出上萬個class?如果你認為切割後比較有效率 那就切割吧。同樣的問題可以有很多種不同的解法。我只是告訴你固定五的字的captcha,我可以不切割做辨識達到實戰 >99% 的正確率既然我不open source 你就當我唬爛嘴砲好了 :p
作者: f496328mm (為什麼會流淚)   2017-11-13 23:25:00
比較想問,如果沒固定5個字的話,可以不切割嗎?因為台鐵驗證碼,4~6個字因為難一點的驗證碼,非常難切割,有些都黏在一起
作者: bluecadence (Maxwell's demon)   2017-11-13 23:41:00
那就把模型建成輸出層輸出六個字,把空白用 * 或隨便一個特殊字元代表。 你得到的答案會像這樣*4A*QC 12CEK 5*DQE4 少於六個字的空白輸出都會用*也就是把空白當成一個字元 也給他一個向量當然你回到網站輸入驗證碼的時候要把*去掉12CEKQ <- 剛剛少打一個字元只要你的訓練樣本夠 4~6 個字都有餵進去練就好不過你訓練樣本的標示可能會些困難 需要斟酌我沒有試過,或許標示直接給四個字,尾巴填兩格空白五個字+一個空白 這樣標訓練組這樣標示,答案就會像這樣 AXD2** 35CP*35CPR* (剛剛漏字)我是把標示都直接標在圖檔檔名,所以不能用 * 代表可以選擇用 - 或 _ 代表空白推文推的有點亂 忽略我第三行推文。總結就是用最大可能的碼數當作輸出層的輸出,訓練組標示 四個字的用ABCD-- 五個字的 XQYZE- 六個字的 QWERTY你的字元集Aa..Zz 0..9 之外再加上一個空白字元"-"
作者: alan23273850   2017-11-14 09:29:00
不切割的話一個class就對應到一個結果,000000~999999不就多到爆炸?我以為CNN只能用在分類問題
作者: bluecadence (Maxwell's demon)   2017-11-14 09:51:00
我只能說你解captcha的模型有問題 隨你要怎麼做就怎麼做 建出的模型是要解決問題的 你想了一個解決不了問題的模型 我也管不著你可以繼續困在你解決不了問題的思維裡 請便你不會做不切割不代表別人不會做 這種辨識碼CNN出來之後基本上根本可以廢了 根本完全被破解了不然你以為為何google要重搞 reCAPTCHA?你已經落後三四年了一個class對應一個字元 你是有幾個字元阿?你的問題是你不會設計輸出層 就這樣而已要教NN舉一反三很難 教人也是網路上的例子都只開一條馬路 不能自己開六條馬路嗎?"multiplexing" ...
作者: alan23273850   2017-11-14 14:20:00
大大別這麼凶,我畢竟初學,好奇問個問題而已
作者: aszx4510 (wind)   2017-11-15 11:18:00
alan大別灰心 我查到一個不用切字的做法https://github.com/CharlesLiuyx/verificationCode我一開始也和你想的一樣,使用簡單的分類法,類別會很多但其實可以轉為multi-label的形式,詳細方法就看code吧
作者: f496328mm (為什麼會流淚)   2017-11-15 13:36:00
這串討論蠻不錯的,講了很多重點,感謝上面的大大
作者: kh555069 (yuan)   2017-11-16 08:54:00
雖然還是沒得到明確答案,不過樓歪得很好XD感謝大大們的分享
作者: liang1230 (小良)   2017-11-16 21:40:00
笑死 某B不懂裝懂 把一堆cnn的缺點講成優點 你知道新的架構capsule為何出來嗎 呵呵
作者: Kazimir (Kazimir)   2017-11-19 02:00:00
如果不切 輸出層我猜有兩種 一個是把label編碼以後回歸這樣子是6個輸出 或者是onehot 這樣是6*26*11(0-9 + *)切割也沒什麼錯 這樣的話一個nn就可以任意複用腦袋不清楚 6*37(a-z 0-9 *)才對當然我會傾向CNN-RNN這種架構 感覺比較有道理
作者: aszx4510 (wind)   2017-11-20 13:33:00
推樓上,理論上CNN-RNN是通解,但我好奇這種架構是不是需要更多training data呢XD
作者: Kazimir (Kazimir)   2017-11-24 21:45:00
如果直接一起訓練應該要吧?
作者: f496328mm (為什麼會流淚)   2017-11-28 21:19:00
切割有缺點,切的不好會影響結果,error會累加上去

Links booklink

Contact Us: admin [ a t ] ucptt.com