//processUrl multi task private Task ProcessDadosAnunciosAsync(string anuncio) { try { var posicao1 = 0; var tamanho = 0; Anuncio anuncioUnico = new Anuncio(); Progresso.EtapaDados++; //link posicao1 = anuncio.IndexOf("canonical") + 17; tamanho = anuncio.IndexOf("link ", posicao1) - 4 - posicao1; if (tamanho > 0) { anuncioUnico.Link = anuncio.Substring(posicao1, tamanho); } //idAnuncio posicao1 = anuncio.IndexOf("adpage/?id=") + 11; tamanho = anuncio.IndexOf("meta", posicao1) - 4 - posicao1; if (tamanho > 0) { anuncioUnico.IdAnuncio = anuncio.Substring(posicao1, tamanho); } //vendedor posicao1 = anuncio.IndexOf("sellerName") + 13; tamanho = anuncio.IndexOf(",", posicao1) - 1 - posicao1; if (tamanho > 0) { anuncioUnico.Vendedor = anuncio.Substring(posicao1, tamanho); } var excludentes = new List <string> { "anúncio profissional", "a partir de ", "dividimos em até ", "dividimos em ate ", "frete grátis", "frete gratis", "direto da fábrica", "direto da fabrica", "em promoção", "em promocao", "da fabrica", "da fábrica", }; int count = 0; Boolean vendedorProibido = false; // VER O USO DE INTERSECT PAR COMPARAR TODOS OS ANUNCIOS DE UMA VEZ SÓ foreach (string element in excludentes) { count++; if (anuncio.IndexOf(element, StringComparison.CurrentCultureIgnoreCase) > -1) { vendedorProibido = true; } } if (vendedorProibido) { //decrementa quantidade na barra de progresso Progresso.QuantidadeAnuncios--; Progresso.EtapaAnuncio--; Progresso.EtapaDados--; } else { int categoriaId = 0; //Categoria posicao1 = anuncio.IndexOf("mainCategory\":") + 15; tamanho = anuncio.IndexOf("subCategory\":", posicao1) - 3 - posicao1; if (tamanho > 0) { CategoriaAnuncio tempCategoria = categoriaAnuncios.FirstOrDefault(m => m.Nome == anuncio.Substring(posicao1, tamanho)); if (tempCategoria == null) { //cadastrar nova categoria tempCategoria = new CategoriaAnuncio(); lastCategoriaAnuncioId++; tempCategoria.Id = lastCategoriaAnuncioId; tempCategoria.Nome = anuncio.Substring(posicao1, tamanho); categoriaAnuncios.Add(tempCategoria); novasCategoriaAnuncios.Add(tempCategoria); } categoriaId = tempCategoria.Id; //SubCategoria posicao1 = anuncio.IndexOf("subCategory\":") + 14; tamanho = anuncio.IndexOf("mainCategoryID", posicao1) - 3 - posicao1; if (tamanho > 0) { //verifica se a subcategoria já existe associada a categoria do anuncio SubcategoriaAnuncio tempSubcategoria = subcategoriaAnuncios.FirstOrDefault(m => m.CategoriaAnuncioId == categoriaId && m.Nome == anuncio.Substring(posicao1, tamanho)); if (tempSubcategoria != null) { anuncioUnico.SubcategoriaAnuncioId = tempSubcategoria.Id; } else { //cadastrar nova subcategoria tempSubcategoria = new SubcategoriaAnuncio(); lastSubcategoriaAnuncioId++; tempSubcategoria.Id = lastSubcategoriaAnuncioId; tempSubcategoria.Nome = anuncio.Substring(posicao1, tamanho); tempSubcategoria.CategoriaAnuncioId = categoriaId; subcategoriaAnuncios.Add(tempSubcategoria); novasSubcategoriaAnuncios.Add(tempSubcategoria); anuncioUnico.SubcategoriaAnuncioId = tempSubcategoria.Id; } } } if (anuncioUnico.SubcategoriaAnuncioId > 0) { //imagens posicao1 = anuncio.IndexOf("lkx530-4 hXBoAC"); while (posicao1 > -1) { posicao1 += 27; tamanho = anuncio.IndexOf("alt=", posicao1) - 2 - posicao1; if (tamanho > 0) { Uri uriResult; string uriTmp = anuncio.Substring(posicao1, tamanho); bool result = Uri.TryCreate(uriTmp, UriKind.Absolute, out uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps); if (result) { anuncioUnico.Fotos.Add(new Foto { Link = uriTmp }); } } posicao1 = anuncio.IndexOf("lkx530-4 hXBoAC", posicao1); } //Descricao posicao1 = anuncio.IndexOf("sc-1sj3nln-1 eOSweo sc-ifAKCX cmFKIN"); posicao1 = anuncio.IndexOf("weight", posicao1) + 13; tamanho = anuncio.IndexOf("/span", posicao1) - 1 - posicao1; if (tamanho > 0) { anuncioUnico.Descricao = anuncio.Substring(posicao1, tamanho); } //Titulo posicao1 = anuncio.IndexOf("og:title"); if (posicao1 > 0) { posicao1 += 19; tamanho = anuncio.IndexOf("/><meta", posicao1) - 1 - posicao1; if (tamanho > 0) { anuncioUnico.Titulo = anuncio.Substring(posicao1, tamanho); } } //Data Publicação posicao1 = anuncio.IndexOf(";listTime") + 22; tamanho = 10; anuncioUnico.DtPublicacao = DateTime.ParseExact(anuncio.Substring(posicao1, tamanho), "yyyy-MM-dd", CultureInfo.InvariantCulture); //preço posicao1 = anuncio.IndexOf("price") + 8; tamanho = anuncio.IndexOf(",", posicao1) - 1 - posicao1; if (tamanho > 0) { anuncioUnico.VlAnunciado = Int32.Parse(anuncio.Substring(posicao1, tamanho)); } //UF if (anuncioUnico.Link.Length > 0) { anuncioUnico.UF = anuncioUnico.Link.Substring(8, 2).ToUpper(); } //bairro posicao1 = anuncio.IndexOf("Bairro<"); if (posicao1 > 0) { posicao1 = anuncio.IndexOf("<dd ", posicao1); posicao1 = anuncio.IndexOf(">", posicao1) + 1; tamanho = anuncio.IndexOf("</dd>", posicao1) - posicao1; if (tamanho > 0) { anuncioUnico.Bairro = anuncio.Substring(posicao1, tamanho); } } else { posicao1 = anuncio.IndexOf("Município<"); if (posicao1 > 0) { posicao1 = anuncio.IndexOf("<dd ", posicao1); posicao1 = anuncio.IndexOf(">", posicao1) + 1; tamanho = anuncio.IndexOf("</dd>", posicao1) - posicao1; if (tamanho > 0) { anuncioUnico.Bairro = anuncio.Substring(posicao1, tamanho); } } } //telefone posicao1 = anuncio.IndexOf(";phone") + 38; tamanho = anuncio.IndexOf(""", posicao1) - posicao1; if (tamanho > 0) { anuncioUnico.Telefone = anuncio.Substring(posicao1, tamanho); } // inclusão dos dados do anuncio na lista dadosAnuncios anuncioUnico.Id = (lastId > 0) ? lastId + 1 : 1; lastId++; dadosAnuncios.Add(anuncioUnico); //OlxPay posicao1 = anuncio.IndexOf("olxPay\":{\"enabled\":true"); if (posicao1 > 0) { anuncioUnico.OlxPay = true; } else { anuncioUnico.OlxPay = false; } //OlxDelivery posicao1 = anuncio.IndexOf("olxDelivery\":{\"enabled\":true"); if (posicao1 > 0) { anuncioUnico.OlxDelivery = true; } else { anuncioUnico.OlxDelivery = false; } } } } catch (Exception e) { Progresso.MensagemErro = "Erro ProcessamentoDadosDoAnuncio"; //e.Message + e.StackTrace; } return(null); }
//Atualizar anuncios public async Task <bool> AtualizarAnuncios(String urlOlx, int numPaginas) { Uri uriResult; string uriTmp = urlOlx; bool result = Uri.TryCreate(uriTmp, UriKind.Absolute, out uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps); if (result && Progresso.EtapaAnuncio == 0 && Progresso.EtapaPagina == 0 && numPaginas > 0) { //barra de progresso //string[] texto = new string[qntPaginas]; qntPaginas = numPaginas; Progresso.QuantidadePaginas = qntPaginas; Progresso.QuantidadeAnuncios = 0; Progresso.EtapaPagina = 1; Progresso.Estagio = "Páginas"; Progresso.Gravado = false; int posicao = 0; int posicaoInicial = 0; int tamanho = 0; int x = 0; int qntAnuncios = 0; var anuncios = new List <Anuncio>(); var anuncioUnico = new Anuncio(); List <String> listPaginas = new List <string>(); //criar lista de páginas string link = urlOlx; // "https://df.olx.com.br/para-a-sua-casa?sf=1"; listPaginas.Add(link); for (int i = 2; i <= qntPaginas; i++) { if (urlOlx.IndexOf("?") > 0) { link = urlOlx.Substring(0, urlOlx.IndexOf("?") + 1) + "o=" + i + "&" + urlOlx.Substring(urlOlx.IndexOf("?") + 1, urlOlx.Length - (urlOlx.IndexOf("?") + 1)); listPaginas.Add(link); } else { link = urlOlx + "?o=" + i; listPaginas.Add(link); } } //baixar páginas await getPaginas(listPaginas); //BUSCAR ANUNCIOS //barra de progresso //qntAnuncios = 10; // limitar a quantidade de anuncios Progresso.QuantidadeAnuncios = qntAnuncios; Progresso.EtapaAnuncio = 1; Progresso.Estagio = "Anuncios"; dadosAnuncios = new List <Anuncio>(); //listar idanuncios, categorias e subcategorias atuais no bd var idAnunciosCadastrados = (from item in _context.Anuncio select new { item.IdAnuncio }).ToList(); categoriaAnuncios = await _context.CategoriaAnuncio.ToListAsync(); subcategoriaAnuncios = await _context.SubcategoriaAnuncio.ToListAsync(); //Total de anuncios String agrupaPaginas = string.Join(",", conteudoPaginas.ToArray()); string pattern = @"\bdata-lurker_list_id\b"; Regex rgx = new Regex(pattern); qntAnuncios = rgx.Matches(agrupaPaginas).Count(); qntAnuncios = 0; foreach (String item in conteudoPaginas) { x = 0; posicaoInicial = 0; posicao = 0; while (item.IndexOf("data-lurker_list_id", x) > -1) { x = item.IndexOf("data-lurker_list_id", x); x++; qntAnuncios++; posicaoInicial = item.IndexOf("data-lurker_list_id", posicaoInicial) + 10; //IdAnuncio posicao = item.IndexOf("data-lurker_list_id", posicao) + 21; tamanho = item.IndexOf("data-lurker", posicao) - 2 - posicao; if (tamanho > 0) { anuncioUnico.IdAnuncio = item.Substring(posicao, tamanho); } //verifica se o anuncio já está cadastrado //if (_context.Anuncio.FirstOrDefault(o => o.IdAnuncio == anuncioUnico.IdAnuncio) != null) if (idAnunciosCadastrados.FirstOrDefault(o => o.IdAnuncio == anuncioUnico.IdAnuncio) != null) { qntAnuncios--; } else { //Link posicao = item.IndexOf("olx.com.br", posicao) - 11; tamanho = item.IndexOf(" target=", posicao) - 1 - posicao; if (tamanho > 0) { uriTmp = item.Substring(posicao, tamanho); result = Uri.TryCreate(uriTmp, UriKind.Absolute, out uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps); if (result) { listaLinksAnuncios.Add(uriTmp); } else { qntAnuncios--; } } } } } idAnunciosCadastrados.Clear(); //BUSCAR ANUNCIOS Progresso.QuantidadeAnuncios = qntAnuncios; //Busca o último Id Anuncio novoAnuncio = await _context.Anuncio.OrderByDescending(o => o.Id).FirstOrDefaultAsync(); lastId = (novoAnuncio != null) ? novoAnuncio.Id : 0; CategoriaAnuncio novoCategoriaAnuncio = await _context.CategoriaAnuncio.OrderByDescending(o => o.Id).FirstOrDefaultAsync(); lastCategoriaAnuncioId = (novoCategoriaAnuncio != null) ? novoCategoriaAnuncio.Id : 0; SubcategoriaAnuncio novoSubcategoriaAnuncio = await _context.SubcategoriaAnuncio.OrderByDescending(o => o.Id).FirstOrDefaultAsync(); lastSubcategoriaAnuncioId = (novoSubcategoriaAnuncio != null) ? novoSubcategoriaAnuncio.Id : 0; //baixar anuncios await getAnuncios(listaLinksAnuncios); ////Extrair dados dos anuncios await getDadosAnuncios(conteudoAnuncios); //savar anuncios no banco de dados _context.Anuncio.AddRange(dadosAnuncios); try { //salvar categoria e subcategoria if (novasCategoriaAnuncios.Count > 0) { _context.CategoriaAnuncio.AddRange(novasCategoriaAnuncios); } //salvar categoria e subcategoria if (novasSubcategoriaAnuncios.Count > 0) { _context.SubcategoriaAnuncio.AddRange(novasSubcategoriaAnuncios); } await _context.SaveChangesAsync(); } catch (DbUpdateException e) { Progresso.MensagemErro = e.Message; } //foreach (Anuncio item in dadosAnuncios) //{ // _context.Add(item); // _context.SaveChanges(); //} Thread.Sleep(3000); Progresso.Gravado = true; Progresso.EtapaDados = 0; Progresso.EtapaAnuncio = 0; Progresso.EtapaPagina = 0; Progresso.MensagemErro = ""; conteudoPaginas.Clear(); listaLinksAnuncios.Clear(); conteudoAnuncios.Clear(); dadosAnuncios.Clear(); idAnunciosCadastrados.Clear(); categoriaAnuncios.Clear(); subcategoriaAnuncios.Clear(); lastId = 0; //Progresso.Estagio = ""; return(true); } return(true); }