public emitent GetEmitentData(string idemitent) //получение ИНН эмитента { emitent Emit = new emitent(); string XP = "http://www.rusbonds.ru/ank_org.asp?emit=" + idemitent; //RusB = featuredArticle.GetAttributeValue("href", null); try { HtmlAgilityPack.HtmlWeb web1 = new HtmlWeb(); web1.OverrideEncoding = Encoding.GetEncoding("Windows-1251"); HtmlAgilityPack.HtmlDocument doc1 = web1.Load(XP); Emit.emit = int.Parse(idemitent); Emit.inn = 0; try { Emit.inn = ulong.Parse(doc1.DocumentNode.SelectSingleNode("/html//body/table[4]//tbody/tr[6]/td[2]").InnerText.Replace(" ", "")); } catch { if (Emit.inn == 0) { try { Emit.inn = ulong.Parse(doc1.DocumentNode.SelectSingleNode("/html//body/table[4]//tbody/tr[7]/td[2]").InnerText.Replace(" ", "")); } catch { Emit.inn = 0; } } } return(Emit); } catch { Emit.inn = 0; Console.WriteLine("the page of Emitent not found"); return(Emit); } }
/// <summary> /// Главный метод класса. Возвращает массив структур с заполненными данными по каждому эмитенту в нём. /// <returns>Возвращает массив emitent[].</returns> /// </summary> public emitent[] Start() { // определяет кол-во страниц в мультистраничном гриде веб страницы int PageCounter = this.GetPageCounter("http://www.rusbonds.ru/srch_emitent.asp?emit=0&cat=0&rg=0&rate=0&stat=0&go=0&s=5&d=0&p=1#rslt1#rslt"); // определяет кол-во строк на каждой странице грида int RowCounter = this.GetRowCounter("http://www.rusbonds.ru/srch_emitent.asp?emit=0&cat=0&rg=0&rate=0&stat=0&go=0&s=5&d=0&p=1#rslt"); //определение масива структур , его размера (общее количесто эмитентов) emitent[] EmitentArrayToReturn = new emitent[RowCounter * PageCounter]; // определяем начальные значения для дальнейшей итерации по многостраничному гриду и массиву эимтентов int CurrentPageIndex = 1; int CurrentRowIndex = 1; int ArrayCurrentElementIndex = 0; // будущий итератор для EmitentArrayToReturn #if DEBUG CurrentPageIndex = 1; #endif //выгрузка данных из таблицы постранично и построчно из каждой страницы грида do { try { HtmlWeb CurrentHTMLPage = new HtmlWeb { OverrideEncoding = Encoding.GetEncoding("Windows-1251") }; // получает веб страницу с гридом для парсинга HtmlAgilityPack.HtmlDocument CurrentHTMLPageAsDoc = CurrentHTMLPage.Load("http://www.rusbonds.ru/srch_emitent.asp?emit=0&cat=0&rg=0&rate=0&stat=0&go=0&s=5&d=0&p=" + CurrentPageIndex + "#rslt"); do { foreach (HtmlNode row in CurrentHTMLPageAsDoc.DocumentNode.SelectNodes("/html/body/div[1]/table[2]/tbody/tr[" + CurrentRowIndex + "]")) { if (row != null) { #if DEBUG Console.WriteLine(ArrayCurrentElementIndex + "\t" + Math.Round(((double)ArrayCurrentElementIndex / ((double)RowCounter * (double)PageCounter)) * 100, 2) + "%\tof " + RowCounter * PageCounter); #endif //получает из строки грида ссылку на эмитент вида "http://www.rusbonds.ru/ank_org.asp?emit=78881" HtmlNode mhref = row.SelectSingleNode("td[2]/a"); string emithref = mhref.GetAttributeValue("href", null); EmitentArrayToReturn[ArrayCurrentElementIndex] = this.GetEmitentData(emithref); CurrentRowIndex++; } } ArrayCurrentElementIndex++; } //проверка конца массива строк на странице - условие перехода на новую страницу while (CurrentRowIndex <= RowCounter); CurrentPageIndex++; //сброс счетчика строк грида при переходе на новую страницу CurrentRowIndex = 1; } catch (Exception ex) { #if DEBUG Console.WriteLine(ex.Message + ex.TargetSite); #endif break; } }while (CurrentPageIndex != 300);//заведомо большое число страниц #if DEBUG Console.WriteLine("Total Emitent count is " + EmitentArrayToReturn.Count()); #endif #region RemoveEmptyDataFromArray // зачищаем массив перед его возвратом // критерий - присутствие 2х полей - имя эимтента не пустое и EmitentArrayToReturn = EmitentArrayToReturn.Where(CurrentEmitent => !string.IsNullOrEmpty(CurrentEmitent.Issuer)).ToArray(); #endregion #if DEBUG Console.WriteLine("Purged Emitent count is " + EmitentArrayToReturn.Count()); #endif return(EmitentArrayToReturn); }
/// <summary> /// Получение данных об эмитенте /// </summary> /// <param name="emithref">Относительный URL на странице которого находится грид с анкетой компании</param> emitent GetEmitentData(string emithref) { emitent Emit = new emitent(int.Parse(emithref.Split('=')[1])); string FullEmitentUrl = "http://www.rusbonds.ru" + emithref; try { HtmlAgilityPack.HtmlWeb web1 = new HtmlWeb(); web1.OverrideEncoding = Encoding.GetEncoding("Windows-1251"); HtmlAgilityPack.HtmlDocument doc1 = web1.Load(FullEmitentUrl); //Emit.emit = int.Parse(idemitent); HtmlNodeCollection EmitentInfo = doc1.DocumentNode.SelectNodes("/html//body/table[4]//tbody/tr"); foreach (HtmlNode node in EmitentInfo) { string swch = node.InnerText.Split(':')[0]; switch (swch) { case "Наименование": Emit.Issuer = node.InnerText.Split(':')[1]; break; case "Основной ОКВЭД": Emit.TypeOfBusiness = node.InnerText.Split(':')[1]; break; case "Страна": Emit.Country = node.InnerText.Split(':')[1]; break; case "Регион": Emit.Region = node.InnerText.Split(':')[1]; break; case "ИНН": Emit.INN = ulong.Parse(node.InnerText.Split(':')[1]); break; case "ОКПО или др.": Emit.OKPO = node.InnerText.Split(':')[1]; break; case "Данные госрегистрации": Emit.GosRegData = node.InnerText.Split(':')[1]; break; case "Юридический адрес": Emit.LowAddress = node.InnerText.Split(':')[1]; break; case "Почтовый адрес": Emit.MailingAddress = node.InnerText.Split(':')[1]; break; case "Вид собственности": Emit.TypeOfProperty = node.InnerText.Split(':')[1]; break; case "Уставный капитал": string[] U = this.GetCapital(node.InnerText.Split(':')[1]); //вытягиваем число с пробелами из уставного капитала до букв валюты Emit.CharterCapital = ulong.Parse(U[0].Replace(" ", String.Empty)); // удаляем пробелы из числа string[] V = this.Сurrency(node.InnerText.Split(':')[1]); //вытягиваем валюту из уставного капитала Emit.CharterCapitalCurrency = (V[V.Length - 1].Replace(" ", String.Empty)); // удаляем пробелы из числа break; default: break; } } return(Emit); } catch (Exception e) { #if DEBUG Console.WriteLine(e.Message + " " + FullEmitentUrl); #endif // on error just return data "as is" return(Emit); } }