Пример #1
0
        public static void ParsBlankPage(int alfa, string blank_kod, string last_page, string numb_of_pursase, string main_status, string full_addr)
        {
            using (UserContext db = new UserContext())
            {
                HtmlParser blankpars = new HtmlParser();
                var        blank     = blankpars.ParseDocument(blank_kod);

                // создаем все объекты
                Consumer     consumer     = new Consumer();     // покупатель
                TypePurshase typePurshase = new TypePurshase(); // тип закупки
                Status       status       = new Status();       // статус закупки
                Purchase     purchase     = new Purchase();     // основная карточка - закупка
                Lot          lot          = new Lot();          // лот

                //=========работаем с покупателем===================================

                consumer.name   = blank.QuerySelector($"body > div.wrap > div > div:nth-child({4 + alfa}) > table > tbody > tr:nth-child(1) > td").InnerHtml;
                consumer.adress = blank.QuerySelector($"body > div.wrap > div > div:nth-child({4 + alfa}) > table > tbody > tr:nth-child(2) > td").InnerHtml;
                consumer.unp    = blank.QuerySelector($"body > div.wrap > div > div:nth-child({4 + alfa}) > table > tbody > tr:nth-child(3) > td").InnerHtml;

                var unicCon = db.Consumers.FirstOrDefault(p => p.unp == consumer.unp); // исключаем прасинг дубликатов (при повторном парсинге)

                if (unicCon == null)
                {
                    db.Consumers.Add(consumer);
                    db.SaveChanges();
                }

                //===========работаем с типами закупок====================================
                typePurshase.type_of_purshase = blank.QuerySelector("body > div.wrap > div > div:nth-child(3) > table > tbody > tr:nth-child(1) > td").InnerHtml;

                var unicType = db.TypePurshases.FirstOrDefault(p => p.type_of_purshase == typePurshase.type_of_purshase); // исключаем прасинг дубликатов (при повторном парсинге)

                if (unicType == null)
                {
                    db.TypePurshases.Add(typePurshase);
                    db.SaveChanges();
                }

                //====================работаем со статусами==================================

                status.status = main_status;

                var unicStat = db.Statuses.FirstOrDefault(p => p.status == status.status); // исключаем прасинг дубликатов (при повторном парсинге) - сделать отдельный статический метод для всех
                if (unicStat == null)
                {
                    db.Statuses.Add(status);
                    db.SaveChanges();
                }

                //=============== если основные таблицы не пишут в базу, то подбрасываем первичные ключи из этих баз, для связи =======
                var temp_coms_id = db.Consumers.FirstOrDefault(p => p.unp == consumer.unp);                                   // подхватываем id организации, что бы отдать заказу
                var temp_type_id = db.TypePurshases.FirstOrDefault(p => p.type_of_purshase == typePurshase.type_of_purshase); // подхватываем id типа закупок, что бы отдать заказу
                var temp_stat_id = db.Statuses.FirstOrDefault(p => p.status == status.status);                                // привязка к статусам

                //===========работаем с корточкой закупок====================================

                purchase.num_purhchase    = numb_of_pursase;
                purchase.name_of_purchase = blank.QuerySelector("body > div.wrap > div > div:nth-child(3) > table > tbody > tr:nth-child(2) > td").InnerHtml;
                purchase.start_date       = DateTime.Parse(blank.QuerySelector($"body > div.wrap > div > div:nth-child({5 + alfa}) > table > tbody > tr:nth-child(1) > td").InnerHtml);
                purchase.end_date         = DateTime.Parse(blank.QuerySelector($"body > div.wrap > div > div:nth-child({5 + alfa}) > table > tbody > tr:nth-child(2) > td").InnerHtml);
                var    cost = blank.QuerySelector($"body > div.wrap > div > div:nth-child({5 + alfa}) > table > tbody > tr:nth-child(3) > td").InnerHtml;
                double value; // переконвертируем строку с ценой в double
                if (cost.Contains("."))
                {
                    double.TryParse(string.Join("", cost.Where(c => char.IsDigit(c))), out value);
                    value = value / 100.00;
                }
                else
                {
                    double.TryParse(string.Join("", cost.Where(c => char.IsDigit(c))), out value);
                }
                purchase.cost             = value;
                purchase.contact          = blank.QuerySelector($"body > div.wrap > div > div:nth-child(4) > table > tbody > tr:nth-child({4 - alfa}) > td").InnerHtml;
                purchase.link             = full_addr;
                purchase.ConsumerID       = temp_coms_id.id;
                purchase.TypeOfPurshaseID = temp_type_id.id;
                purchase.StatusID         = temp_stat_id.id;

                var unicPursh = db.Purchases.FirstOrDefault(p => p.num_purhchase == purchase.num_purhchase); // исключаем прасинг дубликатов (при повторном парсинге)

                if (unicPursh == null)
                {
                    db.Purchases.Add(purchase);
                    try
                    {
                        db.SaveChanges();
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("Ошибка записи в базу данных.");
                    }
                }

                //===========работаем с лотами====================================

                int num_lot = blank.QuerySelector("#lotsList > tbody").ChildElementCount;// парсим количество лотов

                for (int j = 1; j <= num_lot; j = j + 2)
                {
                    lot.numlot            = Convert.ToInt32(blank.QuerySelector($"#lotsList > tbody > tr:nth-child({j}) > th").InnerHtml);
                    lot.description       = blank.QuerySelector($"#lotsList > tbody > tr:nth-child({j}) > td.lot-description").InnerHtml;
                    lot.delivery_date     = blank.QuerySelector($"#lot-inf-{lot.numlot} > td:nth-child(3) > ul:nth-child(1) > li:nth-child(1) > span").InnerHtml;
                    lot.place_of_delivery = blank.QuerySelector($"#lot-inf-{lot.numlot} > td:nth-child(3) > ul:nth-child(1) > li:nth-child(2) > span").InnerHtml;
                    lot.source_of_financ  = blank.QuerySelector($"#lot-inf-{lot.numlot} > td:nth-child(3) > ul:nth-child(1) > li:nth-child(3) > span").InnerHtml;
                    lot.payment_method    = blank.QuerySelector($"#lot-inf-{lot.numlot} > td:nth-child(3) > ul:nth-child(1) > li:nth-child(4) > span").InnerHtml;
                    lot.price_quantity    = blank.QuerySelector($"#lotsList > tbody > tr:nth-child({j}) > td.lot-count-price").InnerHtml;
                    lot.lot_status        = blank.QuerySelector($"#lotsList > tbody > tr:nth-child({j}) > td.lot-status > span").InnerHtml;
                    lot.purshaseID        = purchase.id;

                    var tempOKRB = blank.QuerySelector($"#lot-inf-{lot.numlot} > td:nth-child(3) > ul:nth-child(1) > li:nth-child(5) > b").InnerHtml;
                    if (tempOKRB == "Код предмета закупки по ОКРБ:")
                    {
                        lot.kodOKRB = blank.QuerySelector($"#lot-inf-{lot.numlot} > td:nth-child(3) > ul:nth-child(1) > li:nth-child(5) > span").InnerHtml;
                    }
                    else
                    {
                        lot.kodOKRB = blank.QuerySelector($"#lot-inf-{lot.numlot} > td:nth-child(3) > ul:nth-child(1) > li:nth-child(6) > span").InnerHtml;
                    }

                    var unic = db.Lots.FirstOrDefault(p => p.description == lot.description);
                    if (unic == null)
                    {
                        db.Lots.Add(lot);
                        db.SaveChanges();
                    }
                }
            }
        }
