[ Conversar ] - Qual é a melhor linguagem para web scraping?
Se você pesquisar no ChatGPT ou no Google sobre a melhor linguagem para raspagem de dados, provavelmente encontrará Python ou JavaScript como as mais recomendadas, devido à ampla disponibilidade de bibliotecas. No entanto, ao realizar alguns projetos, percebi que o processo de raspagem de dados pode ser bem lento, às vezes levando minutos para obter pouca informação.
Acredito que seja possível melhorar esse desempenho. Não sei se a linguagem é realmente o gargalo na performance, mas estou considerando testar outras, como Elixir, C++ e Rust, embora essas provavelmente não possuam tantas bibliotecas para esse propósito.
Atualmente, tenho mais conhecimento em JavaScript e Python. Portanto, se você souber de alguma outra linguagem que possa ser adequada para este caso, ficarei contente em saber.
Você precisa medir onde está o gargalo, se a demora se dá por que os sites estão demorando a responder, mudar a linguagem não vai alterar o resultado.
Acredito que primeiro você precisa fazer essa medição para depois decidir qual caminho tomar.
Eu já usei raspagem de dados com Python, JS e Rust. Acho que é uma questão de preferencia, se você quer uma coisa super otimizada vá com uma linguagem de maior controle de memória como Go, Rust ou C... Maaas se vc busca facilidade em montar seus scripts, vá de JS pois webscrapping com ele é uma coisa muito natural pois ele foi criado para manipular HTML e CSS. Com JS eu gosto de usar o Puppeter, mas tem várias formas de fazer.
Acho que não tem uma que se destaque nessa tarefa, mas se fosse pra escolher uma única não tem como não ser javascript, por ser a linguagem da web, então se precisar rodar algo no console ja usa a mesma linguagem
Nos meus projetos tenho usado Python e JavaScript.
Não sei se terá grande diferença de desempenho (ainda não testei), mas uns dias atrás pesquisando sobre Go, encontrei esse framework:https://github.com/gocolly/colly
Gosto de usar C#, com Multithreading
desse modo, consigo rodar 50 requisições ao mesmo tempo, exemplo...
Eu usei C# com .net 8, usando a biblioteca html agility pack. Funciona muito bem, mas apesar disso, você precisa saber o de está seu gargalo, se é no seu algoritmo, na rede ou na máquina que você usa
Acredito que as ferramentas que o JS
e o Python
oferecem são suficientes para a maioria dos casos. Dão suporte para requisições async
, por exemplo, e isso pode melhorar bastante o seu processo de coleta. Além da vastidão de libs que auxiliam, de maneira eficiente, nesse processo.
Não sei se é o seu caso, mas há alguns outros pontos relevantes para a discussão:
- análise da aplicação: uma análise um pouco mais profunda pode lhe levar a um caminho mais simples e curto do que o scraping. um exemplo é a busca, lá no DevTools mesmo, por respostas no formato JSON. isso pode ser um indício de que a aplicação principal esteja fazendo requisições para uma api pública.
- ferramenta correta: esse tópico DEVE ser uma consequência do primeiro tópico. usar o
Selenium
/Puppeteer
para um site com API disponível, mesmo que sem documentação oficial, é um desperdício de recursos. por isso, concordo querequests
eBeautifulSoup
, noPython
, e as funções nativas noJS
, resolvem a maioria dos problemas deweb scraping
. - otimização do código: não adianta utilizar a "melhor linguagem" com as "melhores libs" e não se preocupar em como transformar e armazenar os dados. isso se torna uma preocupação maior ainda se for um grande volume de dados.
Por experiência própria, acredito que esses pontos são fundamentais quando o assunto é coleta de dados em geral.
Depende do que você está precisa fazer com esses dados.
Meu exemplo:
Precisava coletar dados e manipular de forma a gerar planilhas no Excel. Sendo assim, optei em fazer o script em Python por conta da lib do Pandas. Utilizei o Scrapy e o Playwright em conjunto.
Pense no que você está tentando alcançar para decidir qual ferramenta utilizar.
Tem alguns fatores que podem dificultar a raspagem de dados:
- Tem a linguagem (mas acho dificil);
- Tem o framework / biblioteca;
- Tem a conexão com a internet;
- Tem a quantidade de dados a serem raspados;
- Tem o próprio site que pode ter mecanismos que impedem/dificultam a vida de quem quer raspar dados, muitos e-commerces implementam coisas assim, principalmente bloqueando o IP.
Concordo que langs como Rust, Go, C++ sao bem mais performaticas do que JS e Python, um otimo exemplo disso são os lintters que tem surgido pra JS como BiomeJS que é extremamente rapido (segundo o próprio site até 35x mais rapido) escrito em Rust.
Mas nesse caso eu não trocaria de lang, Python e JS são as melhores langs pra Web Scrappig pela facilidade e é o que voce tem conhecimento, o que adianta trocar pra Go ou Rust e quando prescisar fazer algo mais complexo ou algo até simples e não conseguir devido a falta de conhecimento com a lang? Isso nao é resolver o problema é só trocar de problema, procure formas de otimização, Javascript e Python são extremamente poderosos...
Como já falaram em outros comentários, às vezes não é a linguagem, até porque Python vai resolver seus problemas e vai ser muito mais simples do que aprender uma linguagem nova. Com esse pensamento, todo problema de performance seria resolvido em Go, C ou Rust. Se você já sabe Python e JavaScript, tente se aprofundar mais para otimizar o que você já tem.
Tudo vai depender do teu uso, eu por exemplo utilizo PHP para fazer o webscraping. Trabalho diretamente só com o HTML da página e é extremamente rápido e fácil para dar manutenção. Já cheguei a tentar utilizar Go, mas não continuei por conhecer muito pouco a linguagem, o que acabou sendo uma barreira quando precisei fazer coisas mais complexas.
O tempo de resposta da requisição de cada página que você navegar não irá mudar, independente da linguagem.
Não adianta trocar de linguagem pra web scraping. Web scraping, por definição, precisa navegar na web. Navegar na web é lento. Então mesmo se Rust for 100 vezes mais rápido no processamento do que o Python, nos dois casos você ainda vai precisar esperar a resposta da requisição pra conseguir extrair as informações que você precisa. E é essa parte que demora mais - ordens de magnitude maior, a ponto de ser negligente o tempo de processamento da linguagem.
Um exemplo: Se pra processar um dado vc leva 0.0001s no Rust, e 0.01s no Python, no Rust à princípio parece que terminaria em 0.1s pra processar 1000 dados, e o Python demoraria 10s, né? Mas com web scraping não é assim que funciona.
Na verdade, se pra cada dado você precisar entrar em uma página diferente, e cada página levar 1s pra carregar, você esperaria 1000.1s no Rust (16 minutos e 40.1 segundos), e 1010s no Python (16 minutos e 50 segundos). Então, na prática, pra essa aplicação de web scraping em específico, não adianta trocar de linguagem - a diferença de tempo é muito pequena pra valer a pena trocar seu código inteiro.
Gaste seu tempo tentando fazendo outras práticas no lugar: fazendo as requisições de forma paralela, assíncrona; utilizando estruturas de dados adequadas; etc. Se você tiver certeza que o problema é no processamento, e não nas requisições (o que é MUITO pouco provável), então você pode usar biibliotecas de Python específicas para o processamento dos dados. Por exemplo, o Pandas é famoso porque ele processa tudo em C++ por trás, e por isso pode chegar a ser até 600x mais eficiente do que você fazer um for-loop em Python, por exemplo (se você fizer tudo certo no Pandas).
Enfim. Evite trocar de linguagem sem antes entender exatamente o problema que você tem atualmente.
javascript e Python por causa das ferramentas
Qualquer linguagem que tenha uma implementação do Selenium serve