Plurk FaceBook Twitter 收進你的MyShare個人書籤 MyShare
  顯示內嵌語法

::旗標電腦文摘::最正確、最豐富的電腦知識寶藏!
2008-3-27│ NO418│訂閱電子報

本週活動:
‧Mac 特區─Mac OS X 10.5 使用手冊隆重登場
本期主題:
‧我是台灣Wargame駭客王
最新主題:
‧Dreamweaver CS3 運用 Spay 快速製作出可切換的標籤式面板
‧Mac成為家中客廳的數位畫框
:::最新出版:::
Mac 問題追緝令
本書由知名 Mac 教學網站站長親自操刀, 以 Q&A 方式呈現, 快速、有效解決 Mac 使用者最常遇到的各種疑難雜症。不管是 Mac 開不了機、忘了密碼、影片不能播、想重灌 Mac、想換硬碟/記憶體....
Silverlight 入門、問題解答、 經驗分享
NAS 網路磁碟機完全活用--選購、安裝、應用、改機一次搞定
CSS 設計點子爆米花
Mac 問題追緝令
The Wargame 駭客訓練基地 - 決戰台灣版
一定做得到! Photoshop 相片編修100技

本週活動:

遊戲影音 PLAY GAME 進化區

●不只玩遊戲,還有影音娛樂、網路功能全應用
●各式影片轉檔播放零障礙
●備份卡應用大集合


本期主題:ASP.NET 論壇問答精選:我要如何在ASP.NET中抓取來自於其他網站的資料 ?

適用平台:

適用範圍:□ ASP.NET 1.0 □ ASP.NET 1.1 □ ASP.NET 2.0 □ ASP.NET 3.5

問題

最近公司有一些需求, 要到其他公司提供的網站中抓取數值, 存到公司的資料庫中再取出來分析使用, 網址已經知道了, 那我要如何在ASP.NET中去抓取指定網址的資料?

問題說明

相信有些人有這種類似的經驗, 會在桌上放一個自己開發的即時抓取股市數據的小應用程式, 這些數據都來自於一些網站, 像是奇摩股市或是元大證券等網站, 在這些網站上都會提供當日的即時交易數字, 例如每股金額, 漲跌及當日成交量等數字, 這些數字在股市一族的眼中都是可供分析的數字, 在抓取網站的內容後, 再用像Regular Expression (規則運算式) 來抓取需要的數值存起來, 要查詢時再直接由本地過濾過的資料直接抓取即可。

要抓取網站的內容, 需要經由Winsock, 利用HTTP指令來和Web Server溝通, 上傳HTTP POST和HTTP GET, 然後取得伺服器的資料, 上傳的動作稱為Request, 而下載的動作稱為Response。.NET Framework中有直接支援Winsock網路函式庫的System.Net.Sockets命名空間, 有三個主要的類別可用來實作TCP/IP網路通訊的功能:

類別 功能
Socket Winsock 的基底類別, 可用來實作IPv4, IPv6的通訊協定。
TcpClient 以 Winsock 實作的TCP用戶端。
UdpClient 以 Winsock 實作的UDP用戶端。
TcpListener 以 Winsock 實作的TCP伺服端。

 

不過在.NET Framework還提供了一組透過HTTP來存取網站的簡單類別-HttpWebRequest與HttpWebResponse, 專門處理使用HTTP通訊協定連接到遠端Web Server, 以抓取資料的類別, 它還有個很類似的類別, 用來存取FTP的, 稱為FtpWebRequest與FtpWebResponse。

解決方案

若想要抓取網頁內容 (例如用奇摩查詢台積電的股票) 時, 可以利用下列程式碼來實作:

程式碼 1:用HttpWebRequest開啟簡單的網頁
HttpWebRequest request = WebRequest.Create(
  "http://tw.stock.yahoo.com/q/q?s=2330") as HttpWebRequest;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
StreamReader sr = new StreamReader(response.GetResponseStream(), 
  System.Text.Encoding.Default);

strContent = sr.ReadToEnd();

sr.Close();
request = null;
response = null;

 

若遠端網頁是需要登入時, 則需要加上NetworkCredential, 然後填入帳戶密碼再行連線, 真正的連線行為是發生在HttpWebRequest.GetResponse()時, 所以在這個指令下達前, 所有連線所需要的資訊都要設定好。

若想要知道連線成功或失敗, 可以透過HttpWebResponse.StatusCode來取得, 這個屬性會傳回HTTP的狀態碼, 常用的幾個狀態碼有:

狀態碼 說明
200 OK
403 拒絕存取
404 找不到網頁
405 設定的HTTP動作是不可用的
500 伺服器內部錯誤
503 服務無法使用

 

若想要使用HTTP POST來傳輸資料, 則需要先將傳輸方法設定為POST, 然後將要傳輸的資料寫入到Stream中 (由HttpWebRequest.GetRequestStream() 取得) , 然後再下GetResponse()指令, 例如下列的程式碼:

HttpWebRequest request = WebRequest.Create(strURL) as HttpWebRequest;

request.Method = "POST"; // 設定 HTTP POST
request.ContentLength = strPostData; // 必要項, 設定上傳資料的長度
// 設定為表單類型。
request.ContentType = "application/x-www-form-urlencoded"; 

StreamWriter sw = new StreamWriter(request.GetRequestStream());

sw.Write(strPostData); // 寫入要上傳的資料到Request Stream中。
sw.Flush();

HttpWebResponse response = request.GetResponse() as HttpWebResponse;
StreamReader sr = new StreamReader(response.GetResponseStream(), 
  System.Text.Encoding.Default);

strResponse = sr.ReadToEnd();

sr.Close();
sw.Close();
request = null;
response = null;

 

下載後的資料解析, 就需要花較多的腦筋了, 可以試著使用MSXML (XmlDocument, 因為HTML其實也是一種XML, 不過若抓取的網站如果不符合XHTML規格, 或者本身的HTML的用法很亂時, 可能會讓XmlDocument擲出例外) 或是Regular Expression來做分析, 或是以已知的路徑方式來搜尋資料。

小常識

不要隨便抓取未經授權的網站內容, 小心挨告

HttpWebRequest與HttpWebResponse固然好用, 不過由於用這種方法抓取的內容通常都是未經過合法授權的, 有可能會違反著作權法第91條的重製罪:

擅自以重製之方法侵害他人之著作財產權者, 處三年以下有期徒刑、拘役, 或科或併科新臺幣七十五萬元以下罰金。意圖銷售或出租而擅自以重製之方法侵害他人之著作財產權者, 處六月以上五年以下有期徒刑, 得併科新臺幣二十萬元以上二百萬元以下罰金。以重製於光碟之方法犯前項之罪者, 處六月以上五年以下有期徒刑, 得併科新臺幣五十萬元以上五百萬元以下罰金。著作僅供個人參考或合理使用者, 不構成著作權侵害。

因此, 在抓取別的網站的資料時, 最好是能夠有原作者的書面授權, 以保障自身權益。

...........更多的內容請見《ASP.NET 問題解決實戰

本期主題:我是台灣Wargame駭客王

要瞭解甚麼是 Wargame, 最簡單的方式就是親手玩看看, 我們準備以台灣駭客高手模擬「http://www.hack.ae」的 Wargame 網站為例, 讓大家實際體會 Wargame 的趣味。


開始闖關

請進入以下網址開始:
http://wargame.dyns.cx/game2/level1/index1.php

難易程度:★★☆☆☆
相關技巧:1、Binary Information Analysis

相信所有WARGAME的第一關應該都是滿簡單的, 根據這關的提示, 有點讓人不太了解作者想提示些什麼, 不過若是提示的太明顯, 讓關卡變得太簡單, 那也就失去了WARGAME的好玩之處了, 最有趣的WARGAME就是要有種, 眾裡尋他千百度, 驀然回首, 那人卻在燈火闌珊處的那種感覺。


根據筆者的看法, 其實這關作者想要提示的內容, 應該是此隻程式(level1.exe)是用C語言寫的, 而既然是用C語言寫的, 那程式中就會有些C語言的特性, 而這或許就是我們可利用的線索。

 

先執行看看level1.exe這隻程式, 是否有提供些額外的資訊。看來這個程式是來驗證第一關的密碼是否正確的程式?那我們就隨手找一套十六進位的編輯程式, 來看看檔案中有些什麼內容, 並且根據先前執行的結果, 可以作為搜尋的關鍵字, 而筆者是以 「CHROOT」 作為查詢時的關鍵字, 然後再來檢示看看其他的相關資訊。


由查詢結果不難發現到有一段疑似通關密碼的字串, 我們立刻丟入程式中驗證看看是否通過, 執行結果似乎令人非常滿意, 讓我們看到了通關成功的訊息。

 

此程式是使用C語言編寫, 並未對密碼字串編碼, 所以編譯完成後, 可輕易由執行檔中查詢到相關字串, 甚至筆者還可由執行檔中查詢到, 此程式是使用Turbo-C來編譯, 而程式反推出的pseudo code參考如下。


 

#define PASS "######"
int main(int argc, char *argv[])
{
  if(!argv[1]) {
    printf("CHROOT WARGAME GAME#2 – LEVEL 1 (unohope@chroot.org)\n");
    printf("Usage: %s <password>\n", argv[0]);
    exit(0);
  }
  if(strcmp(argv[1], PASS)) {
    printf("Try again dude!\n");
  } else {
    printf("Congratulation GAME#2 Level 1 has been completed :)\n");
  }
}

其實除了用十六進位編輯程式外, 還可以直接用一些查詢字串的程式查詢, 這樣也可得到同樣的效果喔!由程式中很快的就可以看出來, 相關的通關密碼, 破解這關卡根本不費任何的吹灰之力。

 

既然已經知道了通關密碼, 那就趕快回到驗證的頁面, 輸入正確的相關內容, 然後就可以看要求您簽下過關者大名的畫面, 這表示已經順利通過了Level 1的關卡, 準備朝著Level 2邁進囉!

 

 

結語

經過了這簡單的第一關, 是否看出 Wargame 的趣味了?您可以繼續發揮駭客毅力, 往下一關挺進, 找出破關密碼, 成為台灣駭客王!

...........更多的內容請見《The Wargame 駭客訓練基地 - 決戰台灣版


好書能增進知識、提高學習效率‧ 卓越的品質是旗標的信念與堅持
Copyright c 2007 Flag Publishing Co.,Ltd. All Rights Reserved 本電子報內容未經授權請勿轉載