Busque páginas da web dinâmicas com Selenium

Raspar é divertido, mas quando a página carrega via AJAX, ela começa a ser entediante com toda aquela engenharia reversa de Javascript etc.

Selenium é um kit de ferramentas bacana para conduzir o navegador de sua linguagem de programação favorita. Nascido para testes, é perfeito para raspagem.

Então, quando chego a uma página dinâmica, é isso que eu faço

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

# Start the WebDriver and load the page
wd
= webdriver.Firefox()
wd
.get(URL)

# Wait for the dynamically loaded elements to show up
WebDriverWait(wd, 10).until(
EC
.visibility_of_element_located((By.CLASS_NAME, "pricerow")))

# And grab the page HTML source
html_page
= wd.page_source
wd
.quit()

# Now you can use html_page as you like
from bs4 import BeautifulSoup
soup
= BeautifulSoup(html_page)

Você poderia até fazer o scraping com Selenium, mas carrego o HTML no BeautifulSoup porque:

  • Eu sou um viciado em BeautifulSoup
  • Selenium API é pragmática, um pouco exagerada, e absolutamente nada pitônica. Sim, você passa uma tupla para visibility_of_element_located
  • Os documentos da Selenium são … umh, empresa