Jak zbudowałem scraper ofert pracy IT (JustJoin + NoFluffJobs)
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 (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

Leave a Reply

Your email address will not be published. Required fields are marked *