Voltar ao blogue
Guias
Ștefan RăcilăLast updated on Mar 31, 20266 min read

Tutorial do Scrapy Splash: Dominar a arte de extrair dados de sites renderizados em JavaScript com o Scrapy e o Splash

Tutorial do Scrapy Splash: Dominar a arte de extrair dados de sites renderizados em JavaScript com o Scrapy e o Splash

No complexo panorama da Web atual, onde o conteúdo é frequentemente gerado de forma dinâmica através de JavaScript, chamadas AJAX ou outros scripts do lado do cliente, a extração de informações torna-se uma tarefa desafiante. As técnicas tradicionais de extração podem não conseguir extrair dados carregados de forma assíncrona, exigindo uma abordagem mais sofisticada. É aqui que o Scrapy Splash entra em cena.

O Scrapy Splash é um navegador otimizado equipado com uma API HTTP. Ao contrário de navegadores mais pesados, é leve mas potente, concebido para extrair dados de sites que apresentam o seu conteúdo com JavaScript ou através de procedimentos AJAX. Ao simular o comportamento de um navegador real, o Scrapy Splash consegue interagir com elementos dinâmicos, tornando-o uma ferramenta inestimável para quaisquer necessidades de extração de dados relacionadas com conteúdo apresentado por JavaScript.

Neste guia abrangente, exploraremos as capacidades únicas do Scrapy Splash, ilustrando passo a passo como tirar partido desta ferramenta de forma eficaz para extrair dados de sites que utilizam JavaScript para a renderização. Quer seja um minerador de dados experiente ou esteja apenas a começar, compreender as funcionalidades do Scrapy Splash irá capacitá-lo a obter as informações de que necessita numa web cada vez mais dinâmica.

Fique connosco enquanto nos aprofundamos nos meandros da utilização do Scrapy Splash para extrair dados da web moderna e interativa, começando pela sua instalação e terminando com exemplos reais.

Como configurar o Splash: um guia passo a passo para a instalação e configuração

O Scrapy Splash é uma ferramenta imensamente poderosa que pode abrir novas oportunidades para a extração de dados de sites dinâmicos. No entanto, antes de começarmos a colher os benefícios do Scrapy Splash, temos primeiro de configurar os nossos sistemas. Isto envolve vários passos essenciais, incluindo a instalação do Docker, do Splash, do Scrapy e as configurações necessárias para que tudo funcione em perfeita sintonia.

1) Configurar e instalar o Docker

O Docker é uma tecnologia de contentorização de ponta que nos permite isolar e executar a instância do Splash num contentor virtual, garantindo um funcionamento suave e consistente.

Para utilizadores de Linux:

Execute o seguinte comando no terminal:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

Para outros sistemas operativos:

Os utilizadores do Windows, macOS e outros sistemas operativos podem encontrar guias de instalação detalhados no site do Docker.

2) Transferir e instalar o Splash através do Docker

Com o Docker instalado, pode prosseguir com o download da imagem do Splash para o Docker, uma parte essencial da nossa infraestrutura de scraping.

Execute o comando:

docker pull scrapinghub/splash

Isto irá descarregar a imagem. Agora execute-a com:

docker run -it -p 8050:8050 --rm scrapinghub/splash

Parabéns! A sua instância do Splash está agora pronta em localhost:8050. Deverá ver a página padrão do Splash quando visitar este URL no seu navegador.

3) Instalação do Scrapy e do plugin Scrapy-Splash

O Scrapy é uma estrutura de scraping flexível, e o plugin scrapy-splash faz a ponte entre o Scrapy e o Splash. Pode instalar ambos com:

pip install scrapy scrapy-splash

O comando acima descarrega todas as dependências necessárias e instala-as.

4) Criar o seu primeiro projeto Scrapy

Dê início à sua jornada de scraping com o seguinte comando:

scrapy startproject splashscraper

Isto cria um projeto Scrapy chamado splashscraper com uma estrutura semelhante a:

splashscraper
├── scrapy.cfg
└── splashscraper
    ├── __init__.py
    ├── items.py
    ├── middlewares.py
    ├── pipelines.py
    ├── settings.py
    └── spiders
        └── __init__.py

5) Integrar o Scrapy com o Splash

Agora vem a parte essencial: configurar o Scrapy para funcionar com o Splash. Isto requer a modificação do ficheiro settings.py no seu projeto Scrapy.

Configuração da URL do Splash:

Defina uma variável para a sua instância do Splash:

SPLASH_URL = 'http://localhost:8050'

Middlewares do Downloader:

Estas definições permitem a interação com o Splash:

DOWNLOADER_MIDDLEWARES = {
   'scrapy_splash.SplashCookiesMiddleware': 723,
   'scrapy_splash.SplashMiddleware': 725,

}

Spider Middlewares and Duplicate Filters:
Further, include the necessary Splash middleware for deduplication:
SPIDER_MIDDLEWARES = {
   'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,

}

DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'

As restantes definições podem permanecer com os seus valores predefinidos.

Escrever um spider Scrapy Splash

A extração de dados de páginas web dinâmicas pode exigir interação com JavaScript. É aí que o Scrapy Splash entra em ação. Ao final deste guia, saberá como criar um spider usando o Scrapy Splash para extrair cotações do site quotes.toscrape.com.

Passo 1: Gerar o spider

Vamos usar o comando integrado do Scrapy para gerar um spider. O comando é:

scrapy genspider quotes quotes.toscrape.com

