Scrapy vs. Beautiful Soup

Comparação entre Scrapy e Beautiful Soup. Saiba mais sobre as duas opções populares para Scraping de dados.
10 min de leitura
Scrapy vs Beautiful Soup

Quando se trata de Scraping de dados, o Python oferece uma grande variedade de ferramentas para escolher. Selenium, MechanicalSoup, Scrapy, Requests, Beautiful Soup e lxml são frequentemente usados nesse contexto. No entanto, essas ferramentas não são iguais, pois cada uma delas tem seu próprio conjunto de casos de uso em que se destacam. Algumas delas são até complementares, como este artigo irá demonstrar.

Neste artigo, você conhecerá mais de perto o Scrapy e o Beautiful Soup, duas opções populares para Scraping de dados.

O Beautiful Soup é uma biblioteca de Parsing. Ele permite a navegação em documentos usando seletores XPath e CSS. Isso facilita a transformação de dados de linguagens de marcação (como HTML e XML) em dados estruturados. Em contrapartida, o Scrapy é uma estrutura completa de Scraping de dados que carrega um documento e (opcionalmente) o armazena.

Saiba mais sobre o Scraping de dados com o Beautiful Soup.

Nesta comparação, você considerará os seguintes aspectos: usabilidade de rastreamento, usabilidade de scraping, velocidade, execução em várias etapas, Proxy rotativo e Resolução de CAPTCHA.

Scrapy vs. Beautiful Soup: comparação rápida

Se você estiver com pressa, aqui está uma comparação rápida entre o Scrapy e o Beautiful Soup para Scraping de dados com Python.

O Scrapy é uma estrutura abrangente de Scraping de dados, perfeita para projetos de extração de dados em grande escala e oferece suporte integrado para rastreamento, enquanto o Beautiful Soup é uma biblioteca de Parsing mais adequada para tarefas de scraping menores e mais diretas, sem os recursos integrados de rastreamento.

O Scrapy se destaca em velocidade e eficiência para operações extensas de scraping, e o Beautiful Soup se destaca em simplicidade e facilidade de uso para tarefas rápidas. Escolha o Scrapy para projetos complexos ou o Beautiful Soup para necessidades de Parsing simples e diretas.

Scrapy

O Scrapy é um pacote completo para rastrear a web, baixar documentos, processá-los e armazenar os dados resultantes em um formato acessível. A instalação do Scrapy é fácil com o pip ou o conda:

pip install scrapy
conda install -c conda-forge scrapy

Rastreamento da web com o Scrapy

O Scrapy ajuda você a rastrear conjuntos de páginas e sites para coletar URLs para extrair ou descobrir se uma página contém as informações específicas que você está procurando. O Scrapy funciona com spiders, que são classes Python nas quais é possível definir como navegar em um site, até que profundidade ele deve ir na estrutura do site, quais dados deve extrair e como devem ser armazenados. Para montar uma lista de URLs, o Scrapy pode navegar em documentos HTML, XML e CSV e até mesmo carregar mapas do site.

Além disso, o Scrapy oferece o Scrapy shell, um shell interativo para testar e depurar expressões XPath e CSS em páginas específicas. O uso do shell pode economizar tempo quando se trata de rastreamento e scraping, pois elimina a necessidade de reiniciar o spider sempre que você faz alterações.

Scraping de dados com o Scrapy

Quando se trata de scraping, geralmente é necessária muita flexibilidade. O Scrapy oferece duas maneiras de selecionar itens em um documento: por meio de expressões XPath e CSS. O primeiro é usado principalmente para documentos XML, enquanto o segundo é exclusivo para documentos HTML.

Um recurso exclusivo do Scrapy é a capacidade de definir pipelines. Quando um item é extraído, ele pode ser enviado para um pipeline no qual uma sequência de ações é realizada: limpeza, validação, hash, deduplicação e enriquecimento.

Velocidade

