Le web scraping est une compétence Data Engineer courante pour collecter des données non disponibles via API. En entretien, on évalue la maîtrise technique mais aussi la capacité à respecter les contraintes légales et techniques.
Le scraping n'est pas que technique — c'est aussi une question de responsabilité. En entretien, un candidat qui ne mentionne ni le robots.txt ni les aspects légaux n'est pas prêt pour la production.
Quelle est la différence entre une page HTML statique et une page rendue côté client (SPA) ? Quel impact sur votre approche de scraping ?
Comment scrapez-vous toutes les pages d'un site paginé ? Comment gérez-vous les erreurs et les timeouts ?
import requests
from bs4 import BeautifulSoup
import time
import random
def scrape_page(url: str, max_retries: int = 3) -> BeautifulSoup:
headers = {
"User-Agent": "Mozilla/5.0 (compatible; DataBot/1.0)",
"Accept-Language": "fr-FR,fr;q=0.9"
}
for attempt in range(max_retries):
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
return BeautifulSoup(response.text, "lxml")
except requests.RequestException as e:
if attempt < max_retries - 1:
time.sleep(2 ** attempt) # exponential backoff
else:
raise
def scrape_all_pages(base_url: str) -> list:
results = []
page = 1
while True:
soup = scrape_page(f"{base_url}?page={page}")
items = soup.select(".product-card")
if not items:
break
for item in items:
results.append({
"name": item.select_one(".title").get_text(strip=True),
"price": item.select_one(".price").get_text(strip=True),
"url": item.select_one("a")["href"]
})
page += 1
time.sleep(random.uniform(1, 3)) # politeness delay
return resultsQuand utilisez-vous Selenium plutôt que BeautifulSoup ? Et Playwright plutôt que Selenium ?
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
options = webdriver.ChromeOptions()
options.add_argument("--headless") # sans interface graphique
options.add_argument("--no-sandbox")
driver = webdriver.Chrome(options=options)
driver.get("https://exemple.com/products")
# Attendre que les données soient chargées
wait = WebDriverWait(driver, 10)
products = wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".product-card"))
)
data = []
for product in products:
data.append({
"name": product.find_element(By.CSS_SELECTOR, ".title").text,
"price": product.find_element(By.CSS_SELECTOR, ".price").text
})
driver.quit()Dans quel cas utilisez-vous Scrapy plutôt que requests+BeautifulSoup ?
Vous recevez un 403 ou un CAPTCHA après quelques requêtes. Que faites-vous ?
Avant tout : vérifier s'il existe une API officielle ou un export de données. Le scraping est toujours un dernier recours.
Comment vérifiez-vous que votre scraper respecte les règles du site ? Quels aspects légaux prenez-vous en compte ?
| Niveau | Maîtrise attendue | Signal GO | NO-GO |
|---|---|---|---|
| Junior | requests + BeautifulSoup, sélecteurs CSS, gestion des erreurs basique | A scraper plusieurs pages avec pagination, gère les timeouts | Ne vérifie pas robots.txt, ne gère pas les erreurs HTTP |
| Confirmé | Selenium/Playwright pour les SPA, exponential backoff, Scrapy | Sait quand utiliser Selenium vs BeautifulSoup, a utilisé Scrapy sur un projet | Ne sait pas gérer les pages JavaScript, n'a jamais utilisé Scrapy |
| Senior | Proxies rotatifs, scraping industrialisé, aspects légaux maîtrisés | A industrialisé un scraper en production avec Airflow, cite spontanément robots.txt et RGPD | Ne mentionne pas les aspects légaux, n'a pas de stratégie pour les anti-bots |
Premier entretien gratuit. Rapport GO/NO-GO sous 48h.