void ParseFromPage(GasStation station, String html) { var htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(html); var h2 = htmlDoc.DocumentNode.SelectSingleNode(".//h2"); if (h2 == null) return; station.Name = h2.InnerText.Replace("Информация об", "").Trim(); var div = htmlDoc.DocumentNode.SelectSingleNode(".//div[@style='max-width: 550px;']"); foreach (var tr in div.SelectNodes(".//tr")) { var nameTr = tr.FirstChild.InnerText.Trim(); var valueTr = tr.LastChild; if ( nameTr.Contains("Компания/бренд") ) station.Brand = valueTr.SelectSingleNode(".//a").InnerText; else if (nameTr.Contains("Адрес")) station.Address = valueTr.InnerText; else if (nameTr.Contains("Топливо")) { int flag = 0; var fuel = valueTr.InnerText; if (fuel.Contains("пропан")) flag += 1; if (fuel.Contains("метан")) flag += 2; if (flag == 1) station.FuelType = "Пропан/бутан"; else if (flag == 2) station.FuelType = "Метан"; else if (flag == 3) station.FuelType = "Пропан/бутан и метан"; break; } else if (nameTr.Contains("Доп. услуги")) station.Service = valueTr.InnerText; } }
List<GasStation> GetStations(List<String> stationUrls) { var stations = new ConcurrentQueue<GasStation>(); var tasks = new List<Task>(); try { var i = 0; foreach (var url in stationUrls.Take(3)) { tasks.Add(Task.Run(() => { var html = Get(url); var station = new GasStation(){ Url = url }; ParseFromPage(station, html); stations.Enqueue(station); Logger.Instance.Info(String.Format("{0}/{1} загружена информация о заправке {2}", ++i, stationUrls.Count, url)); })); } Task.WaitAll(tasks.ToArray()); } catch (NoAvaliableProxiesException) { Logger.Instance.Error("Закончились свободные прокси, добывание url станций прекращено"); } catch (Exception ex) { Logger.Instance.Error("Неизвестная ошибка, добывание станций прекращено " + ex.ToString()); } return stations.ToList(); }