Outro aspecto importante do scraping de dados da web é o tempo que leva. Avaliar a velocidade do Scrapy não é fácil, pois ele tem uma grande sobrecarga que precisa ser processada. Por esse motivo, a sobrecarga é carregada apenas uma vez, enquanto o rastreamento e a extração acontecem dez vezes.

No exemplo a seguir, o h2 de uma página da web simples (ou seja, não dinâmica) é extraído. Todo o código é executado em um Jupyter Notebook.

Primeiro, carregue as bibliotecas necessárias do Scrapy:

import scrapy
from scrapy.crawler import CrawlerProcess

Em segundo lugar, estabeleça a classe MySpider que descreve o trabalho de scraping:

class MySpider(scrapy.Spider):
    name = "myspider"
    start_urls = [
        'https://edition.cnn.com' # Ou repita isso 10 vezes para calcular o tempo marginal
    ]
    def parse(self, response):
        yield {'output': response.css('h2.container_lead-package__title_url-text::text').extract()}
process = CrawlerProcess(
    settings={
        "FEEDS": {
            "scrapy_output.json": {"format": "json", "overwrite": True}
        }
    })

process.crawl(MySpider)

Em terceiro lugar, execute o script e cronometre-o:

%%timeit -n 1 -r 1
process.start()

A sequência de rastreamento, extração e armazenamento de um único documento da web levou aproximadamente 400 milissegundos. No entanto, repetir o mesmo processo dez vezes levou 1.200 milissegundos. Isso implica que uma única sequência leva cerca de 80 milissegundos, o que é impressionante. Dada a sobrecarga, o Scrapy deve ser sua primeira escolha para trabalhos intensivos.

Extração em várias etapas com o Scrapy

Muitos sites, se não os mais populares, como X/Twitter, Substack e LinkedIn, são dinâmicos. Isso significa que grandes quantidades de informações estão ocultas atrás de telas de login, consultas de pesquisa, pop-ups, rolagens ou mouse overs. Consequentemente, fazer com que seu spider simplesmente visite uma página muitas vezes não é suficiente para extrair dados dela.

O Scrapy oferece várias abordagens para lidar com essas tarefas como uma ferramenta independente. É possível produzir as solicitações HTTP necessárias ou executar os trechos de JavaScript relevantes. No entanto, usar um navegador headless oferece mais flexibilidade. Por exemplo, existem integrações do Playwright e do Selenium para o Scrapy que podem ser usadas para fazer a interface com elementos dinâmicos.

Proxy rotativo e prevenção de CAPTCHA com o Scrapy

A chegada de grandes modelos de linguagem motivou muitas empresas a ajustar seus modelos, mas isso requer dados específicos (muitas vezes coletados). Além disso, muitas organizações não querem que os bots sobrecarreguem os servidores de seus sites e não têm interesse comercial em compartilhar seus dados. É por isso que muitos sites não são apenas configurados como dinâmicos, mas também introduzem tecnologias antiscraping, como bloqueio automático de IP e CAPTCHA.

Para evitar o bloqueio, o Scrapy não oferece ferramentas prontas para uso para Proxy rotativo (e endereços IP). No entanto, o Scrapy pode ser estendido por meio da estrutura Middleware, um conjunto de ganchos para modificar o processo de solicitação e resposta do Scrapy. Para alternar proxies, é possível anexar um módulo Python, como o scrapy-rotating-proxies, que é feito especificamente para isso. Por meio do mesmo mecanismo, é possível anexar o módulo DeCAPTCHA.

Beautiful Soup

Ao contrário do Scrapy, o Beautiful Soup não oferece uma solução completa para extrair e processar dados de documentos da web; ele oferece apenas a parte de scraping. Basta alimentá-lo com um documento baixado, e o Beautiful Soup pode transformá-lo em dados estruturados por meio de seletores CSS e XPath.

A instalação do Beautiful Soup pode ser feita via pip e conda:

pip install BeautifulSoup4
conda install -c anaconda beautifulsoup4

Rastreamento da web com o Beautiful Soup

