使用 HttpWebRequest 來 GET 網路資源,並讀取及解析 CSV

HttpWebRequest 是 .net 基礎類別庫中的一個類別,在命名空間 System.Net 下面,WebRequest 與 HttpWebRequest 兩者則有繼承關係,使用者能通過 HTTP 協議和伺服器交互溝通

HttpWebRequest 對 HTTP 協議進行了完整的封裝,對 HTTP 協議中的 Header, Content, Cookie,都做了屬性和方法的支援

程式會使用 HTTP 協定和伺服器交互主要是進行資料的提交

而通常在資料的提交是透過兩個方式來完成 GET 及 POST

 

本篇將會透過 GET 方式,發送請求,從台灣證卷交易所得到該支股票的歷史資料

因回傳回來是 CSV 檔,所以得到結果後,會將資料做處理

那開始前先新增一個類別 Stock

class Stock
{
   public string Date { get; set; }
   public int OpenPrice { get; set; }
   public int HighPrice { get; set; }
   public int LowPrice { get; set; }
   public int ClosePrice { get; set; }
}

然後實作主程式部分

HttpWebRequest request = null;

List<Stock> list = new List<Stock>();

// 建立 WebRequest 並指定目標的 url
request = (HttpWebRequest)WebRequest.Create("http://www.twse.com.tw/exchangeReport/STOCK_DAY?response=csv&date=20180301&stockNo=2330");
// 將 HttpWebRequest 的 Method 屬性設置為 GET
request.Method = "GET";
// API回傳的字串
string result = null;
int index = 0;

// 發出Request
using (WebResponse response = request.GetResponse())
{
   StreamReader sr = new StreamReader(response.GetResponseStream());
   while(!sr.EndOfStream)
   {
      result = sr.ReadLine();
      index++;

      // 前兩筆是欄位名稱,我們不需要,只抓第2筆跟之後
      if(index > 2)
      {
        try
        {
          // 將資料放入 list
          Stock stock = new Stock();
          // 以" , "做依據,將資料切成物件,放入陣列中
          string[] data = result.Split(',');
          // 將不需要的字元去掉
          stock.Date = data[0];
          stock.OpenPrice = int.Parse(data[3].Replace('"', ' '));
          stock.HighPrice = int.Parse(data[4].Replace('"', ' '));
          stock.LowPrice = int.Parse(data[5].Replace('"', ' '));
          stock.ClosePrice = int.Parse(data[6].Replace('"', ' '));
          list.Add(stock);
        }
        catch(Exception ex)
        {

        }
      }
        // 暫止執行續1秒,預防被伺服器鎖定而被拒絕使用
        Thread.Sleep(100);
    }
                
     sr.Close();
}
            
// 印出 list 裡的所有資料
foreach(var item in list)
{
   Console.WriteLine($"日期:{item.Date} 開盤價:{item.OpenPrice} 最高價:{item.HighPrice} 最低價:{item.LowPrice} 收盤價:{item.ClosePrice}");
}


Console.ReadKey();

確認得到的結果

 

 

新人發文,文章敘述如有錯誤及觀念不正確,請不吝嗇指教,感謝~