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

關於抓取網頁程式的問題

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


發表:3
回覆:3
積分:1
註冊:2007-03-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-03-05 15:06:09 IP:61.71.xxx.xxx 訂閱
各位大大你們好 小弟目前寫了一個BCB程式 用來抓取Yahoo以及Google關鍵字搜尋結果頁面的程式
關鍵字下法先以最簡單的方式(純中文字不含 and, or, not 功能)
http://www.google.com.tw/search?q=關鍵字
http://tw.search.yahoo.com/search?p=關鍵字

我試用過TNMHTTP以及TIdHTTP兩種方式連結取得網頁 兩種方式都一樣
一兩筆 或是手動輸入關鍵字都沒有問題 可以順利抓取搜尋結果頁面
但是當我想透過讀自己設定好的Excel格式
讀取大量關鍵字一筆一筆丟給Yahoo或是Google去搜尋取得結果頁面時
Google沒問題
Yahoo卻大約到第25筆左右就把我封鎖了 讀到的網頁是error 999的頁面 感覺是被封IP
可是直接用IE開卻又沒問題(在URL列中直接key入 http://tw.search.yahoo.com/search?p=關鍵字)

可能是Yahoo會去判別是哪隻程式在發request 如果是他不認識的程式就封鎖。
所以想請問各問大大有沒有解決的辦法,或是讓Yahoo認為我這隻程式模擬IE發request而不被它檔下
或是有沒有其他功能可以換用看看的 TIdTCPClient TIdTCPServer 之類的 我都不太會用 @@:"
希望能抓一百個以上關鍵字的回傳結果頁面

謝謝各位大大 <(_ _)>
hipig
高階會員


發表:29
回覆:75
積分:110
註冊:2007-01-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-03-05 15:38:08 IP:140.126.xxx.xxx 未訂閱
用自訂的user-agent來騙過系統...很多網路應用的軟體都會實做這部份
pcboy
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-03-06 15:52:04 IP:210.241.xxx.xxx 訂閱
幾種方法
1. 當讀取到 error 999 網頁時候, 暫停若干時間再去問
2. 當讀取到 error 999 網頁時候, 將自己隨機複製成為另一個程式, 執行該程式去抓
3. 當讀取到 error 999 網頁時候, 中斷撥接網路, 重新撥接上網取得別的 IP, 再去問
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
lindavid
一般會員


發表:3
回覆:3
積分:1
註冊:2007-03-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-03-08 09:33:46 IP:61.71.xxx.xxx 訂閱
先謝謝兩位大大的熱心回答 感激不盡
hipig大大:
我這幾天試了一下您說的user-agent,我只有修改IdHTTP1->Request->UaserAgent 改的跟我IE7.0一樣(或是其他版本),但是結果還是不行ˊˋ
請問您說的自訂的user-agent是該怎麼實作呢?或是可以給我一些相關的參考資料嗎(我去搜尋引擎打 大部分都是彈出修改IE的user-agent之方法) 謝謝...

pcboy大大:
第一種方法先暫時不考慮,第二三種方法的話,感覺難度很高深,小弟我...實在想不出頭緒該怎麼實作,如果可以的話,也請您給一個方向,謝謝


如果用自訂的user-agent來騙過系統是可行的話,可能會比較好 :p

pcboy
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-03-08 10:56:27 IP:210.69.xxx.xxx 訂閱
第2種方法提供一些資訊參考
uses
ShellApi; // ShellExecute 用

procedure FileCopy( const Source, Dest : string );
var
S, D: TFileStream;
begin
S := TFileStream.Create( Source, fmOpenRead );
try
D := TFileStream.Create( Dest,
fmOpenWrite or fmCreate );
try
D.CopyFrom( S, S.Size );
finally
D.Free;
end;
finally
S.Free;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
Content : String;
begin
開啟儲存回傳資料檔案;
Content:= IdHTTP1('http://tw.search.yahoo.com/search?p=關鍵字');
if Pos('999', String) then
begin
關閉儲存回傳資料檔案;
NewProgName := FormatDateTime('yyyymmddhhmmss',Now) '.exe';
FileCopy('Project1.exe', NewProgName);
ShellExecute(handle, 'open', 'C:\Program Files\' NewProgName ,'C:\save.txt', '', SW_SHOWNORMAL);
Application.Terminate;
end;
end;

------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-03-08 11:06:05 IP:210.69.xxx.xxx 訂閱
重點是 Yahoo 封鎖機制到底是什麼 ?
Yahoo 如果封鎖 IP 若干時間就可再抓, 方法 1,3 才有用, 方法 2 必須等封鎖時效過去
在此情況下如果不想等待時間, 只有方法 3 可行, 但是你必須是非固定 IP 的撥接用戶


------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
lindavid
一般會員


發表:3
回覆:3
積分:1
註冊:2007-03-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-03-08 15:01:35 IP:61.71.xxx.xxx 訂閱
可是在當我被雅虎封鎖(回傳error 999)的時候,用IE卻可以正常顯示搜尋結果,包括直接從url欄位直接key入http://tw.search.yahoo.com/search?p=關鍵字

所以我想知道的是,他應該是有辦法判斷發出request的是IE還是我自己寫的程式,是怎麼分辨的,差了哪幾個header

我剛剛有用Ethereal試圖去抓HTTP的封包,對照,然後修改幾個欄位,結果還是不行ˊˋ

pcboy
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-03-08 15:17:50 IP:210.69.xxx.xxx 訂閱
那就用方法2去嘗試看看吧
或許同 IP 封鎖時間只有 1 ~ 2 秒, 因為程式抓時 1 秒鐘可能抓數次, 手動輸入 1 次至少超過 1秒
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
系統時間:2017-10-19 20:49:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!