private HtmlDocument GetPage(Uri site, string method, CookieContainer cookie) { HtmlDocument document = new HtmlDocument(); try { HttpWebRequest reqGET = (HttpWebRequest)WebRequest.Create(site); reqGET.UserAgent = _userAgents[new Random().Next(0, _userAgents.Count() - 1)]; reqGET.Method = method;//"GET"; // Устанавливаем метод передачи данных в POST reqGET.CookieContainer = cookie;// ; using (var result = reqGET.GetResponse()) { using (Stream stream = result.GetResponseStream()) { document.Load(stream, this.Encoding); if (stream != null) ((IDisposable)stream).Dispose(); GC.SuppressFinalize(stream); } result.Close(); GC.SuppressFinalize(result); } /*using (System.Net.HttpWebResponse result = (HttpWebResponse)reqGET.GetResponse()) { using (Stream stream = result.GetResponseStream()) { document.Load(stream, this.Encoding); if (stream != null) ((IDisposable)stream).Dispose(); GC.SuppressFinalize(stream); } result.Close(); GC.SuppressFinalize(result); }*/ GC.SuppressFinalize(reqGET); } catch (WebException we) { DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, !string.IsNullOrEmpty(site.AbsoluteUri) ? site.AbsoluteUri : _startAddress, we.Message); document = null; if (site.AbsoluteUri.Contains("avito")) Console.WriteLine("Авитоошибка1 " + we.Message); GetException = we; } catch (UriFormatException ex) { DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, !string.IsNullOrEmpty(site.AbsoluteUri) ? site.AbsoluteUri : _startAddress, "ПРОКСИ: " + ex.Message); document = null; } catch (Exception ex) { DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, !string.IsNullOrEmpty(site.AbsoluteUri) ? site.AbsoluteUri : _startAddress, "ПРОКСИ: " + ex.Message); document = null; } return document; }
public void NSetStatistics(int jobID, string dbConnectionString, string hostName, int streamNumber) { try { DataDBService ddbs = new DataDBService(); using(SqlConnection conn = ddbs.GetDBCon(dbConnectionString)) if (conn != null) { try { string sqlI = @"INSERT INTO [ParsersStatistics] ([JobID],[SourceID],[SourceDescription],[DateBegin],[DateEnd],[Complete],[NumberOfRestart],[CountAnnouncement],[NewAnnouncement],[UpdatedAnnouncement],[Host],[Stream]) SELECT top 1 " + jobID + @",s.ID, pj.SourceDescription,pj.DateBegin, case when pj.DateEnd >= pj.DateBegin then pj.DateEnd else NULL end, pj.[Complete], pj.[NumberOfRestart], pj.[CountAds], (select COUNT(a.id) from AddressesMask a left join [PJobUpdate] p on a.JobID = p.ID where a.DateLastUpload between p.DateBegin and p.DateEnd + CONVERT(TIME,'00:00:05.000',104) and p.ID = " + jobID + @" and a.DateLastUpload=a.DateFirstUpload), (select COUNT(a.id) from AddressesMask a left join [PJobUpdate] p on a.JobID = p.ID where a.DateLastUpload between p.DateBegin and p.DateEnd + CONVERT(TIME,'00:00:05.000',104) and p.ID = " + jobID + @" and a.DateLastUpload>a.DateFirstUpload),'" + hostName + "'," + streamNumber + @" FROM [PJobView] pj INNER JOIN [Sources] s on s.[Source] = pj.[Source] WHERE pj.ID = " + jobID; string sI = ddbs.ExecuteSQLCommand(sqlI, dbConnectionString); if (!string.IsNullOrEmpty(sI)) { ddbs.WriteErrorMessage(dbConnectionString, 0, null, "Ошибка добавленя записи в статистику" + "jobid = " + jobID + ". " + sI); } } finally { conn.Close(); } } } catch (Exception e) { DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(dbConnectionString, 0, null, "Ошибка в DataDBExtention.NSetStatistics." + e.ToString()); } }
//ставим метку удаленного public void NSetDeletedAddresses(int jobID, string dbConnectionString) { /* * update AddressesMask set Deleted=1 where Deleted is null and DateLastUpload<DATEADD(DAY,-5, CURRENT_TIMESTAMP) and JobID=N Где N - id'шник его джоба */ try { DataDBService ddbs = new DataDBService(); using(SqlConnection conn = ddbs.GetDBCon(dbConnectionString)) if (conn != null) { try { string sqlI = @" update AddressesMask set Deleted=1 where Deleted is null and DateLastUpload<DATEADD(DAY,-5, CURRENT_TIMESTAMP) and JobID=" + jobID; string sI = ddbs.ExecuteSQLCommand(sqlI, dbConnectionString); if (!string.IsNullOrEmpty(sI)) { ddbs.WriteErrorMessage(dbConnectionString, 0, null, "Ошибка метки deleted. " + "jobid = " + jobID + ". " + sI); } } finally { conn.Close(); } } } catch (Exception e) { DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(dbConnectionString, 0, null, "Ошибка в DataDBExtention.NSetStatistics." + e.ToString()); } }
protected bool IUDAdressesMask(string hostName, int jobID) { //из upload в адреса using(DataDBService ddbs = new DataDBService()) using(SqlConnection conn = ddbs.GetDBCon(_dbConnectionString)) try { if (conn != null) { //проставление deleted старым ссылкам с изменившимся хэшем (чтоб по 100 раз не перепарсивать) string SQLstrU0 = "update AddressesMask "+ "set Deleted = 1 "+ "where ID in "+ "( "+ " select id "+ " from AddressesMask a "+ " where a.Address>'' and Deleted is null and exists " + " ("+ " select * "+ " from AddressesMaskUpload u "+ " where u.Address = a.Address "+ " and u.Hash != a.Hash " + " AND u.Host ='" + hostName + "' AND u.StreamNumber =" + _streamNumber+ " ) " + ")"; string sU0 = ddbs.ExecuteSQLCommand(SQLstrU0, _dbConnectionString); if (!string.IsNullOrEmpty(sU0)) { ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Ошибка добавление ссылок в AddressesMask. " + "jobid = " + jobID + ". " + sU0); return false; } //insert того чего еще нет string SQLstrI = "INSERT INTO [AddressesMask] ([JobID],[Source_ref],[Address] ,[Sticker],[DateFirstUpload],[DateLastUpload],[Hash]) " + "SELECT up.[JobID],s.ID,up.[Address],up.[Sticker], up.[DateUpload], up.[DateUpload],up.[Hash] " + "FROM [AddressesMaskUpload] up " + "LEFT JOIN PjobStat pj on up.jobid = pj.ID " + "LEFT JOIN Sources s on s.Source = pj.Source " + "WHERE up.[Hash] NOT IN (SELECT a.[Hash] FROM AddressesMask a) " + "AND up.Host ='" + hostName + "' AND up.StreamNumber =" + _streamNumber; string sI = ddbs.ExecuteSQLCommand(SQLstrI, _dbConnectionString); if (!string.IsNullOrEmpty(sI)) { ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Ошибка добавление ссылок в AddressesMask. " + "jobid = " + jobID + ". " + sI); return false; } //update тех что уже есть //string SQLstrU = // "UPDATE [AddressesMask] " + // "SET DateLastUpload = up.DateUpload " + // "FROM [AddressesMaskUpload] up " + // "WHERE up.[Hash] = [AddressesMask].[Hash] " + // "AND up.Host ='" + hostName + "' AND up.StreamNumber =" + _streamNumber; string SQLstrU = "UPDATE [AddressesMask] " + "SET DateLastUpload = s.DateUpload " + "FROM (" + "select [Hash], DateUpload " + "from [AddressesMaskUpload] up " + "WHERE up.Host ='" + hostName + "' AND up.StreamNumber = " + _streamNumber + " except " + "select [Hash], DateLastUpload " + "from [AddressesMask] up " + ") s " + "where s.Hash=[AddressesMask].Hash"; string sU = ddbs.ExecuteSQLCommand(SQLstrU, _dbConnectionString); if (!string.IsNullOrEmpty(sU)) { ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Ошибка обновления времени ссылок в AddressesMask. " + "jobid = " + jobID + ". " + sU); return false; } if (string.IsNullOrEmpty(sI) && string.IsNullOrEmpty(sU)) { //delete этих строк string SQLstrD = "DELETE FROM [AddressesMaskUpload] " + "WHERE Host ='" + hostName + "' AND StreamNumber =" + _streamNumber; string sD = ddbs.ExecuteSQLCommand(SQLstrD, _dbConnectionString); if (!string.IsNullOrEmpty(sD)) { ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Ошибка удаления ссылок из AddressesMaskUpload. " + "jobid = " + jobID + ". " + sD); return false; } } conn.Close(); return true; } else { return false; } } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { conn.Close(); conn.Dispose(); } return false; }
private string[][] GetJobs(string[] siteBusy) { string[][] jobs = new string[0][]; DataDBService ddbs = new DataDBService(); //Создание обьекта для соединения SqlConnection conn = ddbs.GetDBCon(_dbConnectionString); if (conn != null) { string filterSiteBusy = ""; for (int i = 0; i < siteBusy.Length; i++) { if (!string.IsNullOrEmpty(siteBusy[i])) { //проверка для каждого занятого потока какой сайт он парсит, //чтобы этот же парсер в другой поток не взяле такой же сайт filterSiteBusy = filterSiteBusy + " and Site <> '" + siteBusy[i].Trim() + "'"; } } // Assumes that connection is a valid SqlConnection object. //берем строи из таблицы, которые не заняты и количество рестартов < допустимых рестартов string SQLstr = "SELECT top 20 [ID]" + ",[ParserName]" + ",[Encoding]" + ",[FirstPage]" + ",[PageCount]" + ",[DelayFrom]" + ",[DelayTo]" + ",[IpProxy]" + ",[PortProxy]" + ",[StartPage]" + ",[WebPreAuthentificationPage]" + ",[WebAuthentificationPage]" + ",[WebConnectionString]" + ",[Busy]" + ",[Site]" + ",[Source]" + ",[SourceDescription]" + ",[TimeInHours]" + ",[ResetTimeInMinutes]" + ",[AllowRestarts]" + ",[NumberOfRestart]" + ",[PathForPhoto]" + " FROM ParsersJob" + " WHERE StartUp=1 AND Start=1 AND isnull(Busy,0) = 0 and isnull(NumberOfRestart,0)<=isnull(AllowRestarts,1) " + " AND len(rtrim(ltrim(isnull(Site,' ')))) >0" + filterSiteBusy + " ORDER by LastDate + LastTime ASC"; SqlCommand SQLCmd = new SqlCommand(SQLstr, conn); SqlDataReader MydataReader = SQLCmd.ExecuteReader(); try { if (MydataReader.HasRows) { while (MydataReader.Read()) { string[] job = null; object o0 = ""; if (MydataReader.IsDBNull(0)) o0 = "0"; else o0 = MydataReader.GetInt32(0).ToString(); Array.Resize(ref job, 1); job[0] = (string)o0; //[ID] //Array.Resize(ref job, 1); job[0] = "70"; if (MydataReader.IsDBNull(1)) o0 = ""; else o0 = MydataReader.GetSqlString(1).ToString(); Array.Resize(ref job, 2); job[1] = (string)o0;//[ParserName] //Array.Resize(ref job, 2); job[1] = "GilcomGotovoeDataCollector"; if (MydataReader.IsDBNull(2)) o0 = ""; else o0 = MydataReader.GetSqlString(2).ToString(); Array.Resize(ref job, 3); job[2] = (string)o0;//[Encoding] //Array.Resize(ref job, 3); job[2] = "UTF8"; if (MydataReader.IsDBNull(3)) o0 = "0"; else o0 = MydataReader.GetInt32(3).ToString(); Array.Resize(ref job, 4); job[3] = (string)o0;//[FirstPage] //Array.Resize(ref job, 4); job[3] = "1"; if (MydataReader.IsDBNull(4)) o0 = "0"; else o0 = MydataReader.GetInt32(4).ToString(); Array.Resize(ref job, 5); job[4] = (string)o0;//[PageCount] //Array.Resize(ref job, 5); job[4] = "10"; if (MydataReader.IsDBNull(5)) o0 = "0"; else o0 = MydataReader.GetInt32(5).ToString(); Array.Resize(ref job, 6); job[5] = (string)o0;//[DelayFrom] //Array.Resize(ref job, 6); job[5] = "0";//[DelayFrom] if (MydataReader.IsDBNull(6)) o0 = "0"; else o0 = MydataReader.GetInt32(6).ToString(); Array.Resize(ref job, 7); job[6] = (string)o0;//[DelayTo] //Array.Resize(ref job, 7); job[6] = "0"; if (MydataReader.IsDBNull(7)) o0 = ""; else o0 = MydataReader.GetSqlString(7).ToString(); Array.Resize(ref job, 8); job[7] = (string)o0;//[IpProxy] //Array.Resize(ref job, 8); job[7] = ""; if (MydataReader.IsDBNull(8)) o0 = "0"; else o0 = MydataReader.GetInt32(8).ToString(); Array.Resize(ref job, 9); job[8] = (string)o0;//[PortProxy] //Array.Resize(ref job, 9); job[8] = "0"; if (MydataReader.IsDBNull(9)) o0 = ""; else o0 = MydataReader.GetSqlString(9).ToString(); Array.Resize(ref job, 10); job[9] = (string)o0;//[StartPage] //Array.Resize(ref job, 10); job[9] = "http://homes.gilcom.ru/sell/?intOption11%5B1%5D=&intOption2=250&intOption3Fake=&intOption25=&strOption25=&objectHomeNumber=&intOption5%5B3%5D=&intOption5%5B6%5D=&intOption1%5B3%5D=&intOption1%5B6%5D=&intOption12%5B1%5D=&typeOfOwner=allOwner&other=1&_owner=&btn=%D0%9D%D0%B0%D0%B9%D1%82%D0%B8&intOption6%5B3%5D=&intOption6%5B6%5D=&intOption7%5B3%5D=&intOption7%5B6%5D=&intOption14%5B3%5D=&intOption14%5B6%5D=&intOption27%5B3%5D=&intOption27%5B6%5D=&intOption10%5B1%5D=&intOption13%5B1%5D=&intOption15%5B1%5D=&intOption9%5B3%5D=&intOption9%5B6%5D=&intOption8%5B3%5D=&intOption8%5B6%5D=&period=&on_page=50&by=_orderDate&order=DESC"; if (MydataReader.IsDBNull(10)) o0 = ""; else o0 = MydataReader.GetSqlString(10).ToString(); Array.Resize(ref job, 11); job[10] = (string)o0;//[WebPreAuthentificationPage] //Array.Resize(ref job, 11); job[10] = ""; if (MydataReader.IsDBNull(11)) o0 = ""; else o0 = MydataReader.GetSqlString(11).ToString(); Array.Resize(ref job, 12); job[11] = (string)o0;//[WebAuthentificationPage] //Array.Resize(ref job, 12); job[11] = "";//[WebAuthentificationPage] if (MydataReader.IsDBNull(12)) o0 = ""; else o0 = MydataReader.GetSqlString(12).ToString(); Array.Resize(ref job, 13); job[12] = (string)o0;//[WebConnectionString] //Array.Resize(ref job, 13); job[12] = "";//[WebConnectionString] if (MydataReader.IsDBNull(13)) o0 = "false"; else o0 = MydataReader.GetBoolean(13).ToString(); Array.Resize(ref job, 14); job[13] = (string)o0; //[Busy] // Array.Resize(ref job, 14); job[13] = "False"; //[Busy] if (MydataReader.IsDBNull(14)) o0 = ""; else o0 = MydataReader.GetSqlString(14).ToString(); Array.Resize(ref job, 15); job[14] = (string)o0;//[Site] //Array.Resize(ref job, 15); job[14] = "gilkcom.ru (готовое) ";//[Site] if (MydataReader.IsDBNull(15)) o0 = ""; else o0 = MydataReader.GetSqlString(15).ToString(); Array.Resize(ref job, 16); job[15] = (string)o0;//[Source] //Array.Resize(ref job, 16); job[15] = "ЖИЛКОМ квартиры";//[Source] if (MydataReader.IsDBNull(16)) o0 = ""; else o0 = MydataReader.GetSqlString(16).ToString(); Array.Resize(ref job, 17); job[16] = (string)o0;//[SourceDescription] //Array.Resize(ref job, 17); job[16] = "Красноярск Gilcom готовое день";//[SourceDescription] if (MydataReader.IsDBNull(17)) o0 = "0"; else o0 = MydataReader.GetInt32(17).ToString(); Array.Resize(ref job, 18); job[17] = (string)o0;//[TimeInHours] //Array.Resize(ref job, 18); job[17] = "20";//[TimeInHours] if (MydataReader.IsDBNull(18)) o0 = "0"; else o0 = MydataReader.GetInt32(18).ToString(); Array.Resize(ref job, 19); job[18] = (string)o0;//[ResetTimeInMinutes] //Array.Resize(ref job, 19); job[18] = "15";//[ResetTimeInMinutes] if (MydataReader.IsDBNull(19)) o0 = "0"; else o0 = MydataReader.GetInt32(19).ToString(); Array.Resize(ref job, 20); job[19] = (string)o0;//[AllowRestarts] //Array.Resize(ref job, 20); job[19] = "20";//[AllowRestarts] if (MydataReader.IsDBNull(20)) o0 = "0"; else o0 = MydataReader.GetInt32(20).ToString(); Array.Resize(ref job, 21); job[20] = (string)o0;//[NumberOfRestart] //Array.Resize(ref job, 21); job[20] = "0";//[NumberOfRestart] if (MydataReader.IsDBNull(21)) o0 = ""; else o0 = MydataReader.GetSqlString(21).ToString(); Array.Resize(ref job, 22); job[21] = (string)o0;//[PathForPhoto] //Array.Resize(ref job, 22); job[21] = "\\\\195.208.47.9\\ParserPhotos"; Array.Resize(ref jobs, jobs.Count() + 1); jobs[jobs.Count() - 1] = job; } } } catch (SystemException ex) { string s = ex.Message; ddbs.WriteErrorMessage(_dbConnectionString, 0, null, "Ошибка четния задания" + s); } conn.Close(); } return jobs; }
public HttpWebResponse Request_Post(string path, string post_body, bool bAutoRedirect) { try { HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(path); if (_useProxyHTTP) httpWebRequest.Proxy = new WebProxy(_ipProxyHTTP, _portProxyHTTP); httpWebRequest.AllowAutoRedirect = bAutoRedirect; httpWebRequest.CookieContainer = new CookieContainer(); if (Cooks != null) { httpWebRequest.CookieContainer.Add(Cooks); } httpWebRequest.UserAgent = userAgents[new Random().Next(0, (userAgents.Count() - 1))]; httpWebRequest.Method = "POST"; httpWebRequest.ContentType = "application/x-www-form-urlencoded"; byte[] ByteQuery = System.Text.Encoding.ASCII.GetBytes(post_body); httpWebRequest.ContentLength = ByteQuery.Length; Stream QueryStream = httpWebRequest.GetRequestStream(); QueryStream.Write(ByteQuery, 0, ByteQuery.Length); QueryStream.Close(); HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); httpWebResponse.Cookies = httpWebRequest.CookieContainer.GetCookies(httpWebRequest.RequestUri); if (httpWebResponse.Cookies != null) { Cooks.Add(httpWebResponse.Cookies); } return httpWebResponse; } catch (WebException ex) { DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, path, ex.Message); return ex.Response as HttpWebResponse; } }
private string[] GetJob(string[] siteBusy) { string[] job = null; DataDBService ddbs = new DataDBService(); //Создание обьекта для соединения { string filterSiteBusy = ""; for (int i = 0; i < siteBusy.Length; i++) { if (!string.IsNullOrEmpty(siteBusy[i])) { filterSiteBusy = filterSiteBusy + " and Site <> '" + siteBusy[i].Trim() + "'"; } } // Assumes that connection is a valid SqlConnection object. string SQLstr = "SELECT top 1 [ID]" + ",[ParserName]" + ",[Encoding]" + ",[FirstPage]" + ",[PageCount]" + ",[DelayFrom]" + ",[DelayTo]" + ",[IpProxy]" + ",[PortProxy]" + ",[StartPage]" + ",[WebPreAuthentificationPage]" + ",[WebAuthentificationPage]" + ",[WebConnectionString]" + ",[Busy]" + ",[Site]" + ",[Source]" + ",[SourceDescription]" + ",[TimeInHours]" + ",[ResetTimeInMinutes]" + ",[AllowRestarts]" + ",[NumberOfRestart]" + ",[PathForPhoto]" + ", cast((cast(cast(dateend as date) as nvarchar(455))+' '+spltime) as datetime)sdate" + " FROM [PJobView]" + " WHERE StartUp=1 /*AND Start=1*/ AND isnull(Busy,0) = 0 and isnull(NumberOfRestart,0)<=isnull(AllowRestarts,1) " + " and cast((cast(cast(current_timestamp as date) as nvarchar(455))+' '+spltime) as datetime) > datebegin " + " and cast((cast(cast(current_timestamp as date) as nvarchar(455))+' '+spltime) as datetime) < current_timestamp " //+ " AND len(rtrim(ltrim(isnull(Site,' ')))) >0" + " AND ParserName not like 'avito%' " //+ " AND ParserName not like '%irr%' " + " AND ParserName not like 'domofond%' " //+ " and LastDate< DATEADD(hour, -12, CURRENT_TIMESTAMP)" + filterSiteBusy + " ORDER by sdate, LastDate ASC"; using(SqlConnection conn = ddbs.GetDBCon(_dbConnectionString)) if (conn != null) { SqlCommand SQLCmd = new SqlCommand(SQLstr, conn); SqlDataReader MydataReader = SQLCmd.ExecuteReader(); try { if (MydataReader.HasRows) { while (MydataReader.Read()) { object o0 = ""; if (MydataReader.IsDBNull(0)) o0 = "0"; else o0 = MydataReader.GetInt32(0).ToString(); Array.Resize(ref job, 1); job[0] = (string)o0; //[ID] if (MydataReader.IsDBNull(1)) o0 = ""; else o0 = MydataReader.GetSqlString(1).ToString(); Array.Resize(ref job, 2); job[1] = (string)o0;//[ParserName] if (MydataReader.IsDBNull(2)) o0 = ""; else o0 = MydataReader.GetSqlString(2).ToString(); Array.Resize(ref job, 3); job[2] = (string)o0;//[Encoding] if (MydataReader.IsDBNull(3)) o0 = "0"; else o0 = MydataReader.GetInt32(3).ToString(); Array.Resize(ref job, 4); job[3] = (string)o0;//[FirstPage] if (MydataReader.IsDBNull(4)) o0 = "0"; else o0 = MydataReader.GetInt32(4).ToString(); Array.Resize(ref job, 5); job[4] = (string)o0;//[PageCount] if (MydataReader.IsDBNull(5)) o0 = "0"; else o0 = MydataReader.GetInt32(5).ToString(); Array.Resize(ref job, 6); job[5] = (string)o0;//[DelayFrom] if (MydataReader.IsDBNull(6)) o0 = "0"; else o0 = MydataReader.GetInt32(6).ToString(); Array.Resize(ref job, 7); job[6] = (string)o0;//[DelayTo] if (MydataReader.IsDBNull(7)) o0 = ""; else o0 = MydataReader.GetSqlString(7).ToString(); Array.Resize(ref job, 8); job[7] = (string)o0;//[IpProxy] if (MydataReader.IsDBNull(8)) o0 = "0"; else o0 = MydataReader.GetInt32(8).ToString(); Array.Resize(ref job, 9); job[8] = (string)o0;//[PortProxy] if (MydataReader.IsDBNull(9)) o0 = ""; else o0 = MydataReader.GetSqlString(9).ToString(); Array.Resize(ref job, 10); job[9] = (string)o0;//[StartPage] if (MydataReader.IsDBNull(10)) o0 = ""; else o0 = MydataReader.GetSqlString(10).ToString(); Array.Resize(ref job, 11); job[10] = (string)o0;//[WebPreAuthentificationPage] if (MydataReader.IsDBNull(11)) o0 = ""; else o0 = MydataReader.GetSqlString(11).ToString(); Array.Resize(ref job, 12); job[11] = (string)o0;//[WebAuthentificationPage] if (MydataReader.IsDBNull(12)) o0 = ""; else o0 = MydataReader.GetSqlString(12).ToString(); Array.Resize(ref job, 13); job[12] = (string)o0;//[WebConnectionString] if (MydataReader.IsDBNull(13)) o0 = "false"; else o0 = MydataReader.GetBoolean(13).ToString(); Array.Resize(ref job, 14); job[13] = (string)o0; //[Busy] if (MydataReader.IsDBNull(14)) o0 = ""; else o0 = MydataReader.GetSqlString(14).ToString(); Array.Resize(ref job, 15); job[14] = (string)o0;//[Site] if (MydataReader.IsDBNull(15)) o0 = ""; else o0 = MydataReader.GetSqlString(15).ToString(); Array.Resize(ref job, 16); job[15] = (string)o0;//[Source] if (MydataReader.IsDBNull(16)) o0 = ""; else o0 = MydataReader.GetSqlString(16).ToString(); Array.Resize(ref job, 17); job[16] = (string)o0;//[SourceDescription] if (MydataReader.IsDBNull(17)) o0 = "0"; else o0 = MydataReader.GetInt32(17).ToString(); Array.Resize(ref job, 18); job[17] = (string)o0;//[TimeInHours] if (MydataReader.IsDBNull(18)) o0 = "0"; else o0 = MydataReader.GetInt32(18).ToString(); Array.Resize(ref job, 19); job[18] = (string)o0;//[ResetTimeInMinutes] if (MydataReader.IsDBNull(19)) o0 = "0"; else o0 = MydataReader.GetInt32(19).ToString(); Array.Resize(ref job, 20); job[19] = (string)o0;//[AllowRestarts] if (MydataReader.IsDBNull(20)) o0 = "0"; else o0 = MydataReader.GetInt32(20).ToString(); Array.Resize(ref job, 21); job[20] = (string)o0;//[NumberOfRestart] if (MydataReader.IsDBNull(21)) o0 = ""; else o0 = MydataReader.GetSqlString(21).ToString(); Array.Resize(ref job, 22); job[21] = (string)o0;//[PathForPhoto] if (o0 != null) GC.SuppressFinalize(o0); break; // читаем одну запись } } } catch (SystemException ex) { string s = ex.Message; ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Ошибка четния задания" + _parserName + " " + _sourceDescription + ". " + s); } finally { if (MydataReader != null) { MydataReader.Close(); GC.SuppressFinalize(MydataReader); } if (SQLCmd != null) { SQLCmd.Dispose(); GC.SuppressFinalize(SQLCmd); } if (conn != null) { conn.Close(); conn.Dispose(); GC.SuppressFinalize(conn); } } } } return job; }
//--------------------------- 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 NSetJobState(int id, int currentPage, int countPagesTotal, int CountAnnouncement, int jobid, HtmlDocument doc) { // текущие дата и время DateTime dateTime = DateTime.Now; //new DateTime(); string dt = dateTime.ToString("yyyy-MM-dd HH:mm:ss.fff"); using (DataDBService ddbs = new DataDBService()) { try { //update string SQLstr = "UPDATE [PJobUpdate] SET " + " StartType=1" + " ,LastDate='" + dt + "'" //+ " ,LastDocument= '" + doc.DocumentNode.InnerHtml.Replace("'", "''").Substring(0,999) + "'" + " ,CurrentPage=" + currentPage.ToString() + " ,CountPagesTotal=" + countPagesTotal.ToString() + " ,CountAnnouncement=CountAnnouncement+" + CountAnnouncement.ToString() + " ,Complete=" + (currentPage + 1 == _firstPage + _pageCount || currentPage == countPagesTotal ? 1 : 0).ToString() /* статус = 1 фиксируется в общем порядке + (currentPage + 1 == _firstPage + _pageCount || currentPage == countPagesTotal ? " ,ParserStatus=1" : "") */ + (currentPage + 1 == _firstPage + _pageCount || currentPage == countPagesTotal ? " ,DateEnd='" + dt + "'" : "") + " Where ID = " + id.ToString(); string s = ddbs.ExecuteSQLCommand(SQLstr, _dbConnectionString); //DataSet ds = ddbs.CreateCommandAndUpdate(SQLstr, _dbConnectionString); if (!string.IsNullOrEmpty(s)) ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Ошибка записи текущего состояния задания. " + jobid + "."); } finally { ddbs.Dispose();} } return (currentPage + 1 == _firstPage + _pageCount || currentPage == countPagesTotal ? false : true); }
public void JobToNoBusy() { // при остановке сервиса // остающиеся в состоянии занято // имя хоста string hostName = Dns.GetHostName(); //string ipAddress = ""; // IP хоста IPHostEntry ipEntry = Dns.GetHostEntry(hostName); string SQLstr = "UPDATE PJobUpdate SET " + " StartType=6" + " ,Busy=0, Start=1, FirstPage = currentpage " // -- + " Where " + " Host = '" + hostName + "'" //+ " and IP = '" + ipAddress + "'" + " and Busy=1"; using (DataDBService ddbs = new DataDBService()) { string s = ddbs.ExecuteSQLCommand(SQLstr, _dbConnectionString); if (!string.IsNullOrEmpty(s)) { ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, "JobToNoBusy. не смог выставить Start=1, Busy =0, работавшим задачам при остановке сервиса"); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Ошибка записи изменения состояния задания по зависанию в занято при остановке сервиса. " + _parserName + " " + _sourceDescription + ". " + s); } } }
//--------------------------- 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 void JobSchedule() { // StartUp - не смотрим // Начальная страница обычного задания - из поля FirstPageForSchedule // Даты старта - из DateStart, если совпадает с текущей датой - текущая дата, иначе 01.01.1900 (скалярная ф-я sfGetJobDate) // Времена старта - истина, если текущее время больше не более, чем на minutes минут времени старта, ложь (скалярная ф-я sfGetJobTime) // Время в часах с момента DateEnd+TimeEnd - в часах (скалярная ф-я sfGetHoursFromEnd) if (GetTuningScheduler()) // данному парсеру разрешена работа планировщиком? { //StreamWriter _fileWrite; //добавлено 24.11.2014 using (DataDBService ddbs = new DataDBService()) { ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, " Schedule. п1. начинаю..."); // ежедневное //берем id, которые не запущены и не выствлен старт соответствуют (кроме авито,) string SQLstr = "UPDATE PJobUpdate SET " + " StartType=2" + " ,Start=1" + " ,NumberOfRestart = 0" + " ,FirstPage=isnull((select pv.FirstPageForSchedule from PJobStat pv where PJobUpdate.ID=pv.ID),1)" + " ,PageCount=isnull((select pv.PageCountForSchedule from PJobStat pv where PJobUpdate.ID=pv.ID),999)" // -- + " WHERE ID in " + @" ( SELECT DISTINCT ID FROM PJobView jv OUTER APPLY (select word from dbo.split (TimeStart, '%,%') )spl WHERE StartUp=1 and ( --сегоднящние ( --запланированное время старта меньше текущего времени. substring(spl.word, patindex('%[^\.]%', spl.word),40)< SUBSTRING(CONVERT(nvarchar(32),CONVERT (time, CURRENT_TIMESTAMP)),0,CHARINDEX('.',CONVERT(nvarchar(32),CONVERT (time, CURRENT_TIMESTAMP)),0)-3) --дата начала парсинга меньше текущей даты +запланированное время старта (то есть сегодня не стартовала в нужное время) and (CONVERT(datetime,DateBegin,104) < convert(datetime,CONVERT (date, CURRENT_TIMESTAMP)) +' '+CONVERT(time,substring(spl.word, patindex('%[^\.]%', spl.word),40)+':00',108) --для задач, которые стартуют более одного раза, чтобы выводились остаточные разы or CONVERT(datetime,DateEnd,104) < convert(datetime,CONVERT (date, CURRENT_TIMESTAMP)) +' '+CONVERT(time,substring(spl.word, patindex('%[^\.]%', spl.word),40)+':00',108)) ) or --для вчерашних ( --дата начала парсинга меньше текущей даты +запланированное время старта (то есть сегодня не стартовала в нужное время) CONVERT(datetime,DateBegin,104) < convert(datetime,cast (DATEADD(DAY,-1, CURRENT_TIMESTAMP) as date)) +' '+CONVERT(time,substring(spl.word, patindex('%[^\.]%', spl.word),40)+':00',108) --для задач, которые стартуют более одного раза, чтобы выводились остаточные разы or CONVERT(datetime,DateEnd,104)< convert(datetime,cast (DATEADD(DAY,-1, CURRENT_TIMESTAMP) as date)) +' '+CONVERT(time,substring(spl.word, patindex('%[^\.]%', spl.word),40)+':00',108) ) ) --and ParserName not like 'avito%' and isnull(Busy,0)=0 and isnull(Start,0)=0 ) "; string s = ddbs.ExecuteSQLCommand(SQLstr, _dbConnectionString); //DataSet ds = ddbs.CreateCommandAndUpdate(SQLstr, _dbConnectionString); if (!string.IsNullOrEmpty(s)) { ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, "Schedule. п1. не смог выставить Start задачам " + s); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Schedule. п1. не смог выставить Start задачам" + _parserName + " " + _sourceDescription + ". " + s); } s = ""; ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, " Schedule. п2. начинаю..."); //старт раз в 12 часов для тех, где превышено количество рестартов SQLstr = "UPDATE PJobUpdate SET " + " StartType=3" + " ,Start=1" + " ,NumberOfRestart = 0" + " ,FirstPage=isnull((select pv.FirstPageForSchedule from PJobStat pv where PJobUpdate.ID=pv.ID),1)" + " ,PageCount=isnull((select pv.PageCountForSchedule from PJobStat pv where PJobUpdate.ID=pv.ID),999)" // --разница между текущим временем и последней отпиской в базу больше 12 часов + @" Where ID in ( SELECT ID FROM PJobView where StartUp=1 and NumberOfRestart > AllowRestarts --and ParserName not like 'avito%' and DATEDIFF(HOUR, CONVERT(datetime,LastDate,104), CURRENT_TIMESTAMP) > 12 )"; s = ddbs.ExecuteSQLCommand(SQLstr, _dbConnectionString); if (!string.IsNullOrEmpty(s)) { ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, " Schedule. п2. не смог выставить Start задачам " + s); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, " Schedule. п2. не смог выставить Start задачам, где NumberOfRestart>AllowRestarts и LastTime>12h" + _parserName + " " + _sourceDescription + ". " + s); } s = ""; ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, " Schedule. п3. начинаю..."); //24/11/2014 не совсем понимаю эту ситуацию, видо для тех, кто остался висеть после рестарта сервиса, но сейчас в JobToNoBusy() добавлено выставелние Start=1, скорее всего эта ситуация не повторится // незавершенные / незанятые / не в старте (подхватываются в т.ч. после рестарта сервиса) SQLstr = "UPDATE PJobUpdate SET " + " StartType=4" + " ,Start=1" // -- + " ,FirstPage=isnull((select pv.FirstPageForSchedule from PJobStat pv where PJobUpdate.ID=pv.ID),1)" + " ,PageCount=isnull((select pv.PageCountForSchedule from PJobStat pv where PJobUpdate.ID=pv.ID),999)" // -- + " Where isnull(Complete,0)=0" //+ " and isnull(Startup,0)=1" //здесь этого не надо + " and isnull(Start,0)=0" + " and isnull(Busy,0)=0" + " and isnull(CurrentPage,0)+1 < isnull(FirstPage,1)+isnull(PageCount,1)" // страниц меньше + " and isnull(NumberOfRestart,0) > 0" // старты были + " "; s = ddbs.ExecuteSQLCommand(SQLstr, _dbConnectionString); if (!string.IsNullOrEmpty(s)) { ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, "Schedule. п3. не смог выставить Start задачам " + s); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Schedule. п3. Ошибка записи изменения состояния задания по незавершено незанято." + _parserName + " " + _sourceDescription + ". " + s); } s = ""; ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, " Schedule. п4. начинаю..."); // зависшие в состоянии занято //change - 24/11/2014 SQLstr = "UPDATE PJobUpdate SET " + " StartType=5" + " ,Busy=0, FirstPage = case when CurrentPage > 1 then CurrentPage-1 else 1 end, Start=1 " // -- + @" Where ID in ( SELECT ID FROM PJobView where DATEDIFF(MINUTE, CONVERT(datetime,LastDate,104),CURRENT_TIMESTAMP) > ResetTimeInMinutes and isnull(Startup,0)=1 and isnull(Busy,0)=1 ) "; s = ddbs.ExecuteSQLCommand(SQLstr, _dbConnectionString); if (!string.IsNullOrEmpty(s)) { ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, "Schedule. п4. не смог выставить Start задачам. " + s); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Schedule. п4. не смог выставить Start зависшим задачам (Busy=1)" + _parserName + " " + _sourceDescription + ". " + s); } } } }
private void SetJobStatus(int id, int status) { using (DataDBService ddbs = new DataDBService()) { //update string SQLstr = "UPDATE [PJobUpdate] SET " + " StartType=1" + " ,ParserStatus=" + status.ToString() + " Where ID = " + id.ToString(); string s = ddbs.ExecuteSQLCommand(SQLstr, _dbConnectionString); if (!string.IsNullOrEmpty(s)) { ddbs.WriteMessageAboutActivity(_dbConnectionString, 10002, "Ошибка записи текущего состояния задания."); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Ошибка записи текущего состояния задания. " + _parserName + " " + _sourceDescription + ". " + s + (status != 1 ? "Ошибка: статус " + status.ToString() + "." : "")); } if (status != 1) ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, _startPage, "Ошибка: статус " + status.ToString() + ". jobID=" + _ID); } //DataSet ds = ddbs.CreateCommandAndUpdate(SQLstr, _dbConnectionString); }
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; } } }
/// <summary> /// Запрашиваем страницу через WebСlient /// </summary> public HtmlDocument WebClientPage(WebClient c, string address) { address = !string.IsNullOrEmpty(address) ? address : _startAddress; //address = address.Replace("https://m.avito", "http://avito"); Uri site = new Uri(address); HtmlDocument document = new HtmlDocument(); if (address.Contains("tumen-realty")) { document = GetPage(site, "GET", GetCookieTumenRealtyCityStar(site)); //document = this.document; } else { if (address.Contains("www.moyareklama.ru")) { document = GetPage(site, "GET", GetCookieTumenRealtyCityStar(site)); //document = this.document; } else { try { document = GetPage2(site); } catch (WebException ex) { DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, !string.IsNullOrEmpty(address) ? address : _startAddress, ex.Message); document = null; } catch (UriFormatException ex) { DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, !string.IsNullOrEmpty(address) ? address : _startAddress, "ПРОКСИ: " + ex.Message); document = null; } catch (Exception ex) { DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, !string.IsNullOrEmpty(address) ? address : _startAddress, "DataDBNet. Ошибка получения страницы: " + ex.Message); document = null; } } } return document; }
public bool ToDB(string tableName, string connectionString) { if (this.items == null) return true; if (!this.items.Any()) return true; error = ""; DataDBService ddbs = new DataDBService(); bool fl = false; List <string> fields=null; List<int> PublishedIDs_ = new List<int>(); List<string> values = null; string[] values_field = null; string q = ""; try { ContainParsersDatafields(tableName, connectionString); fields = ContainFields(tableName, connectionString, fields); if (fields == null) return false; if (!fields.Any()) return false; for (int k = 0; k < this.items.Count() / 1000 + 1; k++) { int c = 0; if (this.items.Count() < 1000) c = this.items.Count(); else if (this.items.Count() - k * 1000 > 1000) c = 1000; q = "insert into " + tableName + "(" + String.Join(", ", fields.ToArray()) + ") values "; if (items == null || !this.items.Any()) return true; else c = this.items.Count() - k * 1000; values = new List<string>(); values_field = new string[fields.Count]; //DataTable table = CreateDBTable(); if (this.items != null) { for (int i = 0; i < c; i++) { if (this.items[i] != null) if (this.items[i].GetType() != null) try { for (int j = 0; j < fields.Count; j++) { if (this.items[i].GetPropertyValue(fields[j]) != null) { try { lock (fieldtypes) if (!fieldtypes.Keys.Contains(fields[j])) fieldtypes.Add(fields[j], this.items[i].GetPropertyValue(fields[j]).GetType().Name); } catch (Exception exxx) { ddbs.WriteErrorMessage(connectionString, 0, null, "Ошибка добавления полей в запрос " + exxx.Message); Console.WriteLine("Ошибка добавления полей в запрос " + exxx.Message); fl = false; error = exxx.Message; } if (fieldtypes[fields[j]] == "String") values_field[j] = ("'" + ((string)(this.items[i + k * 1000].GetPropertyValue(fields[j]))).Replace("'", "''") + "'"); else if (fieldtypes[fields[j]] == "Int32") values_field[j] = (((int)(this.items[i + k * 1000].GetPropertyValue(fields[j]))).ToString()); else values_field[j] = ("'" + ((this.items[i + k * 1000].GetPropertyValue(fields[j]))).ToString().Replace("'", "''") + "'"); } else values_field[j] = ("null"); } values.Add( ("(" + String.Join(", ", values_field) + ")")); try { if (this.items[i].GetPropertyValue("AddressParsing") != null) PublishedIDs_.Add((int)(this.items[i].GetPropertyValue("AddressParsing"))); } catch { Console.WriteLine("Ошибка");} } catch (Exception exxx) { string sss = exxx.Message; ddbs.WriteErrorMessage(connectionString, 0, null, "Ошибка добавления объявлений в запрос " + sss + ", i = " + i.ToString()); Console.WriteLine("Ошибка добавления объявлений в запрос " + sss + ", i = " + i.ToString()); error = sss + " " + q; fl = false; } } } if(values!=null) if (values.Any()) { q += String.Join(", ", values); string s2 = ddbs.ExecuteSQLCommand(q, connectionString, 29); if (this.items != null) Console.WriteLine("Отправили " + this.items.Count() + " объектов"); if (PublishedIDs_!=null) if (PublishedIDs_.Any()) { if (!string.IsNullOrEmpty(s2)) { ddbs.WriteErrorMessage(connectionString, 0, null, "Ошибка записи объектов в БД " + s2 + " " + q); Console.WriteLine("Ошибка записи объектов в БД " + s2 + " " + q.Substring(0, 99)); error = s2 + " " + q; fl = false; } else { PublishedIDs.AddRange(PublishedIDs_); fl = true; } } else fl = false; } else fl = true; } //return true; } catch (Exception exx) { if (this.items != null) Console.WriteLine("Не отправили " + this.items.Count() + " объектов"); string s = exx.Message; ddbs.WriteErrorMessage(connectionString, 0, null, "Ошибка отправки объявлений2: " + exx.Message); Console.WriteLine("Ошибка отправки объявлений2: " + exx.Message); fl = false; error = s + " " + q; } finally { if (fields != null) { fields.Clear(); GC.SuppressFinalize(fields); } if (values != null)GC.SuppressFinalize(values); if (values_field != null)GC.SuppressFinalize(values_field); } if (!fl) return fl; return fl; }
public HttpWebResponse Request(string sUrl, bool bAutoRedirect) { try { HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(sUrl); if (_useProxyHTTP) httpWebRequest.Proxy = new WebProxy(_ipProxyHTTP, _portProxyHTTP); httpWebRequest.UserAgent = userAgents[new Random().Next(0, userAgents.Count() - 1)]; httpWebRequest.AllowAutoRedirect = bAutoRedirect; httpWebRequest.CookieContainer = new CookieContainer(); if (Cooks != null) { httpWebRequest.CookieContainer.Add(Cooks); } HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); httpWebResponse.Cookies = httpWebRequest.CookieContainer.GetCookies(httpWebRequest.RequestUri); if (httpWebResponse.Cookies != null) { Cooks.Add(httpWebResponse.Cookies); } return httpWebResponse; } catch (WebException ex) { DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, sUrl, ex.Message); return ex.Response as HttpWebResponse; } }
public bool InsertIntoAddressesUpload(List<string> addresses, List<string> stickers, int jobID, string hostName) { if (addresses.Count == 0) return true; DateTime now = DateTime.Now; DataDBService ddbs = new DataDBService(); using(SqlConnection conn = ddbs.GetDBCon(_dbConnectionString)) try { if (conn != null && addresses.Count > 0) { DataTable table = new DataTable(); table.Columns.Add("JobID", typeof(int)); table.Columns.Add("Address", typeof(string)); table.Columns.Add("Sticker", typeof(string)); table.Columns.Add("DateUpload", typeof(System.Data.SqlTypes.SqlDateTime)); table.Columns.Add("Host", typeof(string)); table.Columns.Add("StreamNumber", typeof(int)); //если пусто количество ссылок, берем количество стикеров - верно для досок int count = (addresses.Count > 0) ? addresses.Count : stickers.Count; for (int k = 0; k < count; k++) { DataRow newRow = table.NewRow(); newRow["JobID"] = jobID; newRow["Address"] = addresses[k]; newRow["Sticker"] = stickers[k]; newRow["DateUpload"] = now; newRow["Host"] = hostName; newRow["StreamNumber"] = _streamNumber; table.Rows.Add(newRow); } SqlBulkCopy sqlBulk = new SqlBulkCopy(_dbConnectionString, SqlBulkCopyOptions.FireTriggers); sqlBulk.DestinationTableName = "AddressesMaskUpload"; DataDBSerializer ddbser = new DataDBSerializer(); List<string> DBNames = ddbser.GetDBTableFields(sqlBulk.DestinationTableName, _dbConnectionString); foreach (DataColumn column in table.Columns) { string columnName = column.ColumnName; //for (int t = 0; t < DBNames.Count(); t++) { //if (columnName.Trim().ToUpper() == DBNames[t].Trim().ToUpper()) //if (DBNames[t].Trim().ToUpper() != "ID") sqlBulk.ColumnMappings.Add(columnName.Trim(), columnName.Trim()); } } try { // пишем все на сервер sqlBulk.WriteToServer(table); sqlBulk.Close(); return true; } catch (Exception ex) { ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, null, "Ошибка записи в AddressesMaskUpload. " + "jobId " + jobID + ". " + ex); return false; } finally { GC.SuppressFinalize(sqlBulk); } } else { //если подключение вернуло null return false; } } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { conn.Close(); conn.Dispose(); } return false; }
private void _timer_Starter_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { _timerStarter.Stop(); int streamNumber = GetFreeStream(); if (streamNumber >= 0) { try { // проверка связи с БД и соответствующая отметка //if (CheckDBConnection("SPM таймер запуска стартовал. ", streamNumber, false)) { DataDBJob job = null; try { // считаем задание и попытаемя его запустить lock (_siteBusy) { lock (newjoblockstring) { job = new DataDBJob(_dbConnectionString, streamNumber, true, _siteBusy); if (job != null) { if (!String.IsNullOrEmpty(job.Site)) { if (!string.IsNullOrEmpty(job.Site)) // задание захвачено { _siteBusy[streamNumber] = job.Site; // сайт занят lock (_siteBusyStart) _siteBusyStart[streamNumber] = DateTime.Now; } } else { _timerStarter.Interval = 15000; Console.WriteLine(DateTime.Now+" no work"); } } else { _timerStarter.Interval = 15000; Console.WriteLine(DateTime.Now+" no work"); } } } if (!String.IsNullOrEmpty(job.Site)) { Console.WriteLine(DateTime.Now + " On " + streamNumber + " stream started job " + job.Site); //ShowInfoMessage(); _timerStarter.Interval = 1; //_timerStarter.Start(); _timerStarter.Enabled=true; job.StartJob(); } } catch (Exception ex) // ловим ошибку плагина { DataDBService ddbs = new DataDBService(); lock (_siteBusy) ddbs.WriteErrorMessage(_dbConnectionString, streamNumber, "Сайт " + _siteBusy[streamNumber] + ". Необработанная ошибка плагина", ex.Message); ddbs.Dispose(); GC.SuppressFinalize(ddbs); } finally { if (job != null) { lock (_siteBusy) { if (!string.IsNullOrEmpty(_siteBusy[streamNumber])) { Console.WriteLine(DateTime.Now + " On " + streamNumber + " stream finished job " + job.Site); _siteBusy[streamNumber] = ""; // сайт свободен _siteBusyStart[streamNumber] = DateTime.MaxValue; _timerStarter.Interval = 1; //_timerStarter.Start(); //ShowInfoMessage(); } else _timerStarter.Interval = 15000; } { job.Dispose(); GC.SuppressFinalize(job); } } _timerStarter.Start(); //CheckDBConnection("SPM таймер запуска остановлен. ", streamNumber, false); } } } catch (Exception ex) // ловим ошибку соединения с БД { Console.WriteLine("Ошибка 5675 "+ex.Message); } finally { lock (_siteBusy) _siteBusy[streamNumber] = ""; // сайт свободен } } else { _timerStarter.Interval = 15000; _timerStarter.Start(); Console.WriteLine(DateTime.Now + " No free threads"); } }
public DirtyApartments CardParsing(HtmlDocument page, string address, string sticker, bool ParsePhones = true) { if (page == null) page = new HtmlDocument(); if (address == null) address = ""; if (sticker == null) sticker = ""; DirtyApartments dirtyApartment = new DirtyApartments(); try { //Stopwatch sw = new Stopwatch(); //sw.Start(); try { SetLink(address, dirtyApartment); // ссылка SetBalcony(page, dirtyApartment); //Устанавливаем наличие балкона SetKindOfObject(dirtyApartment); //Устанавливаем вид объекта SetTimeOfDischarge(dirtyApartment); //Устанавливаем время выгрузки SetYearOfConstruction(page, dirtyApartment); //Устанавливаем год постройки объекта SetCity(page, dirtyApartment); //Устанавливаем город объекта SetDateOfDischarge(dirtyApartment); //Устанавливаем дату выгрузки SetAdDate(page, dirtyApartment); //Устанавливаем дату объявления } catch (Exception ex) { string s = ex.Message; DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, address, "Ошибка парсинга 1 " + s); dirtyApartment.Dispose(); GC.SuppressFinalize(dirtyApartment); return null; } try { SetHouseNumber(page, dirtyApartment); //Установка номера дома SetReliability(dirtyApartment); //Установка достоверности SetLivingArea(page, dirtyApartment); //Установка жилой площади SetAdCaption(page, dirtyApartment); //Установка заголовка объявления SetSignedAnExclusiveAgreement(dirtyApartment); //Установка "Заключен эксклюзивный договор" SetNameOfContactPerson(page, dirtyApartment); //Установка имени контактного лица } catch (Exception ex) { string s = ex.Message; DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, address, "Ошибка парсинга 1.5 " + s); dirtyApartment.Dispose(); GC.SuppressFinalize(dirtyApartment); return null; } try { SetSource(dirtyApartment); //Установка сайта-источника информации SetNumberOfRooms(page, dirtyApartment); //Установка количества комнат SetCompanyName(page, dirtyApartment); //Установка наименования компании-посредника SetKitchenArea(page, dirtyApartment); //Установка площади кухни SetLoggia(page, dirtyApartment); //Установка информации по лоджии SetMicrodistrict(page, dirtyApartment); //Установка микрорайона SetWallMaterial(page, dirtyApartment); //Установка материала стен //SetObjectName(dirtyApartment); //Установка наименования объекта SetObjectName(page, dirtyApartment); //Установка наименования } catch (Exception ex) { string s = ex.Message; string s1 = ex.Source; string s2 = ex.StackTrace; Exception o1 = ex.InnerException; object o3 = ex.TargetSite; object o4 = ex.Data; DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, address, "Ошибка парсинга 2 " + s); dirtyApartment.Dispose(); GC.SuppressFinalize(dirtyApartment); return null; } try { SetAdNumber(page, dirtyApartment); //Установка номера объявления SetArea(page, dirtyApartment); //Установка области SetCommonArea(page, dirtyApartment); //Установка общей площади SetOperation(dirtyApartment); //Установка операции SetLandmark(page, dirtyApartment); //Установка ориентира SetLayout(page, dirtyApartment); //Установка типа планировки SetNote(page, dirtyApartment); //Установка примечания SetViews(page, dirtyApartment); //Установка количества просмотров SetDistrict(page, dirtyApartment); //Установка района SetSite(page, dirtyApartment); //Установка сайта SetWc(page, dirtyApartment); //Установка типа санузла //SetLink(address, dirtyApartment); //Установка ссылки на объявление SetAdText(page, dirtyApartment);//Установка текста объявления } catch (Exception ex) { string s = ex.Message; DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, address, "Ошибка парсинга 3 " + s); dirtyApartment.Dispose(); GC.SuppressFinalize(dirtyApartment); return null; } if (ParsePhones) { try { if (address.Contains("sibdom")) { if (!string.IsNullOrEmpty(sticker)) SetSticker(sticker, dirtyApartment);//Установка данных из стикера } SetPhoneNumbers(page, dirtyApartment); //Устанавливаем номера телефонов } catch (Exception ex) { string s = ex.Message; Console.WriteLine("Ошибка парсинга телефонов "+s); //Console.WriteLine(s); DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, address, "Ошибка парсинга телефонов " + s); if (dirtyApartment != null) { dirtyApartment.Dispose(); GC.SuppressFinalize(dirtyApartment); } return null; } } try { //SetTypeOfContactPerson(dirtyApartment);//Установка типа контактного лица SetTypeOfContactPerson(page, dirtyApartment);//Установка типа контактного лица (два параметра) //SetTypeOfPayment(dirtyApartment);//Установка типа оплаты услуг SetTypeOfPayment(page, dirtyApartment);//Установка типа оплаты услуг (два параметра) SetCooker(page, dirtyApartment);//Установка типа плиты SetStreet(page, dirtyApartment);//Установка улицы } catch (Exception ex) { string s = ex.Message; DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, address, "Ошибка парсинга 4 " + s); dirtyApartment.Dispose(); GC.SuppressFinalize(dirtyApartment); return null; } try { //if (Dns.GetHostName().Substring(0, 4) == "pars") if(page!=null && dirtyApartment!=null) SetPhoto(page, dirtyApartment);//Установка ссылок на фотографии } catch (Exception ex) { string s = ex.Message; DataDBService ddbs = new DataDBService(); string hostName = Dns.GetHostName(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, address, "Ошибка сохранения фото " + s); dirtyApartment.Dispose(); GC.SuppressFinalize(dirtyApartment); return null; } try { SetPrice(page, dirtyApartment);//Установка цены SetEmail(page, dirtyApartment);//Установка электронной почты SetStorey(page, dirtyApartment);//Установка этажа SetNumberOfStoreys(page, dirtyApartment);//Установка этажности SetDeveloper(page, dirtyApartment); //Установка застройщика SetQuarterOfDelivery(page, dirtyApartment); //Установка информации по кварталу сдачи с сайта SetYearOfDelivery(page, dirtyApartment); //Установка информации по году сдачи с сайта SetFurnishType(page, dirtyApartment); //Установка информации по типу отделки с сайта SetHousingComplex(page, dirtyApartment); //Установка информации по ЖК с сайта SetStreetUnderConstruction(page, dirtyApartment); /// Выборка информации по строительному адресу - улица с сайта } catch (Exception ex) { string s = ex.Message; DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, address, "Ошибка парсинга 5 " + s); dirtyApartment.Dispose(); GC.SuppressFinalize(dirtyApartment); return null; } try { SetHouseUnderConstruction(page, dirtyApartment); /// Выборка информации по строительному адресу - дом с сайта SetNewBuilding(page, dirtyApartment); /// Выборка дополнительной информации по новостройке с сайта } catch (Exception ex) { string s = ex.Message; DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, address, "Ошибка парсинга 6 " + s); dirtyApartment.Dispose(); GC.SuppressFinalize(dirtyApartment); return null; } /// try { if (!string.IsNullOrEmpty(sticker)) SetSticker(sticker, dirtyApartment);//Установка данных из стикера } catch (Exception ex) { string s = ex.Message; DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, address, "Ошибка парсинга в установке стикера " + s); dirtyApartment.Dispose(); GC.SuppressFinalize(dirtyApartment); return null; } if (CheckData(dirtyApartment)) return dirtyApartment; else { Console.WriteLine("Объявление не прошло проверку"); return null; } } catch (Exception ex) { string s = ex.Message; DataDBService ddbs = new DataDBService(); ddbs.WriteErrorMessage(_dbConnectionString, _streamNumber, address, "Ошибка парсинга 9 " + s); dirtyApartment.Dispose(); GC.SuppressFinalize(dirtyApartment); return null; } //Console.WriteLine("Необъяснимым образом код добрался до сюда"); //return null; }