private bool DoINeedToExtract(DocLinkInfo link, FinInfoTipo tipo, FinInfoCategoria categoria) { log.Info($"Obtendo {categoria} {tipo} - {Company.RazaoSocial} - {link.Data.ToString("dd/MM/yyyy")}"); Console.WriteLine($"Obtendo {categoria} {tipo} - {Company.RazaoSocial} - {link.Data.ToString("dd/MM/yyyy")}"); bool shouldExtract = true; // se não existir o arquivo ou // se o arquivo existir mas a data de entrega do arquivo for menor que a data do arquivo var fileinfo = new FileInfo(Company.GetFinDataFileName(link, categoria, tipo)); log.Info($"Verificando se é necessário extrair {categoria} {tipo}"); Console.WriteLine($"Verificando se é necessário extrair {categoria} {tipo}"); if (fileinfo.Exists && fileinfo.LastWriteTime > link.DataApresentacao) { shouldExtract = false; } if (!shouldExtract) { Console.WriteLine($"Empresa {Company.RazaoSocial} não necessita extrair {link.DocType} {link.Data.ToString("dd/MM/yyyy")} -{categoria} {tipo}"); log.Info($"Empresa {Company.RazaoSocial} não necessita extrair {link.DocType} {link.Data.ToString("dd/MM/yyyy")} - {categoria}{tipo}"); } return(shouldExtract); }
public bool DoINeedToExtractAny(DocLinkInfo link) { // método usado para acelerar a extração if (DoINeedToExtract(link, FinInfoTipo.Individual, FinInfoCategoria.Ativo)) { return(true); } if (DoINeedToExtract(link, FinInfoTipo.Individual, FinInfoCategoria.Passivo)) { return(true); } if (DoINeedToExtract(link, FinInfoTipo.Individual, FinInfoCategoria.DRE)) { return(true); } if (DoINeedToExtract(link, FinInfoTipo.Consolidado, FinInfoCategoria.Ativo)) { return(true); } if (DoINeedToExtract(link, FinInfoTipo.Consolidado, FinInfoCategoria.Passivo)) { return(true); } if (DoINeedToExtract(link, FinInfoTipo.Consolidado, FinInfoCategoria.DRE)) { return(true); } if (DoINeedToExtractComposicaoCapital(link)) { return(true); } return(false); }
public static string GetFinDataCapitalFileName(this ScrappedCompany c, DocLinkInfo link) { string date = link.Data.ToString("yyyyMMdd"); string file = $"{c.CodigoCVM}.{link.DocType}.{date}.CapitalConsolidado.json"; string path = Path.Combine($"{Program.FINDATA_DIR}", c.CodigoCVM.ToString()); return(Path.Combine(path, file)); }
public static string GetFinDataFileName(this ScrappedCompany c, DocLinkInfo link, FinInfoCategoria categoria, FinInfoTipo tipo) { string date = link.Data.ToString("yyyyMMdd"); string file = $"{c.CodigoCVM}.{link.DocType}.{date}.{categoria}.{tipo}.json"; string path = Path.Combine($"{Program.FINDATA_DIR}", c.CodigoCVM.ToString()); return(Path.Combine(path, file)); }
private async Task <string> GetAsync(DocLinkInfo link, string url) { IEnumerable <Cookie> cookies = null; // é necessário obter os cookies antes da chamada if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa) { if (CookiesBovespa == null) { var tuple = await GetCookiesForBovespaAsync(link); CookiesBovespa = tuple.Item1; } cookies = CookiesBovespa; } else //cvm { if (CookiesCvm == null) { var tuple = await GetCookiesForCvmAsync(link); CookiesCvm = tuple.Item1; } cookies = CookiesCvm; } var container = new CookieContainer(); var handler = new HttpClientHandler(); handler.CookieContainer = container; var client = new HttpClient(handler); foreach (var cookie in cookies) { log.Info($"Cookie name: {cookie.Name}; value: {cookie.Value}"); handler.CookieContainer.Add(new Uri(url), cookie); } if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa) { // bovespa possui encoding "windows-1252" var encoding = Encoding.GetEncoding(1252); return(await client.GetStringWithRetryAsync(url, encoding)); } return(await client.GetStringWithRetryAsync(url)); }
public async Task ScrapComposicaoCapital(DocLinkInfo link) { if (!DoINeedToExtractComposicaoCapital(link)) { return; } var fileinfo = new FileInfo(Company.GetFinDataCapitalFileName(link)); var url = ""; if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa) { url = "http://www2.bmfbovespa.com.br/dxw/FormDetalheDXWG1CompCapital.asp"; } else //cvm { var codTipoDocumento = 0; if (link.DocType == DocInfoType.ITR) { codTipoDocumento = 3; } if (link.DocType == DocInfoType.DFP) { codTipoDocumento = 4; } url = $"https://www.rad.cvm.gov.br/ENETCONSULTA/frmDadosComposicaoCapitalITR.aspx?Grupo=&Quadro=&NomeTipoDocumento=&Titulo=&Empresa=&DataReferencia=&Versao=&CodTipoDocumento={codTipoDocumento}&NumeroSequencialDocumento={link.NumeroSequencialDocumento}&NumeroSequencialRegistroCvm={Company.CodigoCVM}&CodigoTipoInstituicao=2"; } var content = await GetAsync(link, url); ComposicaoCapital capital = null; if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa) { capital = ParseComposicaoCapitalBovespa(content); } else //cvm { capital = ParseComposicaoCapitalCvm(content); } capital.Save(fileinfo.FullName); }
private string GetBalancoAtivoUrl(DocLinkInfo link, FinInfoTipo tipo) { // deve primeiro acessar a url para obter os cookies var url = ""; if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa) { // itr ou dfp - mesma url if (tipo == FinInfoTipo.Individual) { url = "http://www2.bmfbovespa.com.br/dxw/FormDetalheDXWBalanco.asp?TipoInfo=C&Tipo=01 - Ativo"; } else //consolidado { url = "http://www2.bmfbovespa.com.br/dxw/FormDetalheDXWBalanco.asp?TipoInfo=T&Tipo=01%20-%20Ativo"; } } else // cvm { var codTipoDocumento = 0; if (link.DocType == DocInfoType.ITR) { codTipoDocumento = 3; } if (link.DocType == DocInfoType.DFP) { codTipoDocumento = 4; } // o numero sequencial diz se o documento é itr ou dfp if (tipo == FinInfoTipo.Individual) { url = $"https://www.rad.cvm.gov.br/ENETCONSULTA/frmDemonstracaoFinanceiraITR.aspx?Informacao=1&Demonstracao=2&Periodo=0&Grupo=&Quadro=&NomeTipoDocumento=&Titulo=&Empresa=&DataReferencia=&Versao=&CodTipoDocumento={codTipoDocumento}&NumeroSequencialDocumento={link.NumeroSequencialDocumento}&NumeroSequencialRegistroCvm={Company.CodigoCVM}&CodigoTipoInstituicao=2"; } else { url = $"https://www.rad.cvm.gov.br/ENETCONSULTA/frmDemonstracaoFinanceiraITR.aspx?Informacao=2&Demonstracao=2&Periodo=0&Grupo=&Quadro=&NomeTipoDocumento=&Titulo=&Empresa=&DataReferencia=&Versao=&CodTipoDocumento={codTipoDocumento}&NumeroSequencialDocumento={link.NumeroSequencialDocumento}&NumeroSequencialRegistroCvm={Company.CodigoCVM}&CodigoTipoInstituicao=2"; } } return(url); }
private bool DoINeedToExtractComposicaoCapital(DocLinkInfo link) { log.Info($"Obtendo Composição de Capital - {Company.RazaoSocial} - {link.Data.ToString("dd/MM/yyyy")}"); bool shouldExtract = true; // se não existir o arquivo ou // se o arquivo existir mas a data de entrega do arquivo for menor que a data do arquivo var fileinfo = new FileInfo(Company.GetFinDataCapitalFileName(link)); log.Info("Verificando se é necessário extrair Composição do Capital"); if (fileinfo.Exists && fileinfo.LastWriteTime > link.DataApresentacao) { shouldExtract = false; } if (!shouldExtract) { Console.WriteLine($"Empresa {Company.RazaoSocial} não necessita extrair {link.DocType} {link.Data.ToString("dd/MM/yyyy")} - Capital Consolidado"); log.Info($"Empresa {Company.RazaoSocial} não necessita extrair {link.DocType} {link.Data.ToString("dd/MM/yyyy")} - Capital Consolidado"); } return(shouldExtract); }
private string GetDREUrl(DocLinkInfo link, FinInfoTipo tipo) { var url = ""; if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa) { // itr e dfp tem a mesma url if (tipo == FinInfoTipo.Individual) { url = "http://www2.bmfbovespa.com.br/dxw/FormDetalheDXWDRE.asp?TipoInfo=C"; } else { url = "http://www2.bmfbovespa.com.br/dxw/FormDetalheDXWDRE.asp?TipoInfo=T"; } } else //cvm { var codTipoDocumento = 0; if (link.DocType == DocInfoType.ITR) { codTipoDocumento = 3; } if (link.DocType == DocInfoType.DFP) { codTipoDocumento = 4; } if (tipo == FinInfoTipo.Individual) { url = $"https://www.rad.cvm.gov.br/ENETCONSULTA/frmDemonstracaoFinanceiraITR.aspx?Informacao=1&Demonstracao=4&Periodo=0&Grupo=&Quadro=&NomeTipoDocumento=&Titulo=&Empresa=&DataReferencia=&Versao=&CodTipoDocumento={codTipoDocumento}&NumeroSequencialDocumento={link.NumeroSequencialDocumento}&NumeroSequencialRegistroCvm={Company.CodigoCVM}&CodigoTipoInstituicao=2"; } else { url = $"https://www.rad.cvm.gov.br/ENETCONSULTA/frmDemonstracaoFinanceiraITR.aspx?Informacao=2&Demonstracao=4&Periodo=0&Grupo=&Quadro=&NomeTipoDocumento=&Titulo=&Empresa=&DataReferencia=&Versao=&CodTipoDocumento={codTipoDocumento}&NumeroSequencialDocumento={link.NumeroSequencialDocumento}&NumeroSequencialRegistroCvm={Company.CodigoCVM}&CodigoTipoInstituicao=2"; } } return(url); }
public async Task ScrapDoc(DocLinkInfo link, FinInfoTipo tipo, FinInfoCategoria categoria) { if (!DoINeedToExtract(link, tipo, categoria)) { return; } var fileinfo = new FileInfo(Company.GetFinDataFileName(link, categoria, tipo)); var url = ""; if (categoria == FinInfoCategoria.Ativo) { url = GetBalancoAtivoUrl(link, tipo); } if (categoria == FinInfoCategoria.Passivo) { url = GetBalancoPassivoUrl(link, tipo); } if (categoria == FinInfoCategoria.DRE) { url = GetDREUrl(link, tipo); } var content = await GetAsync(link, url); var fininfo = ParseFinInfo(content, link.LinkType, categoria, tipo); if (fininfo == null) { Console.WriteLine($"Empresa {Company.RazaoSocial} não possui dado {link.DocType} {link.Data.ToString("dd/MM/yyyy")} -{categoria} {tipo}"); log.Info($"Empresa {Company.RazaoSocial} não possui dado {link.DocType} {link.Data.ToString("dd/MM/yyyy")} -{categoria} {tipo}"); return; } fininfo.Save(fileinfo.FullName); }
private async Task <Tuple <IEnumerable <Cookie>, HttpContent> > GetCookiesForCvmAsync(DocLinkInfo info) { var url = "http://www.rad.cvm.gov.br/ENETCONSULTA/frmGerenciaPaginaFRE.aspx?NumeroSequencialDocumento=65179&CodigoTipoInstituicao=2"; log.Info($"Acessando url para obtenção dos cookies"); log.Info($"url = {url}"); var container = new CookieContainer(); var handler = new HttpClientHandler(); handler.CookieContainer = container; var client = new HttpClient(handler); var response = await client.GetAsync(url); var cookies = container.GetCookies(new Uri(url)).Cast <Cookie>().ToList(); var result = Tuple.Create <IEnumerable <Cookie>, HttpContent>(cookies, response.Content); return(await Task.FromResult(result)); }
private async Task <Tuple <IEnumerable <Cookie>, HttpContent> > GetCookiesForBovespaAsync(DocLinkInfo info) { // codificar para url var razao = WebUtility.UrlEncode(Company.RazaoSocial); var pregao = WebUtility.UrlEncode(Company.NomePregao); var data = info.Data.ToString("dd/MM/yyyy"); int tipo = 0; if (info.DocType == DocInfoType.ITR) { tipo = 4; } if (info.DocType == DocInfoType.DFP) { tipo = 2; } var url = $"http://www2.bmfbovespa.com.br/dxw/FrDXW.asp?site=B&mercado=18&razao={razao}&pregao={pregao}&ccvm={Company.CodigoCVM}&data={data}&tipo={tipo}"; log.Info($"Acessando url para obtenção dos cookies"); log.Info($"url = {url}"); var container = new CookieContainer(); var handler = new HttpClientHandler(); handler.CookieContainer = container; var client = new HttpClient(handler); var response = await client.GetAsync(url); var cookies = container.GetCookies(new Uri(url)).Cast <Cookie>().ToList(); var result = Tuple.Create <IEnumerable <Cookie>, HttpContent>(cookies, response.Content); return(await Task.FromResult(result)); }
public async Task <AvailableDocs> GetAvailableDocs(DocLinkInfo link) { // esse método obtem os documentos disponíveis // isso é para saber se existem as DFs Consolidadas ou somente as individuais // Esse método aproveita a chamada e armazena os cookies var availableDocs = new AvailableDocs(); string contentstring = ""; if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa) { var tuple = await GetCookiesForBovespaAsync(link); CookiesBovespa = tuple.Item1; // docs disponiveis var url = "http://www2.bmfbovespa.com.br/dxw/DXWMenuBotoes.asp"; contentstring = await GetAsync(link, url); } else //cvm { var tuple = await GetCookiesForCvmAsync(link); CookiesCvm = tuple.Item1; // docs disponiveis contentstring = await tuple.Item2.ReadAsStringAsync(); } HtmlParser parser = new HtmlParser(); var doc = parser.Parse(contentstring); if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa) { var map = doc.QuerySelector("map"); var consolidados = map.Children.Where(c => c.GetAttribute("alt").Contains("Consolidado")); foreach (var item in consolidados.Where(i => i.GetAttribute("alt").Contains("Balanço Patrimonial Consolidado"))) { var href = item.GetAttribute("href"); if (href.Contains("Não Apresentado")) { availableDocs.AtivoConsolidado = false; availableDocs.PassivoConsolidado = false; availableDocs.DREConsolidado = false; Console.WriteLine($"Empresa não possui consolidados de {link.Data.ToString("dd/MM/yyyy")}"); } } } else { var divs = doc.QuerySelectorAll("div.ComboBoxItem_CVM"); // se não tem nenhum div com o texto Consolidado/a if (!divs.Any(d => d.TextContent.Contains("Consolidad"))) { availableDocs.AtivoConsolidado = false; availableDocs.PassivoConsolidado = false; availableDocs.DREConsolidado = false; Console.WriteLine($"Empresa não possui consolidados de {link.Data.ToString("dd/MM/yyyy")}"); } } return(availableDocs); }