1. Introdução às páginas dinâmicas
Se você já tentou fazer scraping de dados de sites que
atualizam conteúdo automaticamente com JavaScript, sabe que
isso pode ser um quebra-cabeça de verdade. Mas relaxa! Como
dizem, qualquer código complicado pode ser ajustado para
parecer mágica. Bora entender como o
requests_html
deixa a gente trabalhar com esse tipo de conteúdo.
Como se sabe, nem todas as páginas web são igualmente úteis. Algumas carregam o conteúdo direto, enquanto outras podem gerar ou atualizar isso dinamicamente com JavaScript. Isso cria uns perrengues pra quem quer puxar os dados, porque o HTML que a gente vê com ferramentas de dev pode ser diferente do HTML que recebemos ao fazer uma requisição comum.
Problemas ao fazer scraping de conteúdo dinâmico
A maioria das bibliotecas para web, como requests, só trabalham com respostas do servidor e não conseguem rodar JavaScript. Isso significa que, se o conteúdo carrega ou muda via JavaScript, pode ser que você nem veja esses dados com uma requisição padrão.
2. Usando a biblioteca requests_html
É aqui que entra o requests_html
— uma biblioteca que
combina a simplicidade do requests com a força de um
navegador para rodar JavaScript. Ele te dá um motor básico de
renderização que permite interagir com páginas dinâmicas como
se você estivesse usando um navegador de verdade.
Instalando e configurando a biblioteca
Bora começar instalando o requests_html
. Abra seu
terminal favorito e rode o seguinte comando:
pip install requests-html
Pronto, biblioteca instalada! Agora já podemos trabalhar com ela.
Fundamentos de como usar o requests_html
para
extrair conteúdo em JavaScript
O requests_html
facilita nossa vida. Vem cá ver
como isso funciona na prática. Imagine que a gente tem uma
página que gera alguns dados via JavaScript.
from requests_html import HTMLSession
# Criando uma sessão HTML
session = HTMLSession()
# Fazendo uma requisição para a página web
response = session.get('https://example-dynamic-page.com')
# Renderizando o JavaScript
response.html.render()
# Extraindo dados
data = response.html.find('#dynamic-content', first=True)
print(data.text)
Isso é mágica! Diferente do requests, o
requests_html
tem o método .render()
,
que permite "rodar" a página e executar o JavaScript. Assim
que a página "ganha vida", você consegue pegar todos os dados
necessários usando os seletores que estudamos antes.
3. Exemplos de extração de dados
Agora, vamos nos aprofundar e olhar alguns exemplos pra você
sacar como o requests_html
salva a gente em
diversos cenários.
Extração prática de dados de páginas dinâmicas
Imagine uma página que carrega as últimas notícias só depois
de você rolar a tela pra baixo. Com o requests_html
,
a gente pode simular o comportamento do usuário.
url = 'https://example-news-site.com'
# Carrega a página
response = session.get(url)
# Renderiza com timeout maior, se necessário
response.html.render(timeout=20)
# Encontra os elementos de notícias
news_items = response.html.find('.news-item')
for item in news_items:
print(item.text)
Olha só como foi tranquilo acessar o conteúdo que antes parecia inatingível!
Trabalhando com conteúdo carregado pelo JavaScript usando
requests_html
Com o requests_html
e os seletores CSS que vimos
nas aulas anteriores, você consegue manipular o conteúdo das
páginas web como se já fosse um ninja do scraping!
# Seleciona o primeiro elemento de manchete de notícia
headline = response.html.find('.news-headline', first=True)
print(headline.text)
# Extraindo o link do elemento
link = headline.find('a', first=True).attrs['href']
print(link)
4. Dicas práticas e truques
Apesar de o requests_html
ser uma ferramenta
poderosa, tem umas coisas que vale a pena lembrar ao usá-lo:
- Timeouts e atrasos: Não esqueça de ajustar timeouts de renderização para páginas mais complexas. Isso ajuda a evitar erros causados por carregamentos lentos.
-
Consumo de recursos: O
requests_html
pode ser pesado, já que precisa renderizar JavaScript. Para grandes volumes de dados ou páginas complexas, isso pode deixar o processo mais devagar. -
CAPTCHA e proteções anti-bot: O
requests_html
não consegue burlar captchas e proteções anti-bot, então pra casos mais hardcore é melhor usar o Selenium.
GO TO FULL VERSION