AccueilBlogScraping et automatisation Python avancee : Playwright, Scrapy, grande echelle
Guide recrutement data

Scraping et automatisation Python avancee : Playwright, Scrapy, grande echelle

Le scraping va au-dela de BeautifulSoup sur un site statique. En entretien Data Engineer Senior, on evalue la capacite a gerer les sites dynamiques, la grande echelle et les contraintes legales.

Data Builder·Juin 2025·6 min de lecture·Data Engineer
Sommaire
  1. Crawling vs scraping vs automatisation
  2. Ecosysteme des outils
  3. Playwright vs Selenium
  4. Scrapy a grande echelle
  5. Anti-detection
  6. Legislation
  7. Grille

Le scraping est un outil puissant mais qui engage la responsabilite du developpeur. En entretien, on ne teste pas seulement la technique — on verifie aussi la connaissance des limites legales et ethiques.

1Crawling, scraping, automatisation : les 3 notions

Question discriminante

Quelle est la difference entre le crawling et le scraping ? Et l automatisation web ?

2Ecosysteme Python du scraping 2025

OutilStatiqueDynamiqueMasseIdeal pour
BeautifulSoup + requestsOuiNonNonPages statiques simples, prototypage
PlaywrightOuiOuiMoyenSites dynamiques JS, automatisation UI
SeleniumOuiOuiNonSites dynamiques, tests UI (plus lent que Playwright)
ScrapyOuiPartielOuiScraping massif, pipelines de production
httpx + asyncioOuiNonOuiRequetes paralleles a haute performance

3Playwright : le successeur moderne de Selenium

Question discriminante

Pourquoi Playwright est-il prefere a Selenium en 2025 ? Quand utilisez-vous l un ou l autre ?

from playwright.async_api import async_playwright import asyncio async def scrape_spa(): async with async_playwright() as p: browser = await p.chromium.launch(headless=True) page = await browser.new_page() # Intercepter les requetes reseau page.on('response', lambda r: print(r.url) if '/api/' in r.url else None) await page.goto('https://exemple.com/products') # Attendre que les donnees soient chargees await page.wait_for_selector('.product-card', timeout=10000) products = await page.query_selector_all('.product-card') data = [] for p_elem in products: name = await p_elem.query_selector('.title') price = await p_elem.query_selector('.price') data.append({ 'name': await name.inner_text(), 'price': await price.inner_text() }) await browser.close() return data asyncio.run(scrape_spa())

4Scrapy : scraping industriel

import scrapy class ProductSpider(scrapy.Spider): name = 'products' start_urls = ['https://exemple.com/catalogue'] custom_settings = { 'DOWNLOAD_DELAY': 1.5, # politesse 'ROBOTSTXT_OBEY': True, # respecte robots.txt 'AUTOTHROTTLE_ENABLED': True, # adaptation automatique 'ITEM_PIPELINES': { 'myproject.pipelines.DatabasePipeline': 300, } } def parse(self, response): for product in response.css('.product-card'): yield { 'name': product.css('.title::text').get(), 'price': product.css('.price::text').get(), 'url': product.css('a::attr(href)').get() } # Pagination automatique next_page = response.css('a.next::attr(href)').get() if next_page: yield response.follow(next_page, self.parse)

5Anti-detection : les techniques

7Grille par niveau

NiveauMaitriseSignal GONO-GO
JuniorBeautifulSoup + requests, pagination, gestion erreursA scrape un site avec pagination, verifie robots.txtNe verifie pas robots.txt, ne gere pas les erreurs HTTP
ConfirmePlaywright pour les SPA, Scrapy, anti-detection basiqueSait quand utiliser Playwright, a un projet ScrapyNe sait pas gerer les sites dynamiques JS
SeniorProxies rotatifs, pipeline industrialise, aspects legaux maitriseCite spontanement les risques RGPD et la legislation, a deploye un scraper en production avec AirflowNe mentionne pas les aspects legaux

Vous recrutez un Data Engineer ?

Premier entretien gratuit. Rapport GO/NO-GO sous 48h.