//--------------------------- 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; }
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; } } }