Crawleando a web com o Scrapy

Crawleando a web com Scrapy

Olá jovens Padawans, eu sou o Zilla e venho lhes apresentar o Scrapy, um framework em Python para criação de crawlers para páginas web, mais conhecidos como Spiders.

Introdução ao Scrapy

Para os estudantes da academia Jedi que ainda não sabem o que é um crawler, aqui vai uma breve explicação: Um crawler, também conhecido como Spider ou Bot, é um software que realiza varreduras em websites com o objetivo de coletar informações relevantes. Eles são capazes de capturar qualquer informação escrita no website.

Pense num e-commerce, por exemplo, um crawler poderia capturar informações sobre um produto como, nome e valor. Ele também seria capaz de seguir os links da página e ir navegando site adentro, capturando ainda mais informações.

É claro que existem desenvolvedores que sucumbem à tentação e utilizam crawlers para fins escusos, mas como você e eu somos padawans pertencentes ao lado luminoso da força, jamais usaremos esse poder da forma errada.

Agora, voltando para o Scrapy. Ele nada mais é do que um framework que facilita a criação de crawlers, mas como ele se refere a crawlers como “spiders”, daqui pra frente só o termo spider será utilizado. Além disso, o framework é escrito em Python, então considerarei que vocês já possuem conhecimento sobre a linguagem e entenderão os blocos de código presentes nos exemplos.

Antes de começarmos a ver de fato os códigos dos spiders, é necessário fazer instalação do Scrapy. Apenas rode o comando pip abaixo e deixe que ele resolva toda a instalação do framework para você.

Entendendo a estrutura de um Spider

Agora que o conceito já foi abordado, você já está craque no que é um spider e já possui o ambiente preparado, vamos ver como é a estrutura de um Spider simples:

Logo de cara, já identificamos o “import” do scrapy, o qual nos permitirá usar o framework no nosso código.

Identificamos também o uso de algumas propriedades padrão no topo da classe, essas propriedades são disponibilizas pelo Scrapy. As mais utilizadas serão:

  • name:  propriedade que define o nome do nosso Spider. Obrigatória.
  • allowed_domains: tem como objetivo definir qual domínio está permitindo ao Spider navegar. Digamos que você pretende coletar informações da pagina www.foo.com/produto-1, então você deve adicionar “foo.com” aos domínios permitidos. O Spider rodará apenas nos domínios listados.
  • start_urls: o objetivo dessa propriedade é definir em qual URL o nosso Spider irá iniciar.
  • rule: é uma lista de objetos Rule. Cada objeto carrega um tipo de regra. Neste artigo, usaremos uma regra para dizer quais tipos de links serão extraídos pelo LinkExtractor.

Como vocês puderam ver, esse código usa CSS Selectors e XPaths. Como o intuito desse artigo é mostrar um pouco do Scrapy, vou considerar que você seja um padawan com pleno conhecimento sobre o que são os mesmos. Caso você tenha dúvidas sobre o que são CSS Selectors e XPaths, deixarei links sobre os assuntos no final do artigo.

Em nosso primeiro exemplo de Spider, é declarada uma função que irá tentar capturar uma série de frases. Ela espera receber o parâmetro “response” com valor similar a um documento HTML. Usando o método .css(‘div.quote’), eu sou capaz de procurar, no documento, por todas as divs que contenham a classe “quote”. Para cada uma das divs retornadas, o nosso Spider tenta buscar a frase em si e o autor da mesma. Após capturar todas as frases e todos os autores, o Spider tentará capturar o link para a próxima página, caso a mesma exista. Então ele usa o método .follow() que recebe a própria função como callback (técnica Jedi chamada Recursividade), segue o link para a página seguinte e repete o fluxo de análise.

Caso você queira testar o código acima, basta copiá-lo para um arquivo de texto, salva-lo como “quotes_spider.py” e roda-lo pelo prompt com o seguinte comando:

Vamos olhar por cima a estrutura do site que o nosso spider está tentando analizar. Perceba as frases e seus autores. É isso que esperamos como retorno do spider. Lembre-se, no entanto, que cabe a você definir o tipo do retorno.  Você poderia simplesmente escrever o array de objetos no prompt ou escrever cada item do array em um CSV, por exemplo. Porém foi definido no comando que os resultados serão salvos em um arquivo chamado “quotes.json”.

Quotes to Scrape site

Melhorando ainda mais seu Spider

Você pode se poupar do trabalho de procurar os links para as próximas páginas. Existe um módulo do Scrapy chamado LinkExtractor que faz uma varredura pela página, coletando todos os links disponíveis.

Neste primeiro exemplo vimos que, as únicas propriedades padrões utilizadas foram, name e start_urls. Como estamos falando de um exemplo a propriedade allowed_domains não foi utilizada. Porém, em um cenário real, no qual o spider estaria rodando em um domínio específico e está utilizando um LinkExtractor sem regra nenhuma, essa propriedade é fundamental. Ela evita que seu Spider navegue para URLs irrelevantes.

Exemplo: Lá está seu Spider rodando em sua URL de início e de repente ele coleta o link de um anúncio. Normalmente ele seguiria para esta url e iria acabar em um site irrelevante. Seu spider continuaría coletando link inútil atrás de link inútil, conforme se embrenha no mundo da interwebs. Basicamente, o seu querido spider estaria vagando por inúmeros sites, sem objetivo, perdido, sozinho, com fome e com frio.

No exemplo acima vemos um caso de uso simples do LinkExtractor dentro do array de Rules.

Algo a se notar é que ele, além do callback, recebe dois outros parâmetros allow e deny. Ambos podem tem que ser uma  Regex ou uma coleção de Regexes e são usados para dar match em links que o Spider deve coletar ou descartar, respectivamente.

Vamos agora para o nosso segundo exemplo:

Neste exemplo vemos o uso do allowed_domains. Logo de cara, vemos que ele informa o domínio do website para essa propriedade, garantindo que o nosso Spider jamais deixe o website. Caso você queira fazer um Spider, recomendo o uso do LinkExtractor também.

Agora que vocês já sabem como funciona o Scrapy, vocês já tem tudo que precisam para fazer um pequeno Spider.

Mãos à obra e divirtam-se!

CSS Selectors: https://www.w3schools.com/cssref/css_selectors.asp

XPath: https://www.w3schools.com/xml/xpath_syntax.asp

Published by

Gabriel Silla

Desenvolvedor .NET, quase gamer, adorador do Cyberpunk e fã de Backstreet Boys

Leave a Reply

Your email address will not be published. Required fields are marked *