CodeGym /Cursos Java /Python SELF PT /Coleta de dados usando links "Próximo"

Coleta de dados usando links "Próximo"

Python SELF PT
Nível 34 , Lição 1
Disponível

1. Introdução à paginação

E quem disse que os dados que você precisa vão estar em uma única página? Muito frequentemente você tem que extrair tudo de várias páginas, ou no pior caso, os dados podem estar espalhados por todo o site. Então, um dos primeiros desafios que você vai encontrar é a divisão de dados em páginas (pages). E o trabalho fascinante de coletá-los é chamado de pagination (paginação).

Pois é, paginação não é só quando você espera carregar a próxima página de resultados no Google, mas também quando o web-scraper se pergunta: "Como automatizar isso pra não fazer manualmente?"

Paginação é um método de organizar dados em um site, pra evitar aquelas páginas enormes e intermináveis de conteúdo. Em vez disso, os sites dividem os dados em páginas, adicionando links como "Próximo" ou "Mais" pra navegar de uma página pra outra. Isso é uma coisa importante de entender porque, como um web-scraper, você não vai querer dizer pro chefe que você perdeu algo porque tava escondido lá na "página cinco".

2. Problemas ao fazer scraping de dados em várias páginas

O primeiro problema que você pode enfrentar é a falta de URLs intuitivos e previsíveis. Alguns sites têm URLs estáveis que não mudam muito quando você navega entre páginas, o que pode complicar bastante a automatização. Por exemplo, em vez de page=1, page=2, você pode se deparar com x=abc, x=def, sem nenhum padrão lógico aparente.

O segundo problema é a proteção contra bots. Alguns sites rastreiam ativamente a quantidade de requisições vindas de um único IP. Se eles perceberem que você está exagerando, podem te bloquear temporária (ou permanentemente).

Mas relaxa, vamos aprender a superar essas dificuldades como verdadeiros mestres do scraping.

3. Como contornar a paginação

Técnicas e estratégias

  1. Analisar a estrutura da URL: Normalmente, as páginas usam um parâmetro na URL pra indicar o número da página, tipo ?page=2. Se você encontrar isso, parabéns, achou a mina de ouro pra contornar a paginação!
  2. Buscar links "Próximo": Às vezes, a URL não segue nenhum padrão previsível. Nessas situações, você tem que procurar links como "Próximo" ou "Mais" na página e seguir eles.
  3. Usar requisições AJAX: Alguns sites carregam dados utilizando AJAX sem recarregar a página. Nesse caso, você precisa interceptar essas requisições e reproduzi-las.

Bora colocar em prática!

Exemplo de script pra contornar paginação e coletar dados

Vamos dar uma olhada em um exemplo de script:

Python

import requests
from bs4 import BeautifulSoup

# Função pra obter dados de uma página
def get_data_from_page(url):
    response = requests.get(url)
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')
        # Aqui você extrai os dados do soup — exemplo
        data = soup.find_all('div', class_='data-class')
        for item in data:
            print(item.text)  # Exibe ou salva os dados
    else:
        print(f"Não foi possível acessar a página: {url}")

# Lógica principal pra contornar a paginação
def scrape_all_pages(start_url):
    current_url = start_url
    while current_url:
        get_data_from_page(current_url)
        soup = BeautifulSoup(requests.get(current_url).text, 'html.parser')
        # Tentando achar o link "Próximo"
        next_button = soup.find('a', text='Mais')
        if next_button:
            current_url = next_button['href']
        else:
            current_url = None

# Iniciando o scraping pela primeira página
start_url = 'http://example.com/page=1'
scrape_all_pages(start_url)

Esse é um exemplo básico que mostra o princípio de como trabalhar com paginação. Você vai precisar adaptá-lo à estrutura do site que estiver lidando.

Gerenciamento de sessão e uso de user-agent

Quando você envia várias requisições pra um site, é útil usar uma sessão e mudar o user-agent pra reduzir o risco de bloqueio.

Python

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

session = requests.Session()
session.headers.update(headers)

response = session.get('http://example.com')

Essa construção permite emular um navegador de forma mais confiável do que simplesmente enviar requisições sem cabeçalhos.

4. Implementação prática

Agora que já sabemos o básico, vamos aumentar um pouco a dificuldade. Vamos ver um caso em que os links das páginas têm parâmetros imprevisíveis e precisamos usar AJAX pra obter os dados.

Implementação com uso de AJAX

Às vezes os dados não carregam na página principal, mas sim por meio de requisições AJAX. Se você perceber que o site funciona assim, use a ferramenta de depuração de rede do navegador pra identificar quais requisições são feitas em segundo plano. Depois, é só reproduzi-las com Python.

Python

# Exemplo de requisição AJAX
ajax_url = 'http://example.com/ajax_endpoint'

params = {
'some_param': 'value',  # parâmetros necessários pra requisição
'page': 1
}

while True:
response = session.get(ajax_url, params=params)
data = response.json()
if not data['has_more']:
break
# Processamento dos dados
for item in data['items']:
print(item)
params['page'] += 1  # Passa pra próxima página

Essa abordagem é útil quando, após uma análise detalhada das requisições e respostas, você entende como os dados são carregados no navegador.

A aula de hoje nos mergulhou no mundo fascinante e frequentemente temperamental da paginação. Essa habilidade vai te permitir coletar dados de sites de forma segura e eficiente, sem perder nenhuma página. Afinal, assim como na vida, no web scraping a paciência e a persistência são fundamentais, porque quem sabe que tesouros escondidos estão na vigésima página?

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION