IDHttp POST 抓網頁資料一問 ! |
答題得分者是:pcboy
|
UB
一般會員 發表:18 回覆:19 積分:7 註冊:2007-02-19 發送簡訊給我 |
各位大大請幫個忙 !!
前提是.....我對 IDHTTP 這個東西完全不熟悉,最近這幾天才開始認識他 !! 好了,惡夢開始啦 ~ 我用了完全不熟悉的IDHttp去準備去抓下面這個網頁的資料.. http://mops.tse.com.tw/server-java/t13sa150_otc?step=0 第一步當然是去網站看看他的原始檔,蒐集蒐集資料... 嗯 ~ 很好,看起來很簡單,因為他有Frame所以我把兩個FrameSet拆開來弄 ! 上面那一部份(搜尋資料輸入)為 /server-java/t13sa150_otc?&step=1 也就是 http://mops.tse.com.tw/server-java/t13sa150_otc?&step=1 , 下面那一部份(搜尋結果)為 /server-java/t13sa150_otc?&step=wh 也就是 http://mops.tse.com.tw/server-java/t13sa150_otc?&step=wh, 而搜尋部份的Form裡面 Action='/server-java/t13sa150_otc' 而form 裡面只有years,months,days,bcode和step這五個東西傳出去 !! 資料蒐集齊全了 ~ 不廢話,開始來個小測試...前幾天才學會用IDHttp.GET去抓東西,都沒有出什麼大問題,現在用IDHttp.POST應該也難不倒我,小弟心裡這樣子盤算著....Coding中... 現在我用下面的小測試程式下去抓... [code] procedure TForm1.Button1Click(Sender: TObject); var list : TStringList; str : string; begin list := TStringList.Create; list.Text := 'years=2007&months=09&days=03&bcode=&step=2'; str := idhttp1.Post('http://mops.tse.com.tw/server-java/t13sa150_otc',list); memo1.Text := str; end; [/code] 結果卻抓到了他的整個 Frame !!...不氣餒 ~ 於是乎小弟就裝聰明的直接在他輸入要查詢那一部份的Frameset直接抓來跑看看,也就是說在IE的網址列直接鍵入 http://mops.tse.com.tw/server-java/t13sa150_otc?&step=1 然後按一下 Enter,沒啥意外就直接把查詢的網頁直接叫出來了,然後在網頁上按一下查詢...很好,資料出來了,他跳在新的視窗,因為Target的關係,這一點也不意外 ~ 接下來就是Delphi的測試了,全部東西都不變,唯一改變的是AURL稍稍的變了一下,偷偷改成 http://mops.tse.com.tw/server-java/t13sa150_otc?&step=wh , 這下子看起來好像有點進步了,他不再是Frame了,但是資料卻沒有出來,跑出來的是.... 查無所需資料 ....而這個錯誤就是如果我在查詢時,輸入股市沒有開盤的日子,例如星期六日,就會出現這個錯誤 !! 現在問題簡單的說就是,我要怎麼樣才能抓到我要的資料 !! 不吝賜教,感激感激 ~ 當然等我這個東西會了的時候,我就要更進一步的研究需要密碼的網站該如何抓取資料 !! 嘿嘿 ~因為再來我就要來抓www.cnyes.com.tw 台股的資料了,到時候應該是會有更多問題,如果我Google不到答案,或者Ktop不到答案的話,還要請各位先進多幫忙,在此先預告一下 !! |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
小弟實際測試了一下, 回傳的確實是 Frame, 而且 http://mops.tse.com.tw/server-java/t13sa150_otc?&step=wh 也出現 "查無所需資料" 個人懷疑這是防護措施 小弟懷疑下面網頁除了送出5個選項, 還有一些隱藏的 SESSION 變數設定 (這是看不到的) http://mops.tse.com.tw/server-java/t13sa150_otc?&step=1 如果是從第一個畫面操作起, 會設定SESSION變數, 目的網頁網頁如果偵測得到 SESSION 變數, 就顯示結果; 偵測不到就出現 "查無所需資料" 解決方法..就小弟所知, 無解... 換別的網站去取得資料吧
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
UB
一般會員 發表:18 回覆:19 積分:7 註冊:2007-02-19 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
你按下按鈕後, 會跳出 IE 視窗, 內容並非顯示在 WebBrowser 中
<textarea class="delphi" rows="10" cols="60" name="code">WebBrowser1.Navigate('http://mops.tse.com.tw/server-java/t13sa150_otc?&step=1'); </textarea>
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
UB
一般會員 發表:18 回覆:19 積分:7 註冊:2007-02-19 發送簡訊給我 |
感謝 PCBoy的大力幫忙 ~
小弟我弄出來了 , 其實他這個網站並沒有使用 Session 來控制資料是否釋出 ~ 不過PCBoy 倒是真的點出了一個很深沈的問題 !! 就是如果網頁利用Session控制 資料是否釋出的話的話,IDHTTP就沒有辦法那麼輕易的來抓取資料了 !! 可是如果按照我在 Ktop搜尋的結果,也不是完全沒有藥醫,只不過良方解藥就要靠自己去找了 !! 小弟我看了一個下午,基本上也沒有辦法在重新找出哪些文章對 Session 有幫助,不過有幾個方向,是我得到的粗淺的觀念認知,也不曉得有沒有搞錯 !! idhttp 可以做的 : 送出資料給Form(不論是 POST 或者 GET) 還有Request !! WebBrowser可以模擬網頁,也就是說可以控制裡面的Form啦 ~ 不過在我測試的結果,有時候會遇到怪問題,我Google了一下,好像是OS的問題, 例如我用 years := Docs.GetElementsByName('years'); 他就會出現這個問題,anyway 這方面不多說,因為我也不是很懂. 重點說一下,我idhttp的POST用法錯誤才會導致我一開始發問時的問題 !! POST 用法和 Get 不一樣 !! 應該要用 list.text := 'years=2007'; list.Add('months=09'); list.Add('days=05'); list.Add('bcode='); list.Add('step=2'); 把五個資料讀進去,而不是 用 GET 的方法 (用 &把資料隔開 !) 所以目前問題解決啦 ~ 接下來要挑戰 需要密碼的網頁,.... CNYES.com 有問題再來麻煩大家, (九成九會再回來煩大家) .... anyway 目前這個問題解決啦 !! 感謝 PCBoy 大大的鼎力相助 !! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |