Web Scraping em Ruby: O melhor tutorial

Raluca Penciuc em Jan 15 2023

Não vamos esquecer que, com o passar dos anos, o volume de dados da Internet vai continuar a aumentar. A situação está fora do controlo de qualquer pessoa, mas será isso realmente uma coisa má?

Especialmente na última década, a raspagem da Web ganhou enorme popularidade. Para serem bem sucedidas no mundo dos negócios atual, as empresas precisam de estratégias adequadas, que requerem uma grande quantidade de informação num curto espaço de tempo. Além disso, pode ser uma boa maneira de os programadores melhorarem as suas capacidades de codificação E ajudarem a empresa.

Se joga na equipa Ruby mas não tem muito a ver com web scraping, este artigo vai dar-lhe um novo nicho para explorar: construir o seu próprio web scraper.

Compreender a raspagem da Web

Tomemos como exemplo uma plataforma de comparação de preços. A sua função é obter o custo de uma multiplicidade de artigos de vários retalhistas em linha. Mas porquê ficar-se pelos produtos físicos? Os sectores dos transportes aéreos e da hotelaria também se tornaram muito mais amigos do consumidor, graças aos sítios de comparação. Então, como é que estes sites ou aplicações mágicas funcionam? Através de web scraping, claro!

Provavelmente, está a perguntar-se agora: "De que outra forma poderei utilizar estes dados?". Vamos então ver algumas das aplicações práticas da recolha de dados da Web:

Este artigo bem escrito que aborda a raspagem da Web fornece descrições detalhadas e casos de utilização adicionais.

Os Web scrapers não são fáceis de criar, mesmo que se compreenda como funcionam e os potenciais benefícios que podem proporcionar. Há muitas formas de os sítios Web identificarem e bloquearem o acesso dos bots aos seus dados.

A título de exemplo, eis alguns:

  • Bloqueio geográfico: Poderão ser apresentados resultados específicos de uma região quando se pede informações de outra área (por exemplo, preços de bilhetes de avião).
  • Bloqueio de IP: Um sítio Web pode bloqueá-lo ou torná-lo mais lento quando determina que está a fazer pedidos repetidos a partir de um determinado endereço IP;
  • Honeypots: Os seres humanos não conseguem ver as ligações dos honeypots, mas os bots conseguem; quando os robots caem na armadilha, o seu endereço IP é bloqueado;
  • CAPTCHAs: As pessoas conseguem resolver estes problemas lógicos simples de forma relativamente rápida, mas os scrapers consideram-nos frequentemente difíceis;

Não é uma tarefa fácil ultrapassar todos estes obstáculos. Não é assim tão difícil construir um simples bot, mas criar um excelente web scraper é um pouco mais desafiante. Por isso, ao longo da última década, as APIs para raspagem da Web tornaram-se um dos tópicos mais quentes.

O conteúdo HTML de qualquer website pode ser recolhido utilizando o WebScrapingAPI, e todos os problemas que mencionámos anteriormente serão automaticamente resolvidos. Além disso, utilizamos o Amazon Web Services para garantir velocidade e escalabilidade. Parece interessante, certo? Bem, não se fique apenas pelo som! Experimente por si próprio com as 5000 chamadas gratuitas à API que recebe como parte da avaliação gratuita do WebScrapingAPI.

Compreender a Web

É necessário compreender o Protocolo de Transferência de Hipertexto (HTTP) para compreender a Web. Este protocolo explica como um servidor e um cliente comunicam. Uma mensagem contém informações que descrevem o cliente e a forma como este trata os dados: método, versão HTTP e cabeçalhos.

Para os pedidos HTTP, os Web scrapers utilizam o método GET para obter dados do servidor. Além disso, existem alguns métodos avançados, como POST e PUT. Os métodos HTTP são detalhados aqui para sua referência.

Nos cabeçalhos HTTP, pode ser encontrada uma variedade de informações adicionais sobre pedidos e respostas. Para a recolha de dados da Web, estas são as que interessam:

  • User-Agent: os web scrapers baseiam-se neste cabeçalho para fazer com que os seus pedidos pareçam mais realistas; contém informações como a aplicação, o sistema operativo, o software e a versão.
  • Cookie: o servidor e o pedido podem trocar informações confidenciais (como fichas de autenticação).
  • Referrer: contém o sítio de origem que o utilizador visitou; por conseguinte, é essencial ter este facto em consideração.
  • Anfitrião: identifica o anfitrião ao qual se está a ligar.
  • Accept: fornece um tipo de resposta para o servidor (por exemplo, text/plain, application/json).

Compreender o Ruby

Ruby é uma linguagem de programação multiparadigma de alto nível que também é totalmente interpretável. Isto significa que o código do programa é armazenado em texto simples, que é transmitido ao interpretador que o executa.

Em 1995, Yukihiro Matsumoto (também conhecido como Matz na comunidade Ruby) combinou caraterísticas de diferentes linguagens de programação, como Perl, Lisp e Smalltalk, para criar uma nova linguagem que se centra na simplicidade e na produtividade.

É uma linguagem de programação de nicho, sendo a sua área natural as aplicações Web. Eis as vantagens significativas de utilizar esta linguagem nos seus projectos:

  • Obtém resultados, rapidamente. Em combinação com a estrutura Rails, pode criar software de forma relativamente rápida; é por isso que as empresas em fase de arranque preferem principalmente o Ruby para construir rapidamente os seus MVP(Produto Mínimo Viável).
  • Está bem desenvolvido e é mantido pela crescente comunidade Ruby.
  • Ferramentas e bibliotecas úteis (chamadas gemas) garantem que é fácil seguir as melhores práticas de codificação em quase todas as situações.

Por outro lado, estas vantagens não fazem do Ruby uma solução universal mágica para todos os novos softwares. Também pode considerar estas caraterísticas da linguagem antes de tomar uma decisão:

  • À medida que o seu tamanho aumenta, as aplicações construídas com Ruby tornam-se mais lentas, o que causa problemas de escalabilidade.
  • A sua área natural são as aplicações Web. Por conseguinte, não é adequado para aplicações desktop/móveis.
  • Uma vez que utiliza um intérprete, um eventual código orientado para os objectos será mais lento.

Criar o seu próprio raspador da Web

Agora podemos começar a falar sobre a extração de dados. Em primeiro lugar, precisamos de um sítio Web que forneça informações valiosas.

Passo 1: Configurar o ambiente

Para construir o nosso Ruby web scraper, precisamos primeiro de ter a certeza de que temos todos os pré-requisitos:

  • A última versão estável do Ruby: consulte o guia de instalação oficial para escolher o melhor método para o seu sistema operativo.
  • Um IDE: neste guia, utilizaremos o Visual Studio Code, uma vez que é leve e não necessita de configurações adicionais, mas pode escolher o IDE que preferir.
  • Bundler: uma ferramenta Ruby de gerenciamento de dependências (também chamada de gem);
  • Watir: uma gem alimentada por Selenium utilizada para testes automáticos, uma vez que pode imitar o comportamento do utilizador num browser;
  • Webdrivers: uma joia recomendada pela Watir que descarrega automaticamente o controlador mais recente para uma instância do browser;
  • Nokogiri: uma gem bem conhecida pela capacidade de facilitar a análise de páginas Web. Pode analisar HTML, XML, detecta documentos HTML quebrados e oferece acesso a elementos através de selectores XPath e CSS3.

Depois de configurar o ambiente Ruby, crie um novo diretório em qualquer parte do seu computador e abra-o com o IDE da sua escolha. Em seguida, execute o seguinte comando em uma janela de terminal para instalar nossa primeira gem:

> gem install bundler

Agora crie um arquivo chamado Gemfile no diretório raiz do seu projeto. Aqui vamos adicionar o resto das gemas como dependências:

source 'https://rubygems.org'

gem 'watir', '~> 6.19', '>= 6.19.1'
gem 'webdrivers', '~> 4.6'
gem 'nokogiri', '~> 1.11', '>= 1.11.7'

Agora volte para a janela do terminal e execute o seguinte comando para instalar as gemas que declarámos:

> instalar o pacote

Configuração fixe! Finalmente, basta criar um ficheiro "scraper.rb" para guardar o código do nosso web scraper. Tudo o que escrevermos aqui, podemos executar com o comando:

> ruby scraper.rb

Etapa 2: Inspecionar a página que pretende extrair

Ótimo, vamos avançar! Navegue até à página que pretende extrair e clique com o botão direito do rato em qualquer parte dela, depois clique em "Inspecionar elemento". A consola do programador irá aparecer, onde deverá ver o HTML do site.

imagem do blogue

Passo 3: Enviar um pedido HTTP e extrair o HTML

Agora, para obter esse HTML em nossa máquina local, temos que enviar uma solicitação HTTP usando Watir para retornar o documento. Vamos voltar ao IDE e colocar essa ideia no código.

Primeiro, escrever as importações de que necessitamos:

require 'watir'
require 'webdrivers'
require 'nokogiri'

Em seguida, inicializamos uma instância do browser e navegamos para o sítio Web que pretendemos extrair. Acedemos então ao HTML e passamo-lo ao construtor Nokogiri, que nos ajudará a analisar o resultado.

browser = Watir::Browser.new
browser.goto 'https://blog.eatthismuch.com/latest-articles/'
parsed_page = Nokogiri::HTML(browser.html)

File.open("parsed.txt", "w") { |f| f.write "#{parsed_page}" }

browser.close

Também escrevemos o resultado num ficheiro de texto chamado "parsed.txt" para dar uma vista de olhos ao HTML. É importante fechar a ligação depois de receber a resposta, uma vez que o processo continuará a decorrer.

Passo 4: Extrair secções específicas

Portanto, temos um documento HTML, mas queremos dados, o que significa que devemos analisar a resposta anterior em informações legíveis por humanos.

Começando com passos de bebé, vamos extrair o título do sítio Web. Um facto notável sobre o Ruby é que tudo é um objeto com muito poucas excepções, o que significa que mesmo uma simples cadeia de caracteres pode ter atributos e métodos.

imagem do blogue

Assim, podemos simplesmente aceder ao valor do título do sítio Web através dos atributos do objeto parsed_page.

puts parsed_page.title

Seguindo em frente, vamos extrair todos os links do site. Para isso, vamos utilizar um método mais genérico que analisa etiquetas específicas, o método css.

links = parsed_page.css('a')
links.map {|element| element["href"]}

puts links

Também utilizamos o método map para manter apenas as ligações com um atributo href do HTML.

Vejamos um exemplo mais realista. Precisamos de extrair os artigos do blogue, o seu título, endereço e meta descrição.

imagem do blogue

If you inspect one of the article cards, you can see that we can get the address and the article’s title through the link’s attributes. Also, the meta description is under a <div> tag with a specific class name.

Of course, there are many ways to perform this search. The one we’ll use will consist of looking for all the <div> tags with the td_module_10 class name and then iterating through each one of them to extract the <a> tags and the inner <div> tags with the td-excerpt class name.

article_cards = parsed_page.xpath("//div[contains(@class, 'td_module_10')]")

article_cards.each do |card|
title = card.xpath("div[@class='td-module-thumb']/a/@title")
link = card.xpath("div[@class='td-module-thumb']/a/@href")
meta = card.xpath("div[@class='item-details']/div[@class='td-excerpt']")
end

Sim, como já deve ter adivinhado, uma expressão XPath é o que faz o truque porque estamos a procurar elementos HTML pelos seus nomes de classe e pelos seus ascendentes.

