Parsing e raspagem de dados em C#: quando Python não é a única escolha
\n\nSe você está acostumado a pensar que parsing é prerrogativa do Python com seus BeautifulSoup e Scrapy, tenho uma surpresa para você. C# no mundo do web scraping é como um canivete suíço: poderoso, confiável e com várias lâminas que você nem imaginava. O parsing em C# abre portas para integração com o ecossistema .NET, aplicações de alto desempenho e tipagem forte que evita erros bobos durante a compilação.
\n\nNeste artigo, mostrarei como usar C# para coleta de dados, analisarei exemplos reais de código e explicarei por que seu próximo parser deve ser escrito em C#, mesmo que você nunca tenha pensado nisso antes.
\n\nPor que C# e não Python? Três argumentos de ferro
\n\nSim, Python é o rei da prototipagem. Mas quando se trata de raspagem industrial de dados em C#, você obtém:
\n\n- \n
- Desempenho: C# é compilado para código de máquina (via JIT ou AOT), proporcionando um ganho de velocidade de 2 a 5 vezes no parsing de grandes volumes de dados. \n
- Segurança de tipos: Você nunca passará um número onde se espera uma string. O compilador detectará o erro antes da execução. \n
- Ecossistema .NET: Um parser em C# se integra facilmente com ASP.NET, WPF, utilitários de console e até Unity (sim, é possível raspar dados de um jogo). \n
E o principal: C# lida muito bem com tarefas que exigem parsing multithread, trabalho com bancos de dados e lógica complexa de extração de informações.
\n\nFerramentas: escolhendo a biblioteca para parsing em C#
\n\nO parsing de sites em C# começa com a escolha da ferramenta certa. Destacarei três abordagens principais que cobrem 95% das tarefas de web scraping.
\n\nHtmlAgilityPack: o clássico do parsing de HTML
\n\nEsta é a biblioteca mais popular para parsing em C#. Ela transforma HTML em uma estrutura de árvore, fácil de manipular com XPath ou LINQ. Ideal para páginas estáticas.
\n\nusing HtmlAgilityPack;\n\nvar web = new HtmlWeb();\nvar doc = web.Load("https://example.com/articles");\n\n// Seleciona todos os títulos h2 com a classe "title"\nvar titles = doc.DocumentNode\n .SelectNodes("//h2[@class='title']")\n .Select(node => node.InnerText.Trim())\n .ToList();\n\nforeach (var title in titles)\n{\n Console.WriteLine($"Título encontrado: {title}");\n}\n\nEste código carrega a página, faz o parsing e coleta os títulos. O HtmlAgilityPack lida com HTML malformado, corrigindo tags não fechadas — algo comum em sites reais.
\n\nAngleSharp: a alternativa moderna
\n\nAngleSharp é uma biblioteca mais recente que suporta seletores CSS (como no jQuery) e trabalha com o modelo DOM. O parsing de dados em C# com AngleSharp parece natural para quem conhece JavaScript.
\n\nusing AngleSharp;\nusing AngleSharp.Html.Parser;\n\nvar context = BrowsingContext.New(Configuration.Default);\nvar parser = context.GetService<IHtmlParser>();\n\nvar document = await parser.ParseDocumentAsync(htmlString);\nvar prices = document.QuerySelectorAll(".product-price")\n .Select(el => el.TextContent.Trim())\n .ToList();\n\nAngleSharp é excelente quando você precisa não apenas coletar dados, mas também realizar manipulações no DOM — por exemplo, substituir atributos antes de salvar.
\n\nSelenium WebDriver: para sites dinâmicos
\n\nQuando o site carrega conteúdo via JavaScript (React, Vue, Angular), um parser comum não adianta. É aqui que entra o Selenium. Ele emula o funcionamento de um navegador e permite raspar dados após o carregamento completo da página.
\n\nusing OpenQA.Selenium;\nusing OpenQA.Selenium.Chrome;\n\nusing (var driver = new ChromeDriver())\n{\n driver.Navigate().GoToUrl("https://example.com/dynamic-page");\n \n // Aguarda até que o elemento apareça\n var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));\n wait.Until(d => d.FindEleme