[閒聊] telnet 抓取資料

看板Soft_Job作者 (.)時間12年前 (2014/01/02 22:59), 編輯推噓10(10052)
留言62則, 12人參與, 最新討論串1/1
原本以為說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

01/02 23:14, , 1F
可以去研究zterm的程式碼
01/02 23:14, 1F

01/02 23:14, , 2F
其實還滿多的,不過要自己找來看
01/02 23:14, 2F
zterm是telnet瀏覽器喔...跟我要的把特定站台一些資料抓取下來的目的不太一樣 ※ 編輯: erspicu 來自: 61.70.105.149 (01/02 23:17)

01/02 23:18, , 3F
要javascript可以研究bbsfox-for-google-chrome
01/02 23:18, 3F

01/02 23:20, , 4F
你該去找telnet SPEC來看。硬幹不會比較快..
01/02 23:20, 4F
以前就幹過了 http://dl.dropboxusercontent.com/u/61164954/homepage/samplebbs/index.htm 現在的重點不是如何寫TELNET瀏覽器 是如何把TELNET上的資料抓下來 特別是用NODE.JS有許多非同步行為 目前還在摸索比較好的方式 是上問看看有沒有人有相關經驗 參考一下做法 ※ 編輯: erspicu 來自: 61.70.105.149 (01/02 23:25)

01/02 23:22, , 5F
況且還有色碼跟位移碼,真的是蠻複雜的Q_Q...
01/02 23:22, 5F

01/03 00:06, , 6F
不去了解protocol你是要怎麼處理這些input.....
01/03 00:06, 6F
以前就寫過telnet瀏覽器 ptt瀏覽大概都正常 你覺得我不了解protocol?? 是控制碼很多 有些用不到 沒k得很完全而已

01/03 00:06, , 7F
就自設screen buffer, 把拿到的資料都在上面跑一篇.
01/03 00:06, 7F

01/03 00:07, , 8F
然後要拿資料的時候, 直接到buffer抓.
01/03 00:07, 8F

01/03 00:08, , 9F
顏色碼那些如果不影響你篩選資料的話, 取到的時候可以
01/03 00:08, 9F

01/03 00:08, , 10F
discard掉.
01/03 00:08, 10F
感覺樓上應該是有實際處理經驗 我的感覺是 只能說抓TELNET資料 真的沒比寫telnet瀏覽器簡單阿...很多處理的菱菱角角還在摸 ※ 編輯: erspicu 來自: 61.70.105.149 (01/03 00:15)

01/03 00:20, , 11F
呃telnet瀏覽器就有作parse的動作啊 那是現成的code
01/03 00:20, 11F
parse資料跟parse控制碼還滿不一樣的耶...

01/03 00:22, , 12F
js的話,去看看bbsfox以及pcmanfx之類的js程式如何?
01/03 00:22, 12F
※ 編輯: erspicu 來自: 61.70.105.149 (01/03 00:57)

01/03 01:36, , 13F
寫過ptt mobile app就知道parsing的苦
01/03 01:36, 13F

01/03 07:22, , 14F
呃...原PO可能不知道複製有純文字和包含控制碼
01/03 07:22, 14F

01/03 07:22, , 15F
一堆程式可以抄 只差在不想看而已吧囧
01/03 07:22, 15F

01/03 07:25, , 16F
01/03 07:25, 16F

01/03 07:26, , 17F
具體作法可能像是leicheong大所說 程式碼都有了
01/03 07:26, 17F
我很確定你對這問題的理解在狀況外 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)

01/03 09:08, , 18F
pcmanfx的 下載文章 這個功能就差不多是你要的功能了.
01/03 09:08, 18F
恩 下載文章的處理方式 的確可以參考 但是隨著狀況不同 要擷取什麼資料 似乎只能見機行事 case by case 只是這中間會想聽聽相關處理經驗的人心得分享

01/03 09:10, , 19F
手機 BBS 瀏覽器 (尤其 Android 的) 會遇到一模一樣的問
01/03 09:10, 19F
yes parsing控制碼 跟 parsing資料 本來就兩回事情 總算還有人知道我在說啥

01/03 09:10, , 20F
題, 應該有一些開源專案可以參考
01/03 09:10, 20F
※ 編輯: erspicu 來自: 60.248.56.181 (01/03 09:42)

01/03 10:38, , 21F
沒經驗, 就上述來看第一層 screen buffer 跑不掉
01/03 10:38, 21F

01/03 10:39, , 22F
第二層 site map model 大概也跑不掉, 第三層抓資料策略
01/03 10:39, 22F

01/03 10:39, , 23F
覺得 async 麻煩的話 future/promises pattern 會省很多事
01/03 10:39, 23F
大概方向 是這樣沒錯 只是實作細節跟程式規劃中間很多菱角 要想想 還真佩服像是MOPTT和BBSREADER作者...原本覺得這種程式不會太複雜 功真的不少... ※ 編輯: erspicu 來自: 60.248.56.181 (01/03 10:44)

01/03 13:18, , 24F
其實你還是該去研究 zterm
01/03 13:18, 24F

01/03 13:19, , 25F
你要做的東西我之前做過,你除了靠新加入的資料以外,還得靠
01/03 13:19, 25F

01/03 13:19, , 26F
畫面的 buffer 去當成 full data 來 parse。
01/03 13:19, 26F

01/03 13:19, , 27F
他不像 api 一樣會回給你完整的資料,你得不斷的刷新 buffer
01/03 13:19, 27F

