示例#1
0
        //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("&quot", 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);
        }
示例#2
0
        //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);
        }