Пример #2
0
        public static int ParsPage(string page) // парсинг всей страницы закупки
        {
            using (UserContext db = new UserContext())
            {
                int mun = 0;

                string main_Site = "https://goszakupki.by";

                HtmlParser Hpars = new HtmlParser();
                var        doc   = Hpars.ParseDocument(page); // получаем исходник страницы

                List <string> links     = new List <string>();
                string        full_addr = "";

                int num_tags = doc.QuerySelector("table.table.table-hover > tbody").ChildElementCount; // узнаем количество записей на странице

                for (int i = 1; i <= num_tags; i++)                                                    // поменять цифру на num_tags
                {
                    // общие переменные
                    string last_page       = doc.QuerySelector($"#w0 > table > tbody > tr:nth-child({i}) > td:nth-child(2) > a").OuterHtml; // в первой скобке номер элемента на странице .. в цикле меняем именно его... вывод на странице 20 элементов.
                    string numb_of_pursase = doc.QuerySelector($"#w0 > table > tbody > tr:nth-child({i}) > td:nth-child(1)").InnerHtml;     // вырезаем номер закупки
                    string main_status     = doc.QuerySelector("#w0 > table > tbody > tr:nth-child(1) > td:nth-child(4) > span").InnerHtml; // статус с общей страницы карточек закупок
                    //===============================создаем ссылку на карточку =======================
                    // составляем ссылку
                    int indexOfChar     = last_page.IndexOf("\"") + 1; //номер первого вхождения двойных ковычек
                    int lastindexOfChar = last_page.LastIndexOf("\""); //номер последнего вхождения двойных ковычек
                    last_page = last_page.Substring(indexOfChar);
                    int    NextindexOfChar = last_page.IndexOf("\"");
                    string temp            = last_page.Substring(0, NextindexOfChar);
                    full_addr = main_Site + temp;// конкатенация и вывод полного адреса страницы-карточки закупки.

                    // ==================================================
                    // обработка карточки

                    string blank_kod = GetPage(full_addr);

                    if (blank_kod != "") // если ошибка доступа к странице то пропускаем парсинг.
                    {
                        HtmlParser blankpars = new HtmlParser();
                        var        blank     = blankpars.ParseDocument(blank_kod);

                        var a = blank.QuerySelector("body > div.wrap > div").InnerHtml; // закинули в а код страницы, его и будем обрабатывать

                        //=========================== ПАРСИНГ ДАННЫХ С КАРТОЧКИ В БАЗУ ДАННЫХ =====================================

                        //есть два типа карточек в организатором и без - различаются кодом страниц
                        var flag = blank.QuerySelector("body > div.wrap > div > div:nth-child(4) > div > b").InnerHtml;

                        if (flag == "Сведения о заказчике")
                        {
                            ParsBlankPage(0, blank_kod, last_page, numb_of_pursase, main_status, full_addr);
                        }
                        else
                        {
                            ParsBlankPage(1, blank_kod, last_page, numb_of_pursase, main_status, full_addr);
                        }

                        mun++; // СЧИТАЕМ ОБРАБОТАННЫЕ КАРТОЧКИ
                    }
                }
                return(mun);
            }
        }
Пример #3
0
 public MainWindow()
 {
     InitializeComponent();
     db = new UserContext();
 }