01/03 13:19, , 28F
再從 buffer 裡面解析出正確的資料。從這個角度去想。
01/03 13:19, 28F

01/03 13:21, , 29F
該有的狀態大致上都有啦,像是你可以知道你現在在哪個版,
01/03 13:21, 29F

01/03 13:21, , 30F
特別需要考慮的是像是進版畫面(存在或不存在)、文章內文
01/03 13:21, 30F

01/03 13:21, , 31F
標題被修改或指令送出延遲等等之類的特殊情況。
01/03 13:21, 31F

01/03 13:22, , 32F
然後就平常使用 ptt 會碰到的控制碼跟瀏覽器真正會碰到的控
01/03 13:22, 32F

01/03 13:22, , 33F
製碼其實還有不少差距,但規則基本上都還算單純。
01/03 13:22, 33F

01/03 13:22, , 34F
控制碼方面,比較討厭的就是雙色字之類的處理,對 encording
01/03 13:22, 34F

01/03 13:22, , 35F
要熟。
01/03 13:22, 35F

01/03 13:24, , 36F
推完才發現 leicheong 其實已經回的差不多了。XD
01/03 13:24, 36F

01/03 13:24, , 37F
這個你玩過 telnet browser 的話,就是那樣啦,沒有魔術
01/03 13:24, 37F

01/03 13:24, , 38F
因為 bbs server 會回傳什麼,真的完完全全就是看他高興...
01/03 13:24, 38F

01/03 13:25, , 39F
我之前做的東西是偏向 bbs robot ,會自動下 query 跟發文
01/03 13:25, 39F

01/03 13:26, , 40F
以前幫學校做的租屋網站做出自動發文到學校bbs租屋版的系統
01/03 13:26, 40F

01/03 13:26, , 41F
這兩者需要的東西有認真做的話其實很像,資訊上也很像。
01/03 13:26, 41F
之前雖然是自己處理控制碼 但是是直接借用c#的console來當screen 而現在等於是自己要處理和實作screen容器 來讀buffer 覺得很麻煩 但是似乎是一定的必要步驟了 等於在擷取比對所要的內容 使用的screen pattern來分析就是 ok... ※ 編輯: erspicu 來自: 60.248.56.181 (01/03 16:28)

01/03 18:40, , 42F
雖說理解錯你的意思 但認真的說 pcmanfx的確有你要的功
01/03 18:40, 42F

01/03 18:40, , 43F
能 研究是必要的吧 它也是用screen buffer概念
01/03 18:40, 43F

01/03 19:27, , 44F
@typepeter 他的問題是要知道現在在哪個畫面,這個畫面有哪
01/03 19:27, 44F

01/03 19:27, , 45F
些資料,pcmanfx 跟這有關聯的部份在哪你直接寫出來不就好了
01/03 19:27, 45F

01/03 19:30, , 46F
@erispicu 我建議你第一版在做的時候先把顏色這個變數拿掉
01/03 19:30, 46F

01/03 19:31, , 47F
等純粹抓資料能搞定之後再來煩惱顏色的控制碼,雙色字那個
01/03 19:31, 47F

01/03 19:31, , 48F
問題我是覺得有點麻煩。
01/03 19:31, 48F

01/03 19:32, , 49F
反正要判斷控制碼只要看 (esc) m 這些 pattern 就能濾了
01/03 19:32, 49F

01/03 19:44, , 50F
termbuf.js是buffer的實作 pcman會更新它的內容
01/03 19:44, 50F

01/03 19:45, , 51F
類似的行為可以看pcman.js termbuf.js termsel.js
01/03 19:45, 51F

01/03 19:46, , 52F
因為這三個都是關於對buffer進行更新/讀取的動作
01/03 19:46, 52F

01/03 19:46, , 53F
我覺得應該是可以參考,然後自己刻一個buffer出來
01/03 19:46, 53F

01/03 19:46, , 54F
因為PCMAN大大寫得還不錯 應該是很有參考價值啦
01/03 19:46, 54F

01/03 22:34, , 55F
這些看起來他已經會寫啦, 就只是都很麻煩吧 XD
01/03 22:34, 55F

01/03 22:36, , 56F
async 的 API 開法最簡單就是所有需要 long operation
01/03 22:36, 56F

01/03 22:37, , 57F
的地方都 return promise 就差不多了
01/03 22:37, 57F

01/04 02:47, , 58F
喔你們都在對牛彈琴阿
01/04 02:47, 58F
你還在狀況外嗎? ※ 編輯: erspicu 來自: 61.70.105.149 (01/04 10:51)

01/04 23:38, , 59F
這蠻困難的 也許資料有固定的 pattern...
01/04 23:38, 59F

01/04 23:39, , 60F
也許不用執著於protocol,遇到一個修一個,可能就好了
01/04 23:39, 60F

01/09 21:45, , 61F
很少看到發文求解的講話這麼嗆耶
01/09 21:45, 61F

01/09 21:45, , 62F
人家一開始就回答你了 自己慧根不夠還嗆 頗呵
01/09 21:45, 62F
沒關係 你應該也看不太懂這討論串在說啥 狀況外 其實如果你還沒有能力理解這篇的話 是可以選擇先沉默的 也許先等你有辦法跟我一樣直接自己寫一個TELNET瀏覽器後 你就會看懂這篇在問啥了 ※ 編輯: erspicu 來自: 61.70.105.149 (01/14 23:41)
文章代碼(AID): #1InNxfk2 (Soft_Job)