Enquanto o Scrapy utiliza spiders para navegar em um site, o Beautiful Soup não oferece esses recursos. No entanto, com um pouco de criatividade em Python, usando o Beautiful Soup e a biblioteca Requests, é possível escrever um script para navegar em um site até uma determinada profundidade. No entanto, certamente não é tão fácil quanto com o Scrapy.

Scraping de dados com Beautiful Soup

O scraping de dados é o que faz o Beautiful Soup 4 funcionar. Ele não só oferece seletores CSS e XPath, mas também vem com uma infinidade de métodos para percorrer documentos. Quando os documentos têm uma estrutura complexa, métodos como .parent e .next_sibling podem extrair elementos que, de outra forma, seriam difíceis de alcançar. Além disso, através de find_all() e métodos semelhantes, você pode especificar filtros de texto, expressões regulares e até mesmo funções personalizadas para encontrar os elementos necessários.

Por fim, o Beautiful Soup possui vários formatadores de saída para imprimir a saída de forma bonita, codificá-la, remover as aspas inteligentes da Microsoft e até mesmo analisar e validar HTML.

Velocidade

Ao contrário do Scrapy, o Requests e o Beautiful Soup não têm sobrecarga e podem simplesmente ser executados dez vezes para avaliar sua velocidade.

Primeiro, carregue as bibliotecas necessárias:

import requests, json
from bs4 import BeautifulSoup

Em segundo lugar, cronometre o código envolvendo-o em um comando mágicotimeit:

%%timeit -n 10 -r 1
page = requests.get('https://edition.cnn.com')
page_html = BeautifulSoup(page.text, 'html.parser')
page_html = page_html.select_one('h2.container_lead-package__title_url-text').text
json_object = json.dumps({'output': page_html})
with open("bs4_output.json", "w") as output_file:
    output_file.write(json_object)

Executá-lo uma vez leva aproximadamente 300 milissegundos. Executá-lo dez vezes leva 3.000 milissegundos, o que é consideravelmente mais lento que o Scrapy. No entanto, requer muito menos configuração e relativamente pouco conhecimento de uma estrutura específica.

Raspagem em várias etapas com Beautiful Soup

Como o Beautiful Soup não tem recursos de rastreamento, ele certamente não pode lidar com páginas da web dinâmicas. No entanto, assim como o Scrapy, ele funciona perfeitamente bem em conjunto com ferramentas de automação, como Playwright, Puppeteer e Selenium. O emparelhamento de ferramentas de automação com o Beautiful Soup sempre funciona da mesma maneira: os navegadores headless lidam com os elementos dinâmicos, enquanto o Beautiful Soup extrai os dados renderizados nesses navegadores.

Proxy rotativo e prevenção de CAPTCHA com o Beautiful Soup

Como o Beautiful Soup é uma ferramenta de scraping e não de rastreamento, ele não oferece ferramentas para evitar o bloqueio pelos servidores de um site. Se você precisar disso, esses recursos devem fazer parte da ferramenta de rastreamento que você escolher.

Conclusão

Este artigo descreveu como o Beautiful Soup e o Scrapy diferem em usabilidade para rastreamento e Scraping de dados da web em termos de velocidade, tratamento de documentos dinâmicos da web e contorno de medidas anti-scraping.

Como uma ferramenta completa, o Scrapy é claramente o favorito para tarefas diárias de scraping. No entanto, ele requer algum middleware para fazer scraping em sites dinâmicos e garantir que não seja bloqueado.

Embora o Beautiful Soup (juntamente com o pacote request) seja bastante lento, ele oferece uma maneira muito familiar e simples para trabalhos de scraping ad hoc. Assim como o Scrapy, ele requer ferramentas extras para fazer scraping de sites dinâmicos e evitar bloqueios.

Se você está procurando um serviço completo para Scraping de dados, considere a Bright Data. A Bright Data oferece vários produtos, como serviços de Proxy e Web Unlocker, para ajudar em todas as suas necessidades de Scraping de dados, independentemente da opção que você decidir usar.

Interessado em aprender como integrar proxies Bright Data? Leia nosso guia de integração de proxies Scrapy e proxies BeautifulSoup.