CodeGym /Curso Java /Python SELF PT /Trabalhando com elementos dinâmicos na página da web

Trabalhando com elementos dinâmicos na página da web

Python SELF PT
Nível 36 , Lição 3
Disponível

1. Entendendo elementos dinâmicos

Bora começar com uma pequena introdução sobre a natureza do conteúdo dinâmico. Imagina que você está num site e, assim que rola a página para baixo, mais dados aparecem, como se fosse um tapete mágico que continua se estendendo para te levar mais longe. Isso é o que chamamos de carregamento preguiçoso ou "lazy loading" — uma técnica esperta que economiza recursos, carregando conteúdo só quando necessário. Confiar num HTML estático nesse caso é como esperar que seu gato traga café da manhã na cama.

O que são elementos dinâmicos?

Elementos dinâmicos são aquelas partes da página que mudam sem precisar recarregar a página inteira. Eles podem ser carregados por meio de requisições AJAX ou inseridos na página com JavaScript. É importante aprender algumas estratégias para lidar com esses elementos, para que seu app seja tão dinâmico quanto o próprio conteúdo.

2. Estratégias de interação

Bora para a magia prática. Para lidar com elementos dinâmicos, precisamos de ferramentas que entendam: "A vida tá em movimento, e eu tô pronto pra isso". Em nosso arsenal mágico, vamos usar Selenium, porque ele permite interagir com o navegador quase como uma pessoa faria.

Trabalhando com requisições AJAX

AJAX é uma tecnologia que permite atualizar partes de uma página da web sem precisar recarregá-la por completo. Isso é ótimo para os usuários, mas deixa a vida de desenvolvedores de scrapers um pouco mais complicada. Mas relaxa, porque temos uma carta na manga — WebDriverWait e expected_conditions do Selenium.

Python

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Configurando o driver
driver = webdriver.Chrome()
driver.get("https://example-dynamic-site.com")

# Esperando o elemento aparecer
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "dynamic_element_id"))
    )
    print(element.text)
finally:
    driver.quit()

Usando métodos de espera

Ao trabalhar com elementos dinâmicos, é importante dar tempo para o navegador "chegar lá". Os métodos de espera, como WebDriverWait junto com expected_conditions, nos ajudam a esperar pacientemente para que os elementos necessários sejam carregados. É como entrar na academia — leva tempo, mas o resultado vale a pena.

Exemplos:

  • presence_of_element_located — espera até que o elemento apareça no DOM.
  • visibility_of_element_located — espera até que o elemento esteja visível.
  • element_to_be_clickable — espera até que o elemento esteja clicável.

Aqui vai um exemplo de como esperar pela clicabilidade de um botão:

Python

button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
)
button.click()

Rolagem de página

Se o seu conteúdo é carregado ao rolar a página, você vai precisar dominar a arte do "scroll". O Selenium permite usar JavaScript para rolar a página e, assim, carregar novos dados.

Python

# Rolando até o final da página
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

Experimente implementar a rolagem num loop para carregar todo o conteúdo:

Python

SCROLL_PAUSE_TIME = 2
driver.get("https://example.com/dynamic-content")

last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Esperando o novo conteúdo carregar
    WebDriverWait(driver, SCROLL_PAUSE_TIME)

    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

3. Exemplos práticos de interação

Agora que aprendemos a esperar e observar, é hora de aplicar essas habilidades na prática e capturar todos os dados dinâmicos.

Suponha que temos uma página de produtos que carrega conforme rolamos para baixo. Precisamos extrair o nome e o preço de cada produto:

Python

products = []

while True:
    # Rolagem para baixo
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Esperar novos elementos carregarem
    WebDriverWait(driver, SCROLL_PAUSE_TIME)

    # Extraindo os dados dos produtos
    items = driver.find_elements(By.CLASS_NAME, "product-item")
    for item in items:
        name = item.find_element(By.CLASS_NAME, 'product-name').text
        price = item.find_element(By.CLASS_NAME, 'product-price').text
        products.append({'name': name, 'price': price})

    # Verificar se algo novo foi carregado
    # (maneira simples: se o número de items não mudou, saímos)
    if len(products) == last_known_count:
        break
    last_known_count = len(products)

Quando os elementos dinâmicos não carregam tão rápido quanto gostaríamos, precisamos ter paciência e criatividade. WebDriverWait com seu arsenal de condições, rolagem de página e injeções de JavaScript são nossas ferramentas para dominar o mundo do conteúdo dinâmico. Como dizia o grande Jedi: "Paciência, meu jovem padawan". No nosso caso, paciência significa um scraping de dados bem-sucedido.

Fechamos a sessão com a mesma atenção que temos ao encerrar um dia de trabalho — com cuidado.

Python

driver.quit()

Não esqueça: no final das contas, é importante garantir que seu código funcione corretamente, sem falhas nem erros. Só assim você pode dizer com certeza: "Missão cumprida". Boa sorte na sua jornada pelo mundo dos dados dinâmicos!

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