Yahooファイナンスから株価をダウンロードできないのを直す
* Protra.Lib/Update/YahooFinanceUpdator (YahooFinanceUpdator): 正規表現を更新
* Protra.Lib/Update/YahooFinanceUpdator (YahooFinanceUpdator.GetPage): 新URLから日経平均を取れないのを直す
@@ -1,5 +1,12 @@ | ||
1 | 1 | 2022-04-16 panacoran <panacoran@users.osdn.me> |
2 | 2 | |
3 | + Yahooファイナンスから株価をダウンロードできないのを直す | |
4 | + | |
5 | + * Protra.Lib/Update/YahooFinanceUpdator (YahooFinanceUpdator): 正規表現を更新 | |
6 | + * Protra.Lib/Update/YahooFinanceUpdator (YahooFinanceUpdator.GetPage): 新URLから日経平均を取れないのを直す | |
7 | + | |
8 | +2022-04-16 panacoran <panacoran@users.osdn.me> | |
9 | + | |
3 | 10 | 東証の市場区分見直しに対応する |
4 | 11 | |
5 | 12 | * Protra.Lib/Data/BrandData.cs (Market): 新市場区分を追加 |
@@ -182,11 +182,21 @@ | ||
182 | 182 | |
183 | 183 | private FetchResult.Status GetPage(string code, DateTime begin, DateTime end, out string page) |
184 | 184 | { |
185 | - string codeString = code; | |
186 | - if (code == "1001" || code == "1002") | |
187 | - codeString = code == "1001" ? "998407.O" : "998405.T"; | |
185 | + string codeString; | |
186 | + switch (code) | |
187 | + { | |
188 | + case "1001": | |
189 | + codeString = "998407.O"; | |
190 | + break; | |
191 | + case "1002": | |
192 | + codeString = "998405.T"; | |
193 | + break; | |
194 | + default: | |
195 | + codeString = code + ".T"; | |
196 | + break; | |
197 | + } | |
188 | 198 | var oldUrl = $"https://info.finance.yahoo.co.jp/history/?code={codeString}&sy={begin.Year}&sm={begin.Month}&sd={begin.Day}&ey={end.Year}&em={end.Month}&ed={end.Day}&tm=d"; |
189 | - var url = $"https://finance.yahoo.co.jp/quote/{codeString}.T/history?from={begin:yyyyMMdd}&to={end:yyyyMMdd}&timeFrame=d&page=1"; | |
199 | + var url = $"https://finance.yahoo.co.jp/quote/{codeString}/history?from={begin:yyyyMMdd}&to={end:yyyyMMdd}&timeFrame=d&page=1"; | |
190 | 200 | retry: |
191 | 201 | var dl = new DownloadUtil(url); |
192 | 202 | page = null; |
@@ -230,13 +240,15 @@ | ||
230 | 240 | } |
231 | 241 | |
232 | 242 | private static readonly Regex Valid = new Regex( |
233 | - @"<tr[^>]*><th[^>]*>(?<year>\d{4})年(?<month>1?\d)月(?<day>\d?\d)日<\/th><td[^>]+>(?:<span[^>]+>)+(?<open>[0-9,.]+)<\/span>.*?<\/td><td[^>]+>(?:<span[^>]+>)+(?<high>[0-9,.]+)<\/span>.*?<\/td><td[^>]+>(?:<span[^>]+>)+(?<low>[0-9,.]+)<\/span>.+?<\/td><td[^>]+>(?:<span[^>]+>)+(?<close>[0-9,.]+)<\/span>.+?<\/td>(?:<td.*?>(?<volume>[0-9,.]+)<\/span>.+?<\/td>)?<\/tr>", | |
243 | + @"<tr[^>]*><t[hd][^>]*>(?<year>\d{4})年(?<month>1?\d)月(?<day>\d?\d)日<\/t[hd]><td[^>]+>(?:<span[^>]+>)+(?<open>[0-9,.]+)(?:<\/span>)+<\/td><td[^>]+>(?:<span[^>]+>)+(?<high>[0-9,.]+)(?:<\/span>)+<\/td><td[^>]+>(?:<span[^>]+>)+(?<low>[0-9,.]+)(?:<\/span>)+<\/td><td[^>]+>(?:<span[^>]+>)+(?<close>[0-9,.]+)(?:<\/span>)+<\/td>(?:<td[^>]+>(?:<span[^>]+>)+(?<volume>[0-9,.]+)(?:<\/span>)+<\/td>.+?<\/td>)?<\/tr>", | |
234 | 244 | RegexOptions.Compiled); |
235 | 245 | |
236 | 246 | private static readonly Regex NoData = new Regex("時系列情報がありません"); |
237 | 247 | |
238 | 248 | private static readonly Regex ValidOld = new Regex( |
239 | - @"<td>(?<year>\d{4})年(?<month>1?\d)月(?<day>\d?\d)日</td><td>(?<open>[0-9,.]+)</td><td>(?<high>[0-9,.]+)</td><td>(?<low>[0-9,.]+)</td><td>(?<close>[0-9,.]+)</td>(?:<td>(?<volume>[0-9,]+)</td>)?", RegexOptions.Compiled); | |
249 | + @"<td>(?<year>\d{4})年(?<month>1?\d)月(?<day>\d?\d)日</td>" + | |
250 | + "<td>(?<open>[0-9,.]+)</td><td>(?<high>[0-9,.]+)</td><td>(?<low>[0-9,.]+)</td>" + | |
251 | + "<td>(?<close>[0-9,.]+)</td>(?:<td>(?<volume>[0-9,]+)</td>)?", RegexOptions.Compiled); | |
240 | 252 | |
241 | 253 | private static readonly Regex NoDataOld = new Regex("該当する期間のデータはありません。<br>期間をご確認ください。"); |
242 | 254 |