看板 Soft_Job 關於我們 聯絡資訊
原本以為說telnet抓取資料是很簡單的事情 畢竟寫過telnet瀏覽器 自己去剖析控制碼 什麼控制碼會有什麼行為.顯示.出現位置等等等控制 基本上是都實做過 對telnet的動作和行為應該還算了解 (但不算深入有些控制碼還沒完全搞懂,但因為瀏覽ptt大致都正常懶得細究) 想說最近看到node-webkit 打算用js寫一個視窗軟體 做類似下面這兩款的事情 https://play.google.com/store/apps/details?id=com.bbs.reader&hl=zh_TW https://play.google.com/store/apps/details?id=mong.moptt&hl=zh_TW 學點新東西 練練功一下 結果一開始就被node.js的非同步行為搞得很頭大 這中間有很多處理的問題還在摸索 用了一些很不好硬幹的方式 總算是把我的最愛撈取出來 一撈取出來一看 怎麼有些版名會掉字? 一考就下去才發現 原來上一頁中出現同樣的英文字母 再下一頁中可能為了省資料傳送量 所以到下一頁的時候 不會再重傳 好比說同樣的位置 我的最愛中有一個是Android 下一頁我的最愛分頁是 ASM 結果因為那個 "A"字母在同一個地方有出現過 只會送出 SM ( A沒送....) 結果我在PASER字串抓資料時 只抓到SM.... 意思是說如果要正確抓我的最愛 需要模擬出一個不須真正印出來的console畫面 以畫面文字對應排列為基礎 去擷取資料 有些時候不能用直接邊抓資料編paser資料的方式去抓 然後怎麼抓資料 也不太有頭緒 目前是用類似有限狀態機的方式 搭配在某些規則去剖析資料 但是感覺真的是不太好的方法 總之不知道這邊有沒有人有相關經驗 知道比較有效率抓telnet資料的方式? 能分享一些心得之類的 還以為很簡單.... 結果竟然是這麼麻煩的問題.... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.70.105.149
typepeter:可以去研究zterm的程式碼 01/02 23:14
typepeter:其實還滿多的,不過要自己找來看 01/02 23:14
zterm是telnet瀏覽器喔...跟我要的把特定站台一些資料抓取下來的目的不太一樣 ※ 編輯: erspicu 來自: 61.70.105.149 (01/02 23:17)
joyolkreg:要javascript可以研究bbsfox-for-google-chrome 01/02 23:18
idleidle:你該去找telnet SPEC來看。硬幹不會比較快.. 01/02 23:20
以前就幹過了 http://dl.dropboxusercontent.com/u/61164954/homepage/samplebbs/index.htm 現在的重點不是如何寫TELNET瀏覽器 是如何把TELNET上的資料抓下來 特別是用NODE.JS有許多非同步行為 目前還在摸索比較好的方式 是上問看看有沒有人有相關經驗 參考一下做法 ※ 編輯: erspicu 來自: 61.70.105.149 (01/02 23:25)
idleidle:況且還有色碼跟位移碼,真的是蠻複雜的Q_Q... 01/02 23:22
xvid:不去了解protocol你是要怎麼處理這些input..... 01/03 00:06
以前就寫過telnet瀏覽器 ptt瀏覽大概都正常 你覺得我不了解protocol?? 是控制碼很多 有些用不到 沒k得很完全而已
leicheong:就自設screen buffer, 把拿到的資料都在上面跑一篇. 01/03 00:06
leicheong:然後要拿資料的時候, 直接到buffer抓. 01/03 00:07
leicheong:顏色碼那些如果不影響你篩選資料的話, 取到的時候可以 01/03 00:08
leicheong:discard掉. 01/03 00:08
感覺樓上應該是有實際處理經驗 我的感覺是 只能說抓TELNET資料 真的沒比寫telnet瀏覽器簡單阿...很多處理的菱菱角角還在摸 ※ 編輯: erspicu 來自: 61.70.105.149 (01/03 00:15)
typepeter:呃telnet瀏覽器就有作parse的動作啊 那是現成的code 01/03 00:20
parse資料跟parse控制碼還滿不一樣的耶...
typepeter:js的話,去看看bbsfox以及pcmanfx之類的js程式如何? 01/03 00:22
※ 編輯: erspicu 來自: 61.70.105.149 (01/03 00:57)
YahooTaiwan:寫過ptt mobile app就知道parsing的苦 01/03 01:36
typepeter:呃...原PO可能不知道複製有純文字和包含控制碼 01/03 07:22
typepeter:一堆程式可以抄 只差在不想看而已吧囧 01/03 07:22
typepeter:http://tinyurl.com/kbnwmzm 這是你要的? 01/03 07:25
typepeter:具體作法可能像是leicheong大所說 程式碼都有了 01/03 07:26
我很確定你對這問題的理解在狀況外 parsing控制碼 跟 parsing資料 根本不一樣的事情 要parsing控制碼 靠我以前自己寫的TELNET瀏覽器 https://github.com/erspicu/telnet_sample/blob/master/telnet_sample/telnet.cs 就可以parsing 我幹嘛還要抄別人的? 先搞清楚moptt跟bbsreader這類軟體跟telnet瀏覽器軟體的差異吧 "具體作法可能像是leicheong大所說" <-- 這句話,你真的懂什麼是leicheong大所說?? 而且他說的東西我上面是也大概有提到過 ※ 編輯: erspicu 來自: 61.70.105.149 (01/03 08:42)
ettoolong:pcmanfx的 下載文章 這個功能就差不多是你要的功能了. 01/03 09:08
恩 下載文章的處理方式 的確可以參考 但是隨著狀況不同 要擷取什麼資料 似乎只能見機行事 case by case 只是這中間會想聽聽相關處理經驗的人心得分享
uranusjr:手機 BBS 瀏覽器 (尤其 Android 的) 會遇到一模一樣的問 01/03 09:10
yes parsing控制碼 跟 parsing資料 本來就兩回事情 總算還有人知道我在說啥
uranusjr:題, 應該有一些開源專案可以參考 01/03 09:10
※ 編輯: erspicu 來自: 60.248.56.181 (01/03 09:42)
CRPKT:沒經驗, 就上述來看第一層 screen buffer 跑不掉 01/03 10:38
CRPKT:第二層 site map model 大概也跑不掉, 第三層抓資料策略 01/03 10:39
CRPKT:覺得 async 麻煩的話 future/promises pattern 會省很多事 01/03 10:39
大概方向 是這樣沒錯 只是實作細節跟程式規劃中間很多菱角 要想想 還真佩服像是MOPTT和BBSREADER作者...原本覺得這種程式不會太複雜 功真的不少... ※ 編輯: erspicu 來自: 60.248.56.181 (01/03 10:44)
TonyQ:其實你還是該去研究 zterm 01/03 13:18
TonyQ:你要做的東西我之前做過,你除了靠新加入的資料以外,還得靠 01/03 13:19
TonyQ:畫面的 buffer 去當成 full data 來 parse。 01/03 13:19
TonyQ:他不像 api 一樣會回給你完整的資料,你得不斷的刷新 buffer 01/03 13:19
TonyQ:再從 buffer 裡面解析出正確的資料。從這個角度去想。 01/03 13:19
TonyQ:該有的狀態大致上都有啦,像是你可以知道你現在在哪個版, 01/03 13:21
TonyQ:特別需要考慮的是像是進版畫面(存在或不存在)、文章內文 01/03 13:21
TonyQ:標題被修改或指令送出延遲等等之類的特殊情況。 01/03 13:21
TonyQ:然後就平常使用 ptt 會碰到的控制碼跟瀏覽器真正會碰到的控 01/03 13:22
TonyQ:製碼其實還有不少差距,但規則基本上都還算單純。 01/03 13:22
TonyQ:控制碼方面,比較討厭的就是雙色字之類的處理,對 encording 01/03 13:22
TonyQ:要熟。 01/03 13:22
TonyQ:推完才發現 leicheong 其實已經回的差不多了。XD 01/03 13:24
TonyQ:這個你玩過 telnet browser 的話,就是那樣啦,沒有魔術 01/03 13:24
TonyQ:因為 bbs server 會回傳什麼,真的完完全全就是看他高興... 01/03 13:24
TonyQ:我之前做的東西是偏向 bbs robot ,會自動下 query 跟發文 01/03 13:25
TonyQ:以前幫學校做的租屋網站做出自動發文到學校bbs租屋版的系統 01/03 13:26
TonyQ:這兩者需要的東西有認真做的話其實很像,資訊上也很像。 01/03 13:26
之前雖然是自己處理控制碼 但是是直接借用c#的console來當screen 而現在等於是自己要處理和實作screen容器 來讀buffer 覺得很麻煩 但是似乎是一定的必要步驟了 等於在擷取比對所要的內容 使用的screen pattern來分析就是 ok... ※ 編輯: erspicu 來自: 60.248.56.181 (01/03 16:28)
typepeter:雖說理解錯你的意思 但認真的說 pcmanfx的確有你要的功 01/03 18:40
typepeter:能 研究是必要的吧 它也是用screen buffer概念 01/03 18:40
TonyQ:@typepeter 他的問題是要知道現在在哪個畫面,這個畫面有哪 01/03 19:27
TonyQ:些資料,pcmanfx 跟這有關聯的部份在哪你直接寫出來不就好了 01/03 19:27
TonyQ:@erispicu 我建議你第一版在做的時候先把顏色這個變數拿掉 01/03 19:30
TonyQ:等純粹抓資料能搞定之後再來煩惱顏色的控制碼,雙色字那個 01/03 19:31
TonyQ:問題我是覺得有點麻煩。 01/03 19:31
TonyQ:反正要判斷控制碼只要看 (esc) m 這些 pattern 就能濾了 01/03 19:32
typepeter:termbuf.js是buffer的實作 pcman會更新它的內容 01/03 19:44
typepeter:類似的行為可以看pcman.js termbuf.js termsel.js 01/03 19:45
typepeter:因為這三個都是關於對buffer進行更新/讀取的動作 01/03 19:46
typepeter:我覺得應該是可以參考,然後自己刻一個buffer出來 01/03 19:46
typepeter:因為PCMAN大大寫得還不錯 應該是很有參考價值啦 01/03 19:46
CRPKT:這些看起來他已經會寫啦, 就只是都很麻煩吧 XD 01/03 22:34
CRPKT:async 的 API 開法最簡單就是所有需要 long operation 01/03 22:36
CRPKT:的地方都 return promise 就差不多了 01/03 22:37
smallyuyuyu:喔你們都在對牛彈琴阿 01/04 02:47
你還在狀況外嗎? ※ 編輯: erspicu 來自: 61.70.105.149 (01/04 10:51)
readonly:這蠻困難的 也許資料有固定的 pattern... 01/04 23:38
readonly:也許不用執著於protocol,遇到一個修一個,可能就好了 01/04 23:39
smallyuyuyu:很少看到發文求解的講話這麼嗆耶 01/09 21:45
smallyuyuyu:人家一開始就回答你了 自己慧根不夠還嗆 頗呵 01/09 21:45
沒關係 你應該也看不太懂這討論串在說啥 狀況外 其實如果你還沒有能力理解這篇的話 是可以選擇先沉默的 也許先等你有辦法跟我一樣直接自己寫一個TELNET瀏覽器後 你就會看懂這篇在問啥了 ※ 編輯: erspicu 來自: 61.70.105.149 (01/14 23:41)