Web scraping usluge: ekstrakcija i obrada podataka

Podataka je tema ovog članka, od ograničenja koje koči do predaje posla.

Web scraping usluge pretvaraju javne stranice u strukturirane zapise koje poslovanje može čuvati, porediti i kojima može vjerovati: cijene, specifikacije proizvoda, javne imenike, oglase, metapodatke vijesti ili regulativne objave. Vrijedan dio nije jednokratna tabela. To je sakupljač koji nastavlja raditi, primijeti kad se sajt promijeni i odbije predati red koji ne može opravdati.

U CodeWizu taj sakupljač gradimo kao softver: zakazane obilaske, parsere, validaciju i put isporuke u vašu bazu, tabelu ili API. Povlačimo i tvrdu liniju oko onoga što se smije prikupiti. Ako robots.txt, uslovi ili kontrole pristupa sajta kažu ne — ili su podaci lični, a vi nemate pravni osnov — ne gradimo zaobilaznicu. Koristimo zvanični API, tražimo dozvolu ili stajemo.

Kod teme podataka alati otvorenog koda su prvi izbor kada odgovaraju poslu.

Usluga je za trgovce koji prate javne cijene i asortiman, za marketplace kojem treba katalog koji ne kontroliše, i za timove koji i dalje lijepe s weba u CRM. Kako prikupljeni podaci podržavaju poslovne odluke zaseban je članak. Ovaj je o pipelineu, parsiranju i pravilima.

Podataka kreće od sistema koji već radi, a ne od praznog šablona.

Podataka: Krupni plan JavaScript i HTML izvornog koda na tamnom ekranu

Web scraping usluge za automatizovano prikupljanje

Automatizacija web scrapinga je pipeline s rasporedom, redom i pamćenjem. Ulazi spisak početnih URL-ova. Fetcheri preuzimaju stranice pristojnim tempom. Parseri pretvaraju HTML ili ugrađene podatke u zapise. Validatori prihvataju ili stavljaju u karantin svaki zapis. Odredište upisuje prihvaćene redove u PostgreSQL, CSV, webhook ili vašu postojeću aplikaciju. Sljedeće pokretanje ažurira izmijenjene zapise umjesto da dodaje beskrajan duplikat.

Rad na temi podataka ostaje u vašem repozitoriju i na vašoj infrastrukturi.

Šta produkcijski sakupljač uključuje

  • Registar izvora: početne URL-ove, dozvoljene putanje, verziju parsera i ko je tražio podatke.
  • Red, tako da spor sajt ne može blokirati svaki drugi izvor, i politiku ponovnog pokušaja za isteke i prolazne HTTP greške.
  • Kratkotrajno čuvanje sirove stranice, tako da se greška parsera može ponovo odigrati bez novog preuzimanja.
  • Otkrivanje promjena, tako da čujete za novu cijenu ili skinut oglas umjesto da ponovo čitate cijelu arhivu.
  • Identifikovan user agent s kontakt URL-om, dokumentovan raspored i granicu paralelnosti po hostu.

Stranice renderovane JavaScriptom preuzimamo pravim browserom samo kad je sadržaj javan i pravila to dozvoljavaju. Isti identitet, rate limit i provjera robots.txt važe. Headless browser nije maska. Gdje sajt nudi API ili feed proizvoda, uzimamo to.

CodeWiz provjerava podataka u produkciji, ne samo na demonstraciji.

Strukturirano parsiranje podataka

Strukturirano parsiranje podataka je korak koji stranicu pretvara u polja s tipovima: decimalnu cijenu, valutu, enum dostupnosti, vremensku oznaku, stabilan vanjski id. Radije biramo izvore koji su već strukturirani. JSON-LD i mikrodata na stranici proizvoda, javni JSON odgovor koji stranica sama zove, XML ili CSV feed. HTML je rezerva, čitan CSS selektorima ili XPathom vezanim za stabilan markup, a ne za boju dugmeta.

Odluke o temi podataka vežu se za ograničenje koje stvarno koči poslovanje.

IzvorKad ga koristimoZašto dobija ili gubi
Zvanični APIKad god ga izdavač nudi i smijete ga koristitiStabilna polja i dokumentovani rate limiti; može biti plaćen ili nepotpun
Feedovi (CSV, XML, JSON)Prodavnice i partneri koji objavljuju katalogLako se validira; zavisite od njihove učestalosti ažuriranja
JSON-LD i mikrodataStranice koje već opisuju proizvod, članak ili organizacijuČistije od struganja rasporeda; pokrivenost je često nepotpuna
Parsiranje HTML-aJavne stranice bez API-ja, kad pravila dozvoljavaju prikupljanjePuca kad se raspored promijeni; traži nadzor

Selektori se verzionišu s parserom. Sačuvane sirove stranice daju nam da parser popravimo nakon redizajna i ponovo obradimo, umjesto da sedmicu kasnije otkrijemo da je svaka cijena postala null. Polje se izvlači pravilom koje možemo testirati, ili zapis ide na pregled.

Predaja teme podataka uključuje uputstvo koje tim može koristiti.

Visoke police biblioteke od poda do plafona, pune knjiga u boji

Ekstrakcija sadržaja s neurednih stranica

Ekstrakcija sadržaja izvlači tijelo članka, blok specifikacije, spisak poslovnica ili tabelu iz navigacije i podnožja. Za članke čuvamo naslov, datum i kanonski URL. Za tabele specifikacija čuvamo oznake redova, jer golo “12” ne vrijedi ništa bez “garancija, mjeseci”.

PDF-ovi se pojavljuju često: cjenovnici, javni tenderi, priručnici. Izvlačimo tekst i tabele, a skenirane stranice šaljemo na OCR samo kad je dokument javan i u obimu. Linija niske pouzdanosti označena je ćelija, a ne tihi broj u bazi.

Čuvamo izvorni URL, vrijeme preuzimanja i polja koja ste tražili. Ne objavljujemo ponovo cijele članke, slike ni tekst proizvoda. Baza znanja nad dokumentima koje posjedujete drugačija je izrada, pokrivena u članku o RAG-u i prompt engineeringu. Scraping prikuplja javne strukturirane ulaze, i to samo tamo gdje je prikupljanje dozvoljeno.

Validacija podataka prije nego što im iko vjeruje

Svaki zapis provjerava se prema šemi prije nego što ide dalje: tipovi, obavezna polja, valute, oblik URL-a i rasponi koje definišete. Cijena nula, ili cijena koja je preko noći skočila neshvatljivo, ide u karantin umjesto da se tretira kao nova tržišna činjenica.

Šareni programski kod sa provjerama statusa prikazan na monitoru

Provjere na svakom izvoru

  • Validacija šeme, tako da ime koje fali ili cijena na kojoj je valutni simbol još zalijepljen nikad ne stignu u tabelu skladišta.
  • Pravila među poljima: akcijska cijena nije iznad redovne, datum kraja je poslije datuma početka, zbir tabele poklapa se s podnožjem.
  • Identitet i deduplikacija: isti proizvod viđen na dva URL-a sabija se u jedan zapis, a ponovno pokretanje ga ažurira.
  • Svježina: svaki red nosi vrijeme preuzimanja, a izvor koji je utihnuo diže upozorenje umjesto da servira prošlomjesečne cijene kao da su trenutne.
  • Zlatni uzorci: nekolicina URL-ova s poznatim dobrim vrijednostima, preuzetih po rasporedu, tako da promjena rasporeda padne na testu, a ne na sastanku o cijenama.

Redovi u karantinu ostaju vidljivi, sa sirovim fragmentom i pravilom koje je palo, tako da neko može popraviti parser ili prihvatiti izuzetak. Ista izričita ograničenja vide se u našem vodiču za API rate limiting: bilo da štitite vlastiti API ili zovete tuđi, plafon mora biti stvaran.

Zakonske i etičke granice utvrđuju se prije prvog zahtjeva. Test je jednostavan: biste li vlasniku sajta poslali opis bota, stranica koje čita i tempa kojim radi? Ako ne, ne gradimo ga.

robots.txt i tehnička pravila pristupa

Preuzimamo i poštujemo robots.txt. Putanja označena s Disallow za naš user agent ne preuzima se, ne obilazi sa strane i ne učitava u browseru da bi se fajl zaobišao. Crawl-delay, tamo gdje ga operater objavi, pod je našeg rasporeda, a ne prijedlog. Googleov uvod u robots.txt običnim jezikom objašnjava šta fajl znači. Gdje se robots.txt i preciznija pisana dozvola razilaze, slijedimo strože pravilo osim ako vlasnik sajta nije drugačije potvrdio u pisanom obliku.

Pristojan sakupljač predstavlja se i ostaje dovoljno spor da ne bude incident u saobraćaju:

from urllib.robotparser import RobotFileParser import httpx AGENT = "CodeWizBot/1.0 (+https://codewizdev.com/contact/)" rp = RobotFileParser() rp.set_url("https://example.com/robots.txt") rp.read() url = "https://example.com/catalog/page/3" if not rp.can_fetch(AGENT, url): raise SystemExit("blocked by robots.txt") with httpx.Client(headers={"User-Agent": AGENT}, timeout=20.0) as client: response = client.get(url) response.raise_for_status()

Povrh te provjere, red radnika nameće tempo po hostu, granicu paralelnosti i backoff kad sajt vrati 429 ili 503. Ne rotiramo identitete, ne rješavamo CAPTCHA-e, ne zaobilazimo prijave i ne prolazimo oko paywalla. To su kontrole pristupa. Kad na njih naiđemo, stajemo i koristimo API, licencu ili ništa.

Uslovi korištenja

Ako uslovi zabranjuju automatizovano prikupljanje, taj sajt ne stružemo, čak i kad je stranica tehnički dohvatljiva. “Javno je” ne zamjenjuje dozvolu koju je izdavač uskratio. Feed ili partnerski API obično je lakše održati u životu, i tu odluku zapisujemo pored izvora.

GDPR i lični podaci

Ime, email, broj telefona ili profil lični su podaci u smislu GDPR-a i kad stoje na javnoj stranici. Prikupljanje traži pravni osnov, svrhu i rok čuvanja. Lične podatke izbjegavamo osim ako vaš pravni savjetnik već prihvata osnov. Javni poslovni zapisi i činjenice o proizvodima uobičajen su obim. Privatni nalozi, inboxi i sve iza prijave su van. Pregled zaštite podataka Evropske komisije objašnjava zašto “bilo je na sajtu” nije osnov obrade.

Rate limiti i opterećenje

Ograničavamo zahtjeve po hostu, poštujemo Retry-After i velika početna preuzimanja vodimo van špica kad ih znamo. Sakupljač koji bude blokiran obično je već bio loš gost. Radije završimo preko noći blagim tempom nego katalog povučemo za nekoliko minuta. Isti plafon važi i u suprotnom smjeru, za vaše API-je, zato vodič za rate limiting stoji pored ove usluge.

Rad scrapera nakon puštanja

Rasporedi se mijenjaju, polja se sele i feedovi dobiju kolonu. Nadzor treba razlikovati “sajt je pao” od “parser je pogrešan” od “izvor nas je zamolio da usporimo”.

  • Upozorenja na neuspješna preuzimanja, na nagli pad broja izvučenih zapisa i na neslaganje zlatnih uzoraka.
  • Verzija parsera na svakom redu, tako da se vidi koji je kod proizveo broj.
  • Zasebna konfiguracija po izvoru, tako da popravka jednog sajta ne rizikuje ostale.
  • Dokumentovan prekidač. Zaustavljanje prikupljanja s izvora treba biti izmjena konfiguracije, a ne potraga po kodu.
  • Čuvanje sirovih stranica dovoljno dugo za otklanjanje greške i dovoljno kratko da se može opravdati.

Komercijalna strana ovog posla pokrivena je u tekstu kako web podaci postaju nešto na osnovu čega poslovanje može djelovati. Pipeline ovdje čini te podatke dovoljno pouzdanim da im operativa vjeruje.

Najčešće greške u scrapingu koje ispravljamo

  • Skripta na laptopu, bez reda, bez identiteta i bez zapisa koje su stranice preskočene.
  • Ignorisanje robots.txt zato što je početna dozvoljena, a poddirektorij “vjerovatno” također.
  • Tretiranje blokiranog odgovora kao zagonetke koju treba zaobići, umjesto kao znaka za stop.
  • Parsiranje cijena regularnim izrazom koji uhvati i karusel preporučenih proizvoda.
  • Bez provjere šeme, pa izmjena šablona upiše prazne cijene u živi alat za cijene.
  • Prikupljanje ličnih profila “za svaki slučaj”, bez svrhe, bez osnova i bez puta za brisanje.
  • Bez izvornog URL-a i bez vremenske oznake, pa se sporna cifra ne može pratiti.

Šta mijenja obim i cijenu

Procjenu dajemo nakon uvida u izvore, a ne prema cjenovniku po stranici. Cijena prati težinu da se ovo uradi kako treba:

  • Koliko sajtova, koliko često i da li svaki traži vlastiti parser.
  • Postoji li API ili feed, što je obično jeftinije za održavanje od HTML-a.
  • JavaScript renderovanje, prijave koje smijete koristiti, ili PDF-ovi i OCR.
  • Koliko validacija mora biti stroga i da li čovjek pregleda redove u karantinu.
  • Isporuka: tabela u bazi, API, uvoz u prodavnicu ili izvještaj.
  • Pravni pregled izvora, koji radije radimo na početku nego nakon prigovora.

Kako radimo

  1. Analiza: popisujemo odluke koje podaci moraju podržati, polja koja vam trebaju i izvore koje imate na umu.
  2. Provjera pravila: čitamo robots.txt i uslove, označavamo lične podatke i izbacujemo ili zamjenjujemo svaki izvor koji ne smijemo prikupljati.
  3. Plan: biramo API, feed ili HTML po izvoru, plus raspored, rate limite, šemu i isporuku.
  4. Izrada: implementiramo preuzimanje, parsiranje i validaciju, sa zlatnim uzorcima sa stvarnih stranica.
  5. Test: poredimo izvučene zapise sa stranicama, probamo ponovno pokretanje zbog duplikata i potvrđujemo da karantin radi.
  6. Puštanje i podrška: uključujemo nadzor, predajemo spisak izvora i prekidač, i popravljamo parsere kad se rasporedi promijene.

Zašto CodeWiz

  • Inženjering, a ne fascikla skripti: redovi, šeme, ponovni pokušaji i nadzor dio su isporuke, jer struganje koje je radilo jednom samo je demo.
  • Zakonska linija je izričita: robots.txt, uslovi, GDPR i rate limiti ugrađeni su u dizajn. Izvor ćemo odbiti radije nego “nekako srediti”.
  • Open-source na prvom mjestu: Python, PostgreSQL i red koji možete pokrenuti na vlastitom serveru, bez licence po redu.
  • Spaja se s ostatkom vašeg stacka: prodavnice, API-ji, baze i interni alati koji će podatke trošiti, a gradi ih isti tim.
  • Fer cijene: vrhunski razvoj bez vrhunskih cijena, iz Banje Luke, s radom na daljinu za klijente iz regiona i svijeta. Više o studiju je na stranici o CodeWizu.

Često postavljana pitanja

Koliko koštaju web scraping usluge?

Zavisi od broja izvora, od toga nude li API ili feed, koliko često trebaju svježi podaci i koliko je stranice teško parsirati. Jedan stabilan katalog s feedom mali je projekat. Mnogo HTML izvora, s validacijom i nadzorom, košta više jer je svaki sajt vlastita obaveza održavanja. Ponudu dajemo nakon pregleda stvarnih izvora.

Da li je web scraping legalan?

Može biti, a može biti i kršenje ugovora, problem privatnosti ili tehnička zloupotreba, zavisno od sajta i podataka. Prikupljamo samo javno dostupne informacije tamo gdje robots.txt i uslovi to dozvoljavaju, ne zaobilazimo kontrole pristupa i izbjegavamo lične podatke osim uz pravilan pravni osnov. Ako izvor padne na tom testu, ne stružemo ga.

Ignorišete li CAPTCHA-e ili blokade?

Ne. CAPTCHA, zid prijave, paywall ili blokada IP adrese signal su za stop. Nećemo rotirati identitete niti maskirati klijenta da prođemo. Alternative su zvanični API, pisana dozvola ili odustajanje od tog izvora.

Kako držite podatke tačnim?

Šemom, provjerama među poljima, deduplikacijom, vremenom preuzimanja i malim skupom poznato dobrih stranica koje se testiraju po rasporedu. Redovi koji padnu idu u karantin s razlogom. Promjena rasporeda vidi se kao pali uzorak ili nagli pad broja zapisa, a ne kao sedmica tihih loših cijena.

Koliko često možete osvježavati podatke?

Onoliko često koliko izvor može razumno podnijeti, i koliko vaša odluka traži. Dnevno ili noćno pokretanje tipično je za cijene i kataloge. Tempo po sajtu postavljamo prema veličini, robots.txt i načinu na koji odgovara, i radije ćemo biti nekoliko sati sporiji nego da sakupljač bude blokiran.

Možete li isporučiti u našu bazu ili prodavnicu?

Da. Uobičajena odredišta su PostgreSQL, CSV ili JSON drop, webhook ili uvoz u aplikaciju koju već koristite. Polja mapiramo na vašu šemu i na svakom redu čuvamo izvorni URL, tako da se vrijednost može pratiti do stranice s koje je došla.

Spremni za podatke koje možete koristiti?

Recite nam koje odluke podaci treba da podrže i koje sajtove imate na umu. Reći ćemo šta se smije prikupiti, šta treba ići preko API-ja i čega se nećemo doticati. Kontaktirajte nas da počnemo, ili pogledajte naše web scraping usluge.