W ostatnich dniach zbudowałem prosty system, który automatycznie zbiera oferty pracy IT z kilku źródeł i agreguje je w jednym miejscu.
Efekt możesz zobaczyć tutaj:
👉 https://piotrswitlicki.pl/jobs/
🔥 Po co to zrobiłem?
Problem jest prosty:
oferty są rozproszone
każda strona działa inaczej
część ogłoszeń znika szybko
filtrowanie ręczne jest czasochłonne
👉 więc zamiast scrollować kilka portali, postanowiłem je zcentralizować.
⚙️ Jak działa scraper?
System działa w oparciu o PHP + Laravel i Artisan Scheduler.
Co godzinę:
pobiera dane z JustJoin.it
pobiera dane z NoFluffJobs
normalizuje dane (tytuł, link, technologia)
zapisuje do bazy
aktualizuje „last seen”
🧱 Architektura w skrócie
Laravel Command (
Scheduler (
HTTP client (
Parser HTML (DomCrawler)
JSON API (NoFluffJobs)
🔍 Co było najważniejsze w budowie?
1. Normalizacja danych
Każda strona ma inny format, więc kluczowe było:
ujednolicenie URL
ujednolicenie technologii
deduplikacja ofert
2. Deduplikacja
Każda oferta jest zapisywana tylko raz:
po URL (JustJoin)
po reference ID (NoFluffJobs)
3. Scheduler
Całość działa automatycznie co godzinę:
⚠️ Problemy, które wyszły w praktyce
Podczas budowy pojawiły się typowe problemy:
błędne requesty API (400)
zmiany struktury HTML
timeouty HTTP
błędy DNS / curl
różnice w danych między źródłami
👉 scraper to nie „napisz i działa”, tylko ciągła adaptacja
📊 Co daje ten projekt?
Na ten moment:
jeden widok wszystkich ofert IT
aktualizacja co godzinę
możliwość dalszego rozwoju (alerty, filtry, AI matching)
🚀 Co dalej?
Planuję rozbudować system o:
alerty mailowe / Telegram
filtrowanie pod seniority
zapisywanie ofert
ranking najlepszych ofert
API dla innych narzędzi
🔗 Link do projektu
👉 https://piotrswitlicki.pl/jobs/
🧠 Podsumowanie
Ten projekt to nie tylko scraper.
To przykład jak:
kilka prostych narzędzi + automatyzacja = realny produkt, który rozwiązuje konkretny problem
Efekt możesz zobaczyć tutaj:
👉 https://piotrswitlicki.pl/jobs/
🔥 Po co to zrobiłem?
Problem jest prosty:
oferty są rozproszone
każda strona działa inaczej
część ogłoszeń znika szybko
filtrowanie ręczne jest czasochłonne
👉 więc zamiast scrollować kilka portali, postanowiłem je zcentralizować.
⚙️ Jak działa scraper?
System działa w oparciu o PHP + Laravel i Artisan Scheduler.
Co godzinę:
pobiera dane z JustJoin.it
pobiera dane z NoFluffJobs
normalizuje dane (tytuł, link, technologia)
zapisuje do bazy
aktualizuje „last seen”
🧱 Architektura w skrócie
Laravel Command (
artisan app:scrape-just-join)Scheduler (
schedule:run)HTTP client (
Http::get / post)Parser HTML (DomCrawler)
JSON API (NoFluffJobs)
🔍 Co było najważniejsze w budowie?
1. Normalizacja danych
Każda strona ma inny format, więc kluczowe było:
ujednolicenie URL
ujednolicenie technologii
deduplikacja ofert
2. Deduplikacja
Każda oferta jest zapisywana tylko raz:
po URL (JustJoin)
po reference ID (NoFluffJobs)
3. Scheduler
Całość działa automatycznie co godzinę:
Schedule::command('app:scrape-just-join')->hourly();⚠️ Problemy, które wyszły w praktyce
Podczas budowy pojawiły się typowe problemy:
błędne requesty API (400)
zmiany struktury HTML
timeouty HTTP
błędy DNS / curl
różnice w danych między źródłami
👉 scraper to nie „napisz i działa”, tylko ciągła adaptacja
📊 Co daje ten projekt?
Na ten moment:
jeden widok wszystkich ofert IT
aktualizacja co godzinę
możliwość dalszego rozwoju (alerty, filtry, AI matching)
🚀 Co dalej?
Planuję rozbudować system o:
alerty mailowe / Telegram
filtrowanie pod seniority
zapisywanie ofert
ranking najlepszych ofert
API dla innych narzędzi
🔗 Link do projektu
👉 https://piotrswitlicki.pl/jobs/
🧠 Podsumowanie
Ten projekt to nie tylko scraper.
To przykład jak:
kilka prostych narzędzi + automatyzacja = realny produkt, który rozwiązuje konkretny problem