Passo 5: Exportar os dados para CSV

Este tipo de extração pode ser benéfico quando os dados devem passar para outra aplicação, um agregador de artigos no nosso caso. Para isso, precisamos de exportar os dados analisados para um ficheiro externo.

Vamos criar um ficheiro CSV, uma vez que pode ser facilmente lido por outra aplicação e aberto com o Excel para processamento posterior. Primeiro, só mais uma importação:

requerer 'csv'

De seguida, criamos o CSV no modo "append" e envolvemos o código anterior, pelo que o nosso raspador terá o seguinte aspeto:

CSV.open("articles.csv", "a+") do |csv|
csv << ["title", "link", "meta"]

article_cards = parsed_page.xpath("//div[contains(@class, 'td_module_10')]")
article_cards.each do |card|

title = card.xpath("div[@class='td-module-thumb']/a/@title")
link = card.xpath("div[@class='td-module-thumb']/a/@href")
meta = card.xpath("div[@class='item-details']/div[@class='td-excerpt']")

csv << [title.first.value, link.first.value, meta.first.text.strip]
end
end

Fixe, é tudo! Agora podemos ver todos os dados analisados de uma forma limpa, não assustadora e fácil de encaminhar.

imagem do blogue

Conclusão e alternativas

Concluímos o nosso tutorial. Parabéns! Esperamos que este artigo lhe tenha dado muita informação sobre o web scraping e o tenha ajudado a compreendê-lo melhor.

Obviamente, esta tecnologia pode fazer muito mais do que alimentar agregadores de artigos. A chave é encontrar os dados corretos e analisá-los para encontrar novas possibilidades.

No entanto, como referi no início do artigo, os Web scrapers enfrentam inúmeros desafios. Para além de impulsionar o seu negócio, é uma grande oportunidade de aprendizagem para os programadores resolverem problemas utilizando os seus próprios Web scrapers. No entanto, pode querer reduzir os custos se precisar de concluir um projeto (tempo, dinheiro, pessoas).

Uma API dedicada a resolver estes problemas será sempre mais fácil de utilizar. Mesmo quando existem obstáculos como a renderização de Javascript, proxies, CAPTHAs e outros factores de bloqueio, a WebScrapingAPI ultrapassa todos eles e proporciona uma experiência personalizável. Se ainda não tem a certeza, porque não experimentar a opção de teste gratuito?

Notícias e actualizações

Mantenha-se atualizado com os mais recentes guias e notícias sobre raspagem da Web, subscrevendo a nossa newsletter.

We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Artigos relacionados

miniatura
GuiasComo extrair dados de produtos da Amazon: Um guia abrangente de melhores práticas e ferramentas

Explore as complexidades da extração de dados de produtos da Amazon com nosso guia detalhado. De práticas recomendadas e ferramentas como a API Amazon Scraper a considerações legais, saiba como enfrentar desafios, contornar CAPTCHAs e extrair insights valiosos com eficiência.

Suciu Dan
avatar do autor
Suciu Dan
15 min. de leitura
miniatura
Casos de utilizaçãoUtilização de Web Scraping para dados alternativos em finanças: Um guia completo para investidores

Explore o poder transformador da recolha de dados da Web no sector financeiro. Desde dados de produtos a análises de sentimentos, este guia oferece informações sobre os vários tipos de dados da Web disponíveis para decisões de investimento.

Mihnea-Octavian Manolache
avatar do autor
Mihnea-Octavian Manolache
13 min ler
miniatura
Ciência da recolha de dados da WebWeb Scraping facilitado: a importância da análise de dados

Descubra como extrair e organizar eficientemente dados para raspagem da Web e análise de dados através de análise de dados, bibliotecas de análise de HTML e metadados schema.org.

Suciu Dan
avatar do autor
Suciu Dan
12 min ler