線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:8147
推到 Plurk!
推到 Facebook!

IDHttp POST 抓網頁資料一問 !

答題得分者是:pcboy
UB
一般會員


發表:18
回覆:19
積分:7
註冊:2007-02-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-09-04 15:49:14 IP:203.79.xxx.xxx 訂閱
各位大大請幫個忙 !!
前提是.....我對 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,bcodestep這五個東西傳出去 !!

資料蒐集齊全了 ~ 不廢話,開始來個小測試...前幾天才學會用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-09-05 08:57:46 IP:61.220.xxx.xxx 訂閱
小弟實際測試了一下, 回傳的確實是 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-09-05 10:04:46 IP:203.79.xxx.xxx 訂閱
PCBOY 大大 ~ 不曉得你對WebBrowser 有沒有研究, 如果按照你說的,我努力的想了一下,如果直接用WebBrowser 下去的話,就應該有他的Session啦 ~ 可是問題是,WebBrowser 我還要研究看看,我只會用他做基本的,如果你認為WebBrowser可以解決問題的話,我就要努力來研究他了 ~ 如果不麻煩的話,施捨一點 Code 當然是最好的 ~ ^^
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-09-05 10:15:17 IP:61.220.xxx.xxx 訂閱
你按下按鈕後, 會跳出 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-09-05 22:39:56 IP:211.76.xxx.xxx 訂閱
感謝 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 大大的鼎力相助 !!
系統時間:2024-04-20 1:43:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!