//---------------------------
        public int NStartProcessingAuthentification(int jobID)
        {
            int status = 0;

            //Пишем последнюю страницу в файл
            //Создается каталог для контроля считанной странички
            /*DirectoryInfo _directoryInfo = new DirectoryInfo(Path.GetDirectoryName(Application.ExecutablePath) + "\\OUT");
            if (!_directoryInfo.Exists)
            {
                _directoryInfo.Create();
            }*/

            HTTPClient client = new HTTPClient(_dbConnectionString, "MySession", _ipProxy, _portProxy, _streamNumber); ;
            bool nextPage = true;
            string sHTML = "";
            string address = "";
            string message = "";
            HtmlDocument document = new HtmlDocument();
            if (!_webAuthentification) // Аунтификация
            {
                HttpWebResponse httpWebResponse = client.Request(_webPreAuthentificationAddress); //("http://yarsk24.ru");
                if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.OK)
                {
                    httpWebResponse.Close();
                    httpWebResponse = client.Request_Post(_webAuthentificationAddress, _webConnectionString); //("http://yarsk24.ru/index/sub/", "user=zero2001&password=2001&rem=1&a=2&ajax=1&rnd=038&_tp_=xml");
                    if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.OK)
                    {
                        Stream stream = httpWebResponse.GetResponseStream();
                        using (StreamReader reader = new StreamReader(stream, this.Encoding)) //System.Text.Encoding.GetEncoding(1251))) / System.Text.Encoding.UTF8
                        {
                            sHTML = reader.ReadToEnd();
                        }
                        if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.OK)
                        {
                            httpWebResponse.Close();
                            _webAuthentification = true;
                        }
                        else
                        {
                            address = _webAuthentificationAddress;
                            message = httpWebResponse.StatusCode.ToString();
                            status = 8;
                        }
                    }
                    else
                    {
                        address = _webAuthentificationAddress;
                        message = httpWebResponse.StatusCode.ToString();
                        status = 7;
                    }
                }
                else
                {
                    address = _webPreAuthentificationAddress;
                    message = httpWebResponse.StatusCode.ToString();
                    status = 6;
                }
            }
            if (status != 0)
            {
                DataDBService ddbs = new DataDBService();
                ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, !string.IsNullOrEmpty(address) ? address : _webAuthentificationAddress, "Ошибка при прохождении аутентификации: " + message);
            }
            if (_webAuthentification) // Запрос страницы с количеством объявлений
            {
                HttpWebResponse httpWebResponse = client.Request(_startAddress);
                if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.OK)
                {
                    Stream stream = httpWebResponse.GetResponseStream();
                    using (StreamReader reader = new StreamReader(stream, this.Encoding))
                    {
                        sHTML = reader.ReadToEnd();
                        document = new HtmlDocument();
                        document.LoadHtml(sHTML);
                        if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.OK)
                        {
                            httpWebResponse.Close();
                            document.Save(_directoryInfo + "\\LastPage" + _streamNumber.ToString() + ".html");
                        }
                        else
                        {
                            status = 4;
                            nextPage = false;
                        }
                    }
                }
                else
                {
                    status = 10;
                    nextPage = false;
                }
            }


            if (_webAuthentification && nextPage) // Цикл по страницам
            {
                int countPagesTotal = GetPageCount(document, _startAddress);
                if (countPagesTotal > 0)
                {

                    for (int i = 0; i < countPagesTotal; i++)
                    {
                        status = 1;
                        if (i + 1 >= _firstPage)
                        {
                            List<bool> valids;
                            List<string> addresses;
                            List<string> stickers;

                            //Получаем страницу для обработки
                            string currentAddress = GetLoadedPage(_startAddress, i);

                            if (_lastAddress != currentAddress)
                            {
                                _lastAddress = currentAddress;
                                // Запрос страницы с количеством объявлений
                                document = null;
                                HttpWebResponse httpWebResponse = client.Request(_lastAddress);
                                if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.OK)
                                {
                                    Stream stream = httpWebResponse.GetResponseStream();
                                    using (StreamReader reader = new StreamReader(stream, this.Encoding))
                                    {
                                        sHTML = reader.ReadToEnd();
                                        document = new HtmlDocument();
                                        document.LoadHtml(sHTML);
                                        if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.OK)
                                            httpWebResponse.Close();
                                        else { }
                                    }
                                }

                                if (document != null)
                                {
                                    document.Save(_directoryInfo + "\\LastPage" + _streamNumber.ToString() + ".html");
                                    //Получаем список интересных объявлений
                                    valids = GetValidObjects(document);

                                    //Получаем список ссылок на странице
                                    addresses = GetAddressList(document, valids);

                                    //Получаем список стикеров на странице
                                    stickers = GetStickers(document, valids);
                                    //------------------------------------
                                    if (valids != null && (addresses != null || stickers != null))
                                    {
                                        System.Threading.Thread.Sleep(new Random().Next(1000, 3000));

                                        string hostName = Dns.GetHostName();
                                        if (InsertIntoAddressesUpload(addresses, stickers, jobID, hostName))
                                        {
                                            bool bb = false;
                                            while (!bb)
                                            {

                                                if (IUDAdressesMask(hostName, jobID))
                                                {

                                                    nextPage = NSetJobState(jobID, i + 1, countPagesTotal, addresses.Count, jobID, document);
                                                    if (!nextPage)
                                                    {
                                                        DataDBExtention ddbe = new DataDBExtention();
                                                        ddbe.NSetStatistics(jobID, _dbConnectionString, hostName, _streamNumber);
                                                    }


                                                    //if (valids == null || addresses == null || stickers == null)
                                                    //{
                                                    //    status = 3;
                                                    //    break;
                                                    //}
                                                    bb = true;
                                                }
                                                else
                                                    System.Threading.Thread.Sleep(new Random().Next(100, 300));
                                                //else
                                                //{
                                                //    nextPage = NSetJobState(jobID, i + 1, countPagesTotal, 0, jobID, document);
                                                //    //если что-то, то все равно идем дальше
                                                //    ////может брейк постаивть. например, если таймаут вышел и запрос вывалился
                                                //    ////или оставить как есть и припоследующих запусках оно само заберет неотданные ссылки
                                                //}
                                            }
                                        }
                                        //тут надо отписываться, что он спарсил и сколько ссылок
                                    }
                                    else
                                    {
                                        status = 3;
                                        break;
                                    }

                                    // Досрочный выход из цикла по страницам
                                    // Достигнуто заданное количество страниц
                                    if (i + 1 >= _firstPage - 1 + _pageCount || !nextPage)
                                    {
                                        break;
                                    }
                                    // Исчерпано время (в часах)
                                    DateTime dateTime = DateTime.Now;
                                    if ((dateTime.Year - _dateTimeBegin.Year) * 365 * 24
                                      + (dateTime.DayOfYear - _dateTimeBegin.DayOfYear) * 24
                                       + dateTime.Hour - _dateTimeBegin.Hour
                                        > _timeInHours)
                                    {
                                        status = 2;
                                        break;
                                    }
                                    //----------------------------------------
                                    //    //Обрабатываем каждую ссылку и выбираем необходимую информацию
                                    //    List<DirtyApartments> apartments = CardProcessingAuthentification(addresses, stickers, client);
                                    //    if (apartments != null)
                                    //    {
                                    //        //Делегат
                                    //        if (collectedApartmentsDel != null)
                                    //            nextPage = collectedApartmentsDel(apartments, i + 1, countPagesTotal, _directoryInfo + "\\LastPage" + _streamNumber.ToString() + ".html");
                                    //        // Досрочный выход из цикла по страницам
                                    //        // Достигнуто заданное количество страниц
                                    //        if (i + 1 >= _firstPage - 1 + _pageCount || !nextPage)
                                    //        {
                                    //            break;
                                    //        }
                                    //        // Исчерпано время (в часах)
                                    //        DateTime dateTime = DateTime.Now;
                                    //        if ((dateTime.Year - _dateTimeBegin.Year) * 365 * 24
                                    //          + (dateTime.DayOfYear - _dateTimeBegin.DayOfYear) * 24
                                    //           + dateTime.Hour - _dateTimeBegin.Hour
                                    //            > _timeInHours)
                                    //        {
                                    //            status = 2;
                                    //            break;
                                    //        }

                                    //        if (valids == null || addresses == null || stickers == null)
                                    //        {
                                    //            status = 3;
                                    //            break;
                                    //        }
                                    //    }
                                    //    else
                                    //    {
                                    //        status = 16;
                                    //        break;
                                    //    }
                                }
                                else
                                {
                                    status = 4;
                                    break;
                                }
                            }
                            else
                            {
                                status = 5;
                                break;
                            }
                        }
                    }
                }
                else
                    status = 9;
            }
            else { }
            return status;
        }
        //---------------------------

        public int NStartProcessingDirect(int jobID)
        {
            int status = 0;
            bool nextPage = true;
            HtmlDocument document = WebClientPage();


            if (document != null)
            {
                int addressescount = 0;
                int maxi = 0;
                try
                {
                    int countPagesTotal = GetPageCount(document, _startAddress);
                    if (countPagesTotal > 0)
                    {
                        for (int i = 0; i < countPagesTotal; i++)
                        {
                            maxi = i;
                            status = 1;
                            if (i + 1 >= _firstPage)
                            {
                                List<bool> valids;
                                List<string> addresses;
                                List<string> stickers;

                                //Получаем страницу для обработки
                                string currentAddress = GetLoadedPage(_startAddress, i);

                                if (_lastAddress != currentAddress)
                                {
                                    _lastAddress = currentAddress;
                                    try
                                    {
                                        // Запрос страницы с количеством объявлений
                                        if (currentAddress != _startAddress)
                                            document = WebClientPage(new WebClient(), _lastAddress);

                                        if (document != null)
                                        {
                                            //Получаем список интересных объявлений
                                            valids = GetValidObjects(document);

                                            //Получаем список ссылок на странице
                                            addresses = GetAddressList(document, valids);

                                            //Получаем список стикеров на странице
                                            stickers = GetStickers(document, valids);

                                            if (valids != null && (addresses != null || stickers != null))
                                            {
                                                if (valids.Count > 0 && addresses.Count == stickers.Count) //|| (addresses.Count > 0 && stickers.Count > 0 && addresses.Count == stickers.Count))
                                                {
                                                    System.Threading.Thread.Sleep(new Random().Next(1000, 4000));

                                                    string hostName = Dns.GetHostName();

                                                    //--проверка заинсертилось ли AddressesMaskUpload
                                                    bool ifInsert = InsertIntoAddressesUpload(addresses, stickers, jobID, hostName);
                                                    int iK = 0;
                                                    while (!ifInsert && iK < 5)
                                                    {
                                                        iK++;
                                                        System.Threading.Thread.Sleep(new Random().Next(5000, 10000));
                                                        ifInsert = InsertIntoAddressesUpload(addresses, stickers, jobID, hostName);
                                                    }

                                                    //-------

                                                    if (ifInsert)
                                                    {
                                                        bool bb = false;
                                                        while (!bb)
                                                        {

                                                            if (IUDAdressesMask(hostName, jobID))
                                                            {
                                                                addressescount = addresses.Count;
                                                                nextPage = NSetJobState(jobID, i + 1, countPagesTotal, addresses.Count, jobID, document);
                                                                if (!nextPage)
                                                                {
                                                                    DataDBExtention ddbe = new DataDBExtention();
                                                                    ddbe.NSetStatistics(jobID, _dbConnectionString, hostName, _streamNumber);
                                                                    //помечаем удаленными ссылки
                                                                    ddbe.NSetDeletedAddresses(jobID, _dbConnectionString);
                                                                    //возвращаем из удаленных ссылок
                                                                    //ddbe.NSetUnDeletedAddresses(jobID, _dbConnectionString);
                                                                    //03/090/14 убрала. deleted снимаю во время обновления даты последней загрузки ссылки
                                                                }
                                                                bb = true;
                                                            }
                                                            else
                                                                System.Threading.Thread.Sleep(new Random().Next(100, 300));
                                                        }
                                                    }
                                                    //тут надо отписываться, что он спарсил и сколько ссылок
                                                }
                                                else
                                                {
                                                    DataDBService ddbs = new DataDBService();
                                                    ddbs.WriteErrorMessage(_dbConnectionString, 0, _lastAddress, "Ахтунг. Стикеры/ссылки. jobID=" + jobID + ". ссылок - " + addresses.Count + ", стикеров - " + stickers.Count + ", valids - " + valids.Count + ". Document: " + document.DocumentNode.InnerHtml);
                                                    //если раскомментить, то парсер останавливается и больше не работает
                                                    //return status = 17; 

                                                }
                                            }
                                            else
                                            {
                                                status = 3;
                                                break;
                                            }

                                            // Досрочный выход из цикла по страницам
                                            // Достигнуто заданное количество страниц
                                            if (i + 1 >= _firstPage - 1 + _pageCount || !nextPage)
                                            {
                                                break;
                                            }
                                            // Исчерпано время (в часах)
                                            DateTime dateTime = DateTime.Now;
                                            if ((dateTime.Year - _dateTimeBegin.Year) * 365 * 24
                                              + (dateTime.DayOfYear - _dateTimeBegin.DayOfYear) * 24
                                               + dateTime.Hour - _dateTimeBegin.Hour
                                                > _timeInHours)
                                            {
                                                status = 2;
                                                break;
                                            }
                                        }
                                        else
                                        {
                                            status = 4;
                                            break;
                                        }
                                    }
                                    catch { }
                                    finally
                                    {

                                        if (document != null)
                                            GC.SuppressFinalize(document);
                                    }
                                }
                                else
                                {
                                    status = 5;
                                    break;
                                }
                            }
                        }
                    }
                    else
                        status = 9;
                }
                catch { }
                finally
                {
                    NSetJobState(jobID, maxi + 1, maxi + 1, addressescount, jobID, document);
                    if (document != null)
                        GC.SuppressFinalize(document);
                }
            }
            else
            {
                NSetJobState(jobID, 0, 0, 0, jobID, null);
                status = 10;
            }

            return status;

        }
