Tutorial do Scrapy Splash: Dominando a arte de raspar sites renderizados em JavaScript com Scrapy e Splash
Ștefan Răcila em Aug 10 2023

No complexo panorama atual da Web, em que o conteúdo é frequentemente gerado de forma dinâmica utilizando JavaScript, chamadas AJAX ou outros scripts do lado do cliente, a recolha de informações torna-se uma tarefa difícil. As técnicas de raspagem tradicionais podem não conseguir extrair dados que são carregados de forma assíncrona, exigindo uma abordagem mais sofisticada. É aqui que o Scrapy Splash entra em cena.
O Scrapy Splash é um navegador simplificado equipado com uma API HTTP. Ao contrário dos navegadores mais volumosos, é leve mas poderoso, concebido para extrair dados de sítios Web que processam o seu conteúdo com JavaScript ou através de procedimentos AJAX. Ao simular o comportamento de um navegador real, o Scrapy Splash pode interagir com elementos dinâmicos, tornando-o uma ferramenta inestimável para qualquer necessidade de extração de dados relacionada com conteúdo renderizado em JavaScript.
Neste guia abrangente, vamos explorar as capacidades únicas do Scrapy Splash, ilustrando passo a passo como aproveitar esta ferramenta de forma eficaz para extrair dados de sites que utilizam JavaScript para renderização. Quer seja um experiente explorador de dados ou esteja apenas a começar, compreender as funcionalidades do Scrapy Splash permitir-lhe-á obter a informação de que necessita a partir de uma Web cada vez mais dinâmica.
Fique connosco enquanto nos aprofundamos nos prós e contras da utilização do Scrapy Splash para a recolha de dados da Web moderna e interactiva, começando pela sua instalação e terminando com exemplos reais.
Como configurar o Splash: um guia passo-a-passo para instalação e configuração
O Scrapy Splash é uma ferramenta extremamente poderosa que pode abrir novas oportunidades para a recolha de dados de sítios Web dinâmicos. No entanto, antes de começarmos a colher os benefícios do Scrapy Splash, precisamos primeiro configurar nossos sistemas. Isso envolve várias etapas essenciais, incluindo a instalação do Docker, Splash, Scrapy e as configurações necessárias para que tudo funcione perfeitamente em conjunto.
1) Configuração e instalação do 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:
Executar 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 de Windows, macOS e outros sistemas operativos podem encontrar guias de instalação detalhados no site do Docker.
2) Baixando e instalando o Splash via Docker
Com o Docker instalado, pode continuar a descarregar a imagem Splash Docker, uma parte essencial da nossa infraestrutura de recolha de dados.
Executar 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 Splash está agora pronta em localhost:8050. Deverá ver a página padrão do Splash quando visitar este URL no seu navegador.
3) Instalando o Scrapy e o plugin Scrapy-Splash
O Scrapy é uma estrutura de raspagem 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) Criando seu primeiro projeto Scrapy
Comece a sua jornada de raspagem 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) Integrando o Scrapy com o Splash
Agora vem a parte essencial - configurar o Scrapy para trabalhar com o Splash. Isto requer a modificação do ficheiro settings.py no seu projeto Scrapy.
Configuração do URL de difusão:
Defina uma variável para a sua instância Splash:
SPLASH_URL = 'http://localhost:8050'
Middlewares descarregadores:
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 nos seus valores predefinidos.
Escrever um Scrapy Splash Spider
A recolha de dados de páginas Web dinâmicas pode exigir a interação com JavaScript. É aí que o Scrapy Splash entra em ação. No final deste guia, você saberá como criar um spider usando o Scrapy Splash para extrair cotações de quotes.toscrape.com.
Passo 1: Gerar a aranha
Vamos utilizar o comando incorporado no Scrapy para gerar uma aranha. O comando é:
scrapy genspider quotes quotes.toscrape.com
Após a execução, será criado um novo ficheiro com o nome quotes.py no diretório spiders.
Passo 2: Compreender os conceitos básicos de uma aranha Scrapy
Ao abrir o ficheiro quotes.py, encontra:
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 da aranha
- allowed_domains: Restringe o spider aos domínios listados
- start_urls: Os URLs a serem extraídos
- analisar: O método invocado para cada URL
Passo 3: Extrair dados de uma única página
Agora, vamos tornar a aranha funcional.
a) Inspecionar elementos utilizando um navegador Web
Utilize as ferramentas de programação para analisar a estrutura HTML. Encontrará cada citação dentro de uma etiqueta div com um nome de classe quote.
b) Preparar a classe SplashscraperItem
Em items.py, modifique-o para incluir três campos: autor, texto e etiquetas:
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 actualize 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: Manuseamento da paginação
Adicionar código para navegar em 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 Splash Requests para conteúdo dinâmico
Para utilizar o SplashRequest, terá de efetuar alterações ao spider atual:
from scrapy_splash import SplashRequest
def start_requests(self):
url = 'https://quotes.toscrape.com/'
yield SplashRequest(url, self.parse, args={'wait': 1})
Atualizar o método de análise para utilizar também o SplashRequest:
if next_url:
yield scrapy.SplashRequest(next_url, self.parse, args={'wait': 1})
Parabéns! Você acabou de escrever um spider Scrapy totalmente funcional que utiliza o Splash para extrair conteúdo dinâmico. Agora você pode executar o spider e extrair todas as citações, autores e tags de quotes.toscrape.com.
O código fornece um excelente modelo para a recolha de dados de outros sítios Web dinâmicos com estruturas semelhantes. Boa raspagem!
Manipulando respostas de respingos no Scrapy
As respostas Splash no Scrapy contêm algumas caraterísticas únicas que diferem das respostas Scrapy padrão. Elas são tratadas de uma maneira específica, com base no tipo de resposta, mas o processo de extração pode ser realizado usando métodos familiares do Scrapy. Vamos aprofundar o assunto.
Entendendo como o Splash responde às solicitações e seu objeto de resposta
Quando o Scrapy Splash processa um pedido, devolve diferentes subclasses de resposta, dependendo do tipo de pedido:
- SplashResponse: Para respostas Splash binárias que incluem ficheiros multimédia como imagens, vídeos, áudios, etc.
- SplashTextResponse: Quando o resultado é textual.
- SplashJsonResponse: Quando o resultado é um objeto JSON.
Analisando dados de respostas a respingos
O analisador incorporado do Scrapy e as classes Seletor podem ser utilizados para analisar as respostas Splash. Isso significa que, embora os tipos de resposta sejam diferentes, os métodos usados para extrair dados deles 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 usa seletores CSS para localizar o elemento span com classe text, e ::text diz 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
A manipulação de respostas Splash no Scrapy não requer nenhum tratamento especializado. Você ainda pode usar os métodos e a sintaxe familiares para extrair dados. A principal diferença está em entender o tipo de resposta Splash retornada, que pode ser um texto padrão, binário ou JSON. Estes tipos podem ser tratados de forma semelhante às respostas regulares do Scrapy, permitindo uma transição suave se estiver a adicionar o Splash a um projeto Scrapy existente.
Boa raspagem com o Splash!
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

Explore a comparação aprofundada entre o Scrapy e o Selenium para raspagem da Web. Desde a aquisição de dados em grande escala até o tratamento de conteúdo dinâmico, descubra os prós, os contras e os recursos exclusivos de cada um. Saiba como escolher a melhor estrutura com base nas necessidades e na escala do seu projeto.


Explore uma comparação pormenorizada entre o Scrapy e o Beautiful Soup, duas ferramentas líderes de raspagem da Web. Compreenda as suas caraterísticas, prós e contras, e descubra como podem ser utilizadas em conjunto para satisfazer as várias necessidades do projeto.


Saiba qual é o melhor browser para contornar os sistemas de deteção Cloudflare enquanto faz web scraping com o Selenium.
