DATA EXTRACTION

Web Scraping B2B. Extracție de date la scară.

Construim pipeline-uri ETL (Extract, Transform, Load) în Python pentru a prelua volume mari de date publice din surse web complexe. Rulăm rezilient tocmai fiindcă rulăm politicos: limită de concurență per domeniu, backoff la primul semnal de throttling și sesiuni coerente, fiindcă un scraper care nu forțează sursa rezistă mai mult decât unul agresiv. Livrăm date normalizate și validate cu schemă, pregătite pentru machine learning sau pentru dashboard-urile tale. Înainte de prima linie de cod verificăm termenii sursei; unde accesul automat e interzis, mergem pe API-ul oficial sau pe un feed negociat.

Pipeline web scraping BaseTech — extracție prin proxies rezidențiale, normalizare ETL și livrare către warehouse PostgreSQL / BigQuery

Blocaje pe care le eliminăm

  • Scripturi fragile blocate instant

    BeautifulSoup + requests, pornite în paralel fără nicio limită, trăiesc 30 de minute. Un scraper care trage cât poate de repede dintr-un singur IP arată exact ca o sarcină ostilă, e tratat ca atare și pierde tot blocul de adrese. Repornit, blocat, repornit. Pipeline-ul tău nu rulează — face cardio.

  • Gunoi la intrare, gunoi la ieșire

    Extracția brută livrează HTML cu tag-uri amestecate, prețuri cu simboluri valutare lipite, date calendaristice în 5 formate diferite. Nu poți face analiză cantitativă pe "1.299,00 lei TVA inclus" ca string. ETL-ul (Extract, Transform, Load) nu e opțional — e jumătatea care valorează.

  • Mentenanță imposibilă

    Site-ul țintă schimbă o clasă CSS sau renaming pe atribut data-*. Scraperul tău rulează în continuare, dar livrează rânduri goale. Tu afli peste 2 săptămâni, când raportul de business arată anomalii. Fără schema validation la output, scraperul tace exact când ar trebui să țipe.

Ce câștigi concret

  • Headless Browsing

    Scripturi asincrone capabile să ruleze și să extragă date din aplicații Single Page (SPA) puternic obfuscate.

  • Rutare și ritm de extragere

    Limită de concurență per domeniu, backoff exponențial și pauze între cereri, cu rutare distribuită configurabilă per țintă. Scopul e să nu punem sursa sub sarcină, nu să trecem peste protecțiile ei.

  • Normalizare & ETL

    Curățarea și tipizarea datelor brute direct la sursă, cu validare de schemă înainte de scrierea în baza ta de date (SQL sau NoSQL). Un rând care nu trece validarea nu se scrie pe jumătate.

Arhitectura. Stack-ul. Compromisurile.

  • Achiziție & rutare

    Cereri asincrone cu limită de concurență per domeniu și backoff la primul semnal de throttling — un scraper politicos rezistă mai mult decât unul agresiv. Rutarea prin pool de proxy e configurabilă per țintă, iar sesiunile își păstrează coerența (IP, headere, cookie-uri) pe durata unui flux, în loc să schimbe identitatea la fiecare cerere.

    • Python
    • asyncio
    • Pool de proxy
  • Parsare & normalizare

    Extragerea produce obiecte validate de schemă, nu dicționare. Prețurile sunt parsate din formatul local în valoare numerică plus valută, datele calendaristice normalizate ISO 8601, iar deduplicarea se face pe chei naturale stabile, nu pe ordinea din pagină. Un câmp care nu trece validarea oprește scrierea rândului, nu îl scrie pe jumătate.

    • Pydantic
    • ISO 8601
    • Chei naturale
  • Orchestrare & alerting

    Rulările sunt programate, cu retry exponențial pe erori de rețea și oprire pe erori de schemă. Fiecare run compară rata de completare a câmpurilor cu rularea anterioară: o scădere bruscă înseamnă că ținta și-a schimbat structura și declanșează alertă, chiar dacă scraperul rulează fără să arunce erori. Tăcerea e cel mai scump mod de eșec.

    • Cron
    • Retry exponențial
    • Detecție de drift

Cum lucrez

  1. 01

    Achiziție, rutare și ritm (Python)

    Cereri asincrone cu limită de concurență per domeniu și backoff la primul semnal de throttling. Rutarea prin pool de proxy e configurabilă per țintă, iar sesiunile își păstrează coerența (IP, headere, cookie-uri) pe durata unui flux, în loc să schimbe identitatea la fiecare cerere. Respectăm robots.txt și ritmul pe care sursa îl suportă — obiectivul e un pipeline care rulează luni la rând, nu unul care stoarce o sursă până cade.

  2. 02

    Headless Browsing & Extraction

    Site-uri SPA (React, Vue, Next.js) necesită browser real. Playwright sau Selenium headless, cu pauze între interacțiuni ca să nu încărcăm sursa. Așteptăm completarea DOM-ului (`waitForLoadState('networkidle')`), interceptăm response-urile API-urilor interne unde e mai eficient decât parsing-ul HTML, și extragem doar nodurile relevante.

  3. 03

    ETL & Data Warehousing

    Curățăm string-urile, parsăm prețuri din formatele lor locale, normalizăm date calendaristice la ISO 8601, deduplicăm pe natural keys, validăm schemă cu Pydantic / Zod. Output direct query-ready: PostgreSQL pentru analize relaționale, BigQuery pentru volum mare, JSON pe S3 / R2 pentru export. Cron orchestrare cu retry exponential și alerting pe drift de schemă.

Întrebări frecvente

  • Ce se întâmplă când site-ul țintă își schimbă structura?
    Pipeline-ul cade fail-safe. Schema validator pe output (Pydantic / Zod) detectează că lipsesc câmpuri sau că tipurile nu corespund. Scrierea în DB-ul tău se oprește, alertă în Sentry cu payload-ul incomplet și diff-ul față de ultimul run valid. Refacem selectorii într-o oră, run reia, datele istorice nu sunt corupte. Tăcerea scraperului = zgomot pentru sistemul de alerting.
  • Ce faceți când o sursă blochează accesul automat?
    Ne oprim și schimbăm ruta. Când o sursă semnalează că nu vrea acces automat — prin termenii de utilizare, prin robots.txt sau printr-o măsură tehnică de protecție — nu încercăm să trecem peste ea. Nu e o limitare tehnică, e linia pe care nu o trecem: ocolirea unei măsuri de protecție ne-ar expune și pe noi, și pe tine. Mergem în schimb pe API-ul oficial al sursei, pe un feed negociat direct cu ea, sau îți spunem din prima că cerința nu e una pe care o luăm. Pentru sursele care permit acces automat, rezistența vine din a rula politicos: concurență limitată, backoff, sesiuni coerente și refacerea selectorilor când ținta își schimbă structura.
  • Livrați doar scriptul sau și datele?
    Pipeline ca serviciu gestionat end-to-end — Data-as-a-Service. Noi plătim infrastructura de proxy (cost real, $200-2000/lună în funcție de volum), noi refacem selectorii când site-urile țintă schimbă DOM, noi monitorizăm uptime-ul scraperilor. Tu consumi datele curate din PostgreSQL, BigQuery sau printr-un API endpoint REST / GraphQL pe care îl publicăm pentru tine.
  • Este legal ce faceți?
    Lucrăm doar pe date publice și doar pe ținte pe care le poți justifica: monitorizare de prețuri, cataloage, informații de companie. Verificăm robots.txt și termenii de utilizare ai sursei înainte de a scrie o linie de cod și îți spunem când o cerință nu e una pe care o luăm. Nu colectăm date cu caracter personal fără temei legal explicit, nu ocolim autentificare și nu ținem sursele sub sarcină care le-ar afecta.
  • Cât de des rulează și cum primim datele?
    Frecvența o dictează volatilitatea sursei: prețurile de retail merită zilnic sau de câteva ori pe zi, un catalog de companii merită săptămânal. Livrarea o alegi tu — scriere directă în baza ta de date, export programat pe object storage, sau un endpoint pe care îl expunem noi. În toate variantele primești și istoric, nu doar ultima stare, ca să poți analiza evoluția.

Scopează un pipeline

Date competitive, livrate curat

Scopează un pipeline