Beispiel #3
0
        private bool SetJobToStartOrStop(bool start)
        {
            // имя хоста
            string hostName = Dns.GetHostName();
            string ipAddress = "";

            // IP хоста
            IPHostEntry ipEntry = Dns.GetHostEntry(hostName);
            IPAddress[] addr = ipEntry.AddressList;

            for (int i = 0; i < addr.Length; i++)
            {
                ipAddress = ipAddress + addr[i].ToString() + ";";
            }
            ipAddress = ipAddress.Substring(0, ipAddress.Length - 1);

            // текущие дата и время
            DateTime dateTime = DateTime.Now; //new DateTime();
            //string date = dateTime.Date.ToString("dd.MM.yyyy");
            //string time = dateTime.ToString("HH:mm:ss");
            string dt = dateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");

            using (DataDBService ddbs = new DataDBService())
            {
                if (_numberOfRestart <= _allowRestarts)
                {

                    //версия на 26.11 для того чтобы при рестарте задачи мы не зануляли количество спарсенных ссылок 
                    //и не перезаписывали дату начала парсинга задачи - позволит не потерять новые и обновленные ссылки
                    string SQLstr = "UPDATE PJobUpdate SET "
                            + "  StartType=1"
                            + " ,Busy=" + (start ? 1 : 0).ToString()
                            + (!start ? ",Host = ''" : " ,Host = '" + hostName + "'")
                            + (!start ? ",IP = ''" : " ,IP = '" + ipAddress + "'")
                            + (!start ? " ,ServiceMessage= 'отработал +" + _parserName + " " + _streamNumber.ToString() + " " + dt + "'"
                                      : " ,ServiceMessage= 'стартовал +" + _parserName + " " + _streamNumber.ToString() + " " + dt + "'")
                            + (start ? " ,Start=0" : "")
                            + (start ? " ,NumberOfRestart=isnull(NumberOfRestart,0)+1" : "")
                            + (start ? " ,LastDocument=''" : "")
                            + (start ? (_numberOfRestart > 0 ? "" : " ,CurrentPage=0") : "")
                            + (start ? " ,CountPagesTotal=0" : "")
                        //+ (start ? (_numberOfRestart > 0 ? "" : " ,CountAnnouncement=0") : "")
                            + (start ? (_numberOfRestart > 0 ? (_firstPage == 1 ? " ,CountAnnouncement=0" : "") : " ,CountAnnouncement=0") : "")
                            + (start ? " ,Complete=0" : "")
                            + (start ? " ,ParserStatus=0" : "")
                            + (start ? (_numberOfRestart > 0 ? "" : " ,DateBegin='" + dt + "'") : "")
                            + (start ? " ,LastDate='" + dt + "'" : "")
                            + "  Where ID = " + _ID.ToString();

                    string s2 = ddbs.ExecuteSQLCommand(SQLstr, _dbConnectionString);
                    //DataSet ds = ddbs.CreateCommandAndUpdate(SQLstr, _dbConnectionString);
                    if (!string.IsNullOrEmpty(s2))
                        ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Ошибка старта/остановки парсинга из-за ошибки записи задания. "
                            + _parserName + " " + _sourceDescription + ". " + s2);
                    if (_numberOfRestart + 1 > _allowRestarts)
                    {
                        if (!start)
                        {
                            //если превышено количество рестартов. пишем в статистику
                            DataDBExtention ddbe = new DataDBExtention();
                            ddbe.NSetStatistics(_ID, _dbConnectionString, hostName, _streamNumber);

                            ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Ошибка старта/остановки парсинга из-за превышения заданного количества рестартов "
                            + _parserName + " " + _sourceDescription + ".");
                        }
                        return false;
                    }
                    return (string.IsNullOrEmpty(s2) ? true : false);
                }
                else // такое не случится, если не будет нарушена логика обработки
                {
                    ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Ошибка старта/остановки парсинга из-за превышения заданного количества рестартов "
                    + _parserName + " " + _sourceDescription + ".");
                    return false;
                }
            }
        }