Após a execução, será criado um novo ficheiro chamado quotes.py no diretório spiders.

Passo 2: Compreender os conceitos básicos de um spider do Scrapy

Ao abrir o quotes.py, encontrará:

import scrapy

class QuotesSpider(scrapy.Spider):
   name = 'quotes'
   allowed_domains = ['quotes.toscrape.com']
   start_urls = ['http://quotes.toscrape.com/']
   def parse(self, response):
       pass
  • name: O nome do spider
  • allowed_domains: Restringe o spider aos domínios listados
  • start_urls: As URLs a rastrear
  • parse: O método invocado para cada URL

Passo 3: Recolher dados de uma única página

Agora, vamos tornar o spider funcional.

a) Inspecionar elementos utilizando um navegador web

Use as ferramentas de desenvolvedor para analisar a estrutura HTML. Você encontrará cada citação dentro de uma tag div com o nome de classe quote.

b) Preparar a classe SplashscraperItem

No ficheiro items.py, modifique-o para incluir três campos: author, text e tags:

import scrapy

class SplashscraperItem(scrapy.Item):
   author = scrapy.Field()
   text = scrapy.Field()
   tags = scrapy.Field()

c) Implementar o método parse()

Importe a classe SplashscraperItem e atualize o método parse em quotes.py:

from items import SplashscraperItem

def parse(self, response):
   for quote in response.css("div.quote"):
       text = quote.css("span.text::text").extract_first("")
       author = quote.css("small.author::text").extract_first("")
       tags = quote.css("meta.keywords::attr(content)").extract_first("")
       item = SplashscraperItem()
       item['text'] = text
       item['author'] = author
       item['tags'] = tags
       yield item

Passo 4: Gerir a paginação

Adicione código para navegar por todas as páginas:

next_url = response.css("li.next>a::attr(href)").extract_first("")
if next_url:
    yield scrapy.Request(next_url, self.parse)

Passo 5: Adicionar pedidos Splash para conteúdo dinâmico

Para utilizar o SplashRequest, terá de efetuar alterações no spider atual:

from scrapy_splash import SplashRequest

def start_requests(self):
   url = 'https://quotes.toscrape.com/'
   yield SplashRequest(url, self.parse, args={'wait': 1})

Atualize o método parse para utilizar também o SplashRequest:

if next_url:
yield scrapy.SplashRequest(next_url, self.parse, args={'wait': 1})

Parabéns! Acabou de escrever um spider Scrapy totalmente funcional que utiliza o Splash para extrair conteúdo dinâmico. Agora pode executar o spider e extrair todas as citações, autores e tags do site quotes.toscrape.com.

O código fornece um excelente modelo para extrair dados de outros sites dinâmicos com estruturas semelhantes. Boa extração!

Tratamento de respostas Splash no Scrapy

As respostas do Splash no Scrapy contêm algumas características únicas que diferem das respostas padrão do Scrapy. São tratadas de uma forma específica, com base no tipo de resposta, mas o processo de extração pode ser realizado utilizando métodos familiares do Scrapy. Vamos aprofundar o assunto.

Compreender como o Splash responde aos pedidos e o seu objeto de resposta

Quando o Scrapy Splash processa uma solicitação, ele retorna diferentes subclasses de resposta dependendo do tipo de solicitação:

  • SplashResponse: Para respostas Splash binárias que incluem ficheiros multimédia, como imagens, vídeos, áudio, etc.
  • SplashTextResponse: Quando o resultado é textual.
  • SplashJsonResponse: Quando o resultado é um objeto JSON.

Analisar dados de respostas do Splash

O analisador integrado do Scrapy e as classes Selector podem ser utilizados para analisar respostas Splash. Isto significa que, embora os tipos de resposta sejam diferentes, os métodos utilizados para extrair dados delas permanecem os mesmos.

Eis um exemplo de como extrair dados de uma resposta Splash:

text = quote.css("span.text::text").extract_first("")
author = quote.css("small.author::text").extract_first("")
tags = quote.css("meta.keywords::attr(content)").extract_first("")

Explicação:

  • .css("span.text::text"): Isto utiliza seletores CSS para localizar o elemento span com a classe text, e ::text indica ao Scrapy para extrair a propriedade text desse elemento.
  • .css("meta.keywords::attr(content)"): Aqui, ::attr(content) é utilizado para obter o atributo content da meta tag com a classe keywords.

Conclusão

Lidar com respostas Splash no Scrapy não requer nenhum tratamento especializado. Pode continuar a usar os métodos e a sintaxe familiares para extrair dados. A principal diferença reside na compreensão do tipo de resposta Splash devolvida, que pode ser um texto padrão, binário ou JSON. Estes tipos podem ser tratados de forma semelhante às respostas normais do Scrapy, permitindo uma transição suave se estiver a adicionar o Splash a um projeto Scrapy existente.

Boa scraping com o Splash!

Sobre o autor
Ștefan Răcilă, Desenvolvedor Full Stack @ WebScrapingAPI
Ștefan RăcilăDesenvolvedor Full Stack

Stefan Racila é engenheiro de DevOps e Full Stack na WebScrapingAPI, onde desenvolve funcionalidades do produto e mantém a infraestrutura que garante a fiabilidade da plataforma.

Comece a construir

Pronto para expandir a sua recolha de dados?

Junte-se a mais de 2.000 empresas que utilizam a WebScrapingAPI para extrair dados da Web à escala empresarial, sem quaisquer custos de infraestrutura.