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