private void SetStockCodeList(string url, List <StockPriceEntity> list) { HtmlUtil htmlUtil = new HtmlUtil(); // urlからWebサイトに接続し情報を取得する XDocument xdoc = htmlUtil.ParseHtml(htmlUtil.GetHtml(url)); var ns = xdoc.Root.Name.Namespace; // 次へのページが存在するか確認する string nextUrl = ""; var query1 = from q1 in xdoc.Descendants(ns + "ul") where (string)q1.Attribute("class") == "ymuiPagingBottom clearFix" select q1; foreach (var q in query1.Descendants("a")) { if (q.Value == "次へ") { nextUrl = q.Attribute("href").Value; } } var query2 = from q2 in xdoc.Descendants(ns + "tr") select q2; bool first = true; foreach (var q1 in query2) { if (first) { first = false; continue; } StockPriceEntity stock = new StockPriceEntity(); int i = 1; bool exitFor = false; foreach (var q2 in q1.Descendants()) { switch (i) { case 1: if (q2.Value == "順位") { exitFor = true; break; } break; case 2: if (Convert.ToDecimal(q2.Value) < 9999) { stock.StockCode = Convert.ToInt32(q2.Value); list.Add(stock); } exitFor = true; break; } i++; if (exitFor) { break; } } } if (nextUrl == "") { // 次のURLがなければ処理終了 return; } else { // 次のURLがあれば再帰呼び出し SetStockCodeList(nextUrl, list); } }
private async Task UpdateStockPriceTarget() { Stopwatch sw = new System.Diagnostics.Stopwatch(); this.txtUpdateStatus.Text += "株価更新開始" + Environment.NewLine; this.txtUpdateStatus.SelectionStart = this.txtUpdateStatus.TextLength; this.txtUpdateStatus.ScrollToCaret(); // 情報の取得 List <Utility.ProfileEntity> listProfile = new List <Utility.ProfileEntity>(); List <Utility.StockPriceEntity> listStockPrice = new List <Utility.StockPriceEntity>(); List <Utility.StockPriceEntity> listStock = new List <Utility.StockPriceEntity>(); Utility.StockPriceEntity sp; int code; for (int line = 0; line < this.txtStockCodes.Lines.Length; line++) { if (int.TryParse(this.txtStockCodes.Lines[line], out code)) { sp = new Utility.StockPriceEntity(); sp.StockCode = code; listStock.Add(sp); } } foreach (StockPriceEntity r in listStock) { sw.Restart(); await Task.Run(() => { Utility.FinanceUtil finance = new Utility.FinanceUtil(); //listStockPrice = finance.GetStockPriceEntityList(r.StockCode,DateTime.Now.AddYears(-10).Date,DateTime.Now.Date); listStockPrice = finance.GetStockPriceEntityList(r.StockCode, DateTime.Now.AddMonths(-60).Date, DateTime.Now.Date); }); await Task.Run(() => { if (listStockPrice.Count == 0) { // 株価取得できない場合はスルー } else { using (Utility.DbUtil db = new Utility.DbUtil()) { // 削除 var query = from q in listStockPrice where q.StockCode == r.StockCode select q; db.DBUpdate("DELETE FROM stockprice WHERE StockCode = :StockCode AND StockDate BETWEEN :BeginDate AND :EndDate ", new { StockCode = r.StockCode, BeginDate = query.Min(stock => stock.StockDate), EndDate = query.Max(stock => stock.StockDate) }); // 登録 string insertSql = @"INSERT INTO stockprice ( StockCode ,CompanyName ,StockDate ,OpeningPrice ,HighPrice ,LowPrice ,ClosingPrice ,TradeVolume ,AdjustmentClosingPrice ) VALUES ( :StockCode ,:CompanyName ,:StockDate ,:OpeningPrice ,:HighPrice ,:LowPrice ,:ClosingPrice ,:TradeVolume ,:AdjustmentClosingPrice )"; db.DBInsert(insertSql, listStockPrice); } } }); sw.Stop(); this.txtUpdateStatus.Text += r.StockCode.ToString().PadLeft(4, '0') + " データ更新 " + sw.Elapsed.ToString() + Environment.NewLine; this.txtUpdateStatus.SelectionStart = this.txtUpdateStatus.TextLength; this.txtUpdateStatus.ScrollToCaret(); } this.txtUpdateStatus.Text += "株価更新終了" + Environment.NewLine; this.txtUpdateStatus.SelectionStart = this.txtUpdateStatus.TextLength; this.txtUpdateStatus.ScrollToCaret(); // 日経平均、ドル円 sw.Restart(); List <DollarYenEntity> listDY = new List <DollarYenEntity>(); List <NikkeiAverageEntity> listN = new List <NikkeiAverageEntity>(); await Task.Run(() => { Utility.FinanceUtil finance = new Utility.FinanceUtil(); listDY = finance.GetDollarYenEntityList(); listN = finance.GetNikkeiAverageEntityList(); }); await Task.Run(() => { if (listDY.Count == 0) { // ドル円が取得できない場合はスルー } else { using (Utility.DbUtil db = new Utility.DbUtil()) { // 削除 var query = from q in listDY select q; db.DBUpdate("DELETE FROM dollaryen WHERE ExchangeDate BETWEEN :BeginDate AND :EndDate ", new { BeginDate = query.Min(dollerYen => dollerYen.ExchangeDate), EndDate = query.Max(dollerYen => dollerYen.ExchangeDate) }); // 登録 string insertSql = @"INSERT INTO dollaryen ( ExchangeDate ,OpeningPrice ,HighPrice ,LowPrice ,ClosingPrice ) VALUES ( :ExchangeDate ,:OpeningPrice ,:HighPrice ,:LowPrice ,:ClosingPrice )"; db.DBInsert(insertSql, listDY); } } if (listN.Count == 0) { // 日経平均が取得できない場合はスルー } else { using (Utility.DbUtil db = new Utility.DbUtil()) { // 削除 var query = from q in listN select q; db.DBUpdate("DELETE FROM nikkeiaverage WHERE StockDate BETWEEN :BeginDate AND :EndDate ", new { BeginDate = query.Min(nikkei => nikkei.StockDate), EndDate = query.Max(nikkei => nikkei.StockDate) }); // 登録 string insertSql = @"INSERT INTO nikkeiaverage ( StockDate ,OpeningPrice ,HighPrice ,LowPrice ,ClosingPrice ) VALUES ( :StockDate ,:OpeningPrice ,:HighPrice ,:LowPrice ,:ClosingPrice )"; db.DBInsert(insertSql, listN); } } }); this.txtUpdateStatus.Text += "日経平均・ドル/円更新終了" + sw.Elapsed.ToString() + Environment.NewLine; this.txtUpdateStatus.SelectionStart = this.txtUpdateStatus.TextLength; this.txtUpdateStatus.ScrollToCaret(); }
private void SetStockPriceEntityList(string url, List <StockPriceEntity> list) { HtmlUtil htmlUtil = new HtmlUtil(); XDocument xdoc; try { xdoc = htmlUtil.ParseHtml(htmlUtil.GetHtml(url)); } catch (Exception) { xdoc = htmlUtil.ParseHtml(htmlUtil.GetHtml(url)); } // urlからWebサイトに接続し情報を取得する var ns = xdoc.Root.Name.Namespace; // 次へのページが存在するか確認する string nextUrl = ""; var query1 = from q1 in xdoc.Descendants(ns + "ul") where (string)q1.Attribute("class") == "ymuiPagingBottom clearFix" select q1; foreach (var q in query1.Descendants("a")) { if (q.Value == "次へ") { nextUrl = q.Attribute("href").Value; } } // 時系列株価情報を取得する var query2 = from q2 in xdoc.Descendants(ns + "table") where (string)q2.Attribute("class") == "boardFin yjSt marB6" select q2.Descendants(ns + "tr"); var company = from c in xdoc.Descendants(ns + "h1") select c; var code = from c in xdoc.Descendants(ns + "dt") select c; StockPriceEntity stockPrice; foreach (var q1 in query2) { foreach (var q2 in q1) { if (q2.Elements() == null) { continue; } if (q2.Elements().First().Value == "日付") { continue; } decimal d; if (decimal.TryParse(q2.Elements().ElementAt(1).Value, out d) == false) { continue; } stockPrice = new StockPriceEntity(); stockPrice.StockCode = Convert.ToInt32(code.First().Value); stockPrice.CompanyName = company.First().Value; stockPrice.StockDate = Convert.ToDateTime(q2.Elements().ElementAt(0).Value); stockPrice.OpeningPrice = Convert.ToDecimal(q2.Elements().ElementAt(1).Value); stockPrice.HighPrice = Convert.ToDecimal(q2.Elements().ElementAt(2).Value); stockPrice.LowPrice = Convert.ToDecimal(q2.Elements().ElementAt(3).Value); stockPrice.ClosingPrice = Convert.ToDecimal(q2.Elements().ElementAt(4).Value); stockPrice.TradeVolume = Convert.ToDecimal(q2.Elements().ElementAt(5).Value); stockPrice.AdjustmentClosingPrice = Convert.ToDecimal(q2.Elements().ElementAt(6).Value); list.Add(stockPrice); } } if (nextUrl == "") { // 次のURLがなければ処理終了 return; } else { // 次のURLがあれば再帰呼び出し SetStockPriceEntityList(nextUrl, list); } }