Skaner cytowań NAP nie powinien odpowiadać wyłącznie na pytanie, czy nazwa firmy pojawia się w katalogu. To za mało. Użyteczne narzędzie musi ustalić, gdzie firma została wymieniona, jakie dane opublikowano, czy wpis dotyczy właściwego podmiotu oraz czym różni się od wzorca.
NAP to skrót od Name, Address, Phone, czyli nazwy, adresu i numeru telefonu firmy. W polskich realiach warto rozszerzyć ten zestaw przynajmniej o domenę, kod pocztowy, miejscowość oraz identyfikator oddziału. Bez tego skaner łatwo połączy dwa różne lokale tej samej sieci albo uzna stary adres za poprawny, ponieważ zgadza się numer telefonu.
Największym błędem jest rozpoczęcie projektu od budowania rozbudowanego robota indeksującego internet. Najpierw trzeba stworzyć jednoznaczny wzorzec danych firmy, a dopiero później mechanizm wyszukiwania. W przeciwnym razie narzędzie będzie sprawnie zbierało wyniki, ale nie będzie potrafiło wiarygodnie ich ocenić.
Najpierw zbuduj wzorzec NAP i zasady porównywania
Podstawą skanera jest rekord referencyjny, czyli zestaw danych uznanych za aktualne. Nie powinien być pobierany automatycznie z pierwszego znalezionego katalogu. Wzorzec najlepiej zatwierdzić ręcznie na podstawie strony kontaktowej firmy, dokumentów rejestrowych oraz aktywnego numeru telefonu.
Minimalna struktura rekordu może wyglądać następująco:
- pełna nazwa handlowa, np. „Serwis Rowerowy Koło”;
- nazwa prawna, np. „Koło Serwis sp. z o.o.”;
- dopuszczalne warianty nazwy;
- ulica, numer budynku i numer lokalu;
- kod pocztowy i miejscowość;
- numer telefonu zapisany w formacie +48XXXXXXXXX;
- adres strony internetowej;
- identyfikator oddziału;
- status lokalizacji: aktywna, zamknięta albo przeniesiona.
Oddziały trzeba traktować jako osobne jednostki. Firma posiadająca lokale przy ulicy Długiej 10 w Krakowie i Marszałkowskiej 20 w Warszawie nie może mieć jednego wspólnego rekordu NAP. Wspólna pozostaje marka, ale adres, telefon lokalny, godziny otwarcia i adres podstrony mogą być inne.
Przed porównywaniem dane należy znormalizować. Skaner powinien między innymi:
- usunąć wielokrotne spacje;
- ujednolicić wielkość liter;
- zamienić zapis „ul.” na „ulica” albo usunąć typ ulicy po obu stronach porównania;
- rozpoznać warianty „lok. 5”, „lokal 5” i „m. 5”;
- usunąć spacje, nawiasy i łączniki z numeru telefonu;
- zamienić prefiks `0048` na `+48`;
- usunąć końcowy ukośnik z adresu strony;
- ujednolicić domenę z `www` i bez `www`;
- zachować polskie znaki, ale tworzyć również pomocniczą wersję bez znaków diakrytycznych.
Nie wolno porównywać nazw firm zwykłym warunkiem „tekst jest identyczny”. Wpis „Koło – serwis rowerów Kraków” może dotyczyć tej samej firmy co „Serwis Rowerowy Koło”. Z drugiej strony samo słowo „Koło” jest zbyt ogólne, aby uznać rekord za trafienie.
W praktyce dobrze działa punktowy model zgodności:
- zgodny numer telefonu: 40 punktów;
- zgodna domena: 30 punktów;
- zgodny adres budynku: 25 punktów;
- zgodna nazwa po normalizacji: 20 punktów;
- zgodna miejscowość: 10 punktów;
- zgodny kod pocztowy: 10 punktów.
Wynik może przekraczać 100 punktów, ponieważ nie jest procentem, lecz sumą dowodów. Przykładowa interpretacja:
- 80 punktów lub więcej – prawie pewne trafienie;
- 55–79 punktów – wpis wymagający sprawdzenia;
- poniżej 55 punktów – wynik słaby albo dotyczący innej firmy.
Numer telefonu i domena powinny ważyć więcej niż podobieństwo nazwy. Nazwę można skopiować lub skrócić, natomiast identyczny telefon połączony z tym samym miastem jest znacznie mocniejszym sygnałem.
Trzeba też oddzielić brak danych od danych błędnych. Jeżeli katalog nie publikuje telefonu, wynik dla tego pola powinien brzmieć „brak”, a nie „niezgodny”. To ważne, ponieważ wpis z nieaktualnym numerem jest groźniejszy niż wpis bez numeru.
Jak zbierać cytowania bez tworzenia niekontrolowanego crawlera
Pierwsza wersja skanera nie musi przeszukiwać całego internetu. Rozsądniejszy zakres to lista od 30 do 100 źródeł, które rzeczywiście pojawiają się w wynikach dla polskich firm. Mogą to być mapy, katalogi branżowe, katalogi przedsiębiorstw, portale społecznościowe, serwisy miejskie i strony izb gospodarczych.
Źródła warto podzielić na trzy grupy:
- Priorytetowe – serwisy mające dużą widoczność albo regularnie pojawiające się po wpisaniu nazwy firmy.
- Branżowe – portale charakterystyczne dla lekarzy, prawników, restauracji, hoteli, mechaników czy firm budowlanych.
- Pomocnicze – małe katalogi, agregatory i strony partnerów.
Nie wszystkie cytowania są równie wartościowe. Dziesięć poprawnych wpisów na rozpoznawalnych platformach jest zwykle bardziej użyteczne operacyjnie niż sto rekordów w katalogach bez ruchu, moderacji i aktualnych danych.
Skanowanie można prowadzić trzema metodami.
Pierwsza metoda to bezpośrednie sprawdzanie znanych adresów URL. Jeżeli firma ma zapisany profil w konkretnym katalogu, skaner pobiera stronę i odczytuje dane. To najtańsza i najbardziej przewidywalna opcja. Nie pomaga jednak w odkrywaniu nieznanych cytowań.
Druga metoda to wyszukiwanie zapytań łączących nazwę, telefon i adres. Przykładowe wzorce:
- `”Nazwa firmy” „miasto”`;
- `”Nazwa firmy” „numer telefonu”`;
- `”ulica numer” „nazwa firmy”`;
- `”nazwa firmy” site:przykladowy-katalog.pl`.
Automatyczne odpytywanie zwykłych stron wyników wyszukiwarki za pomocą własnego scrapera jest rozwiązaniem kruchym. Układ wyników się zmienia, pojawiają się zabezpieczenia antybotowe, a intensywne zapytania kończą się blokadami. Do projektu produkcyjnego lepiej wykorzystać oficjalne API wyszukiwarki albo zewnętrzną usługę udostępniającą wyniki zgodnie z własnym regulaminem.
Trzecia metoda to crawling wybranych katalogów. Do stron renderowanych po stronie serwera wystarczy klient HTTP oraz parser HTML, na przykład Python z bibliotekami `httpx` i `BeautifulSoup`. Playwright należy uruchamiać dopiero dla witryn, które faktycznie wymagają JavaScriptu. Przeglądarka bez interfejsu zużywa wielokrotnie więcej pamięci i procesora niż zwykłe pobranie HTML.
Praktyczny stos technologiczny może obejmować:
- Python 3.12 lub nowszy;
- `httpx` do pobierania stron;
- `BeautifulSoup` albo `selectolax` do analizy HTML;
- `Playwright` do stron dynamicznych;
- PostgreSQL do przechowywania firm, źródeł i wyników;
- Redis do kolejki zadań i kontroli częstotliwości;
- FastAPI do wystawienia panelu i API;
- zadania cykliczne uruchamiane przez Celery, RQ albo prosty harmonogram systemowy.
Dla małego skanera analizującego kilkadziesiąt firm wystarczy serwer z 2 rdzeniami procesora, 4 GB RAM i 40–80 GB dysku SSD. Hosting takiej maszyny kosztuje zwykle około 30–90 zł netto miesięcznie. Przy równoległym uruchamianiu kilku instancji Chromium bezpieczniej przyjąć 8 GB RAM, co podnosi koszt mniej więcej do 70–160 zł miesięcznie. Największym wydatkiem nie jest jednak serwer, lecz dostęp do płatnych API wyszukiwania, obsługa zmian w katalogach oraz czas potrzebny na poprawianie parserów.
Każde źródło powinno mieć własny adapter. Adapter zawiera:
- sposób odnalezienia profilu;
- selektory nazwy, adresu i telefonu;
- informację, czy strona wymaga JavaScriptu;
- limit zapytań;
- reguły ponawiania;
- datę ostatniego udanego testu;
- status parsera.
To podejście jest mniej efektowne niż „uniwersalny parser oparty na AI”, ale działa stabilniej. Uniwersalny parser dobrze sprawdza się jako mechanizm awaryjny, natomiast w danych kontaktowych potrafi pomylić telefon firmy z numerem infolinii katalogu, adres oddziału z adresem centrali albo nazwę przedsiębiorstwa z tytułem artykułu.
Crawler powinien przestrzegać pliku `robots.txt`, regulaminu serwisu oraz ograniczeń technicznych. Rozsądny limit startowy to jedno żądanie na domenę co 2–5 sekund i maksymalnie dwa równoległe połączenia. Przy odpowiedziach HTTP 429 lub 503 trzeba zastosować narastające opóźnienie, na przykład 30 sekund, 2 minuty, 10 minut i godzinę. Ciągłe ponawianie zapytań po blokadzie tylko pogarsza sytuację.
Raport powinien wskazywać błąd, jego wagę i następne działanie
Surowa lista znalezionych adresów URL nie jest audytem. Użytkownik potrzebuje informacji, które cytowanie poprawić jako pierwsze i dlaczego właśnie to.
Tabela wynikowa powinna zawierać przynajmniej:
- nazwę źródła;
- adres profilu;
- datę skanowania;
- znalezioną nazwę;
- znaleziony adres;
- znaleziony telefon;
- status domeny;
- wynik zgodności;
- rodzaj błędu;
- priorytet naprawy;
- status ręcznej weryfikacji.
Najlepiej stosować cztery statusy:
- zgodne – najważniejsze pola odpowiadają wzorcowi;
- częściowo zgodne – brakuje pola, ale opublikowane dane nie przeczą wzorcowi;
- niezgodne – co najmniej jedno pole zawiera inną wartość;
- niepewne – skaner nie potrafi potwierdzić, czy profil dotyczy właściwej firmy.
Priorytet naprawy nie powinien wynikać wyłącznie z liczby różnic. Stary telefon na popularnej platformie jest pilniejszy niż brak numeru lokalu w małym katalogu. Sensowna kolejność wygląda tak:
- błędny telefon;
- nieaktualny adres po przeprowadzce;
- profil oznaczony jako zamknięty mimo prowadzenia działalności;
- pomieszanie danych dwóch oddziałów;
- błędna domena;
- istotnie zmieniona nazwa;
- drobne różnice zapisu, takie jak „al.” zamiast „aleja”.
Skaner powinien przechowywać historię. Bez niej nie da się ustalić, czy katalog zaktualizował dane po zgłoszeniu ani czy błąd powrócił. W bazie warto zapisywać zarówno przetworzone pola, jak i skrót HTML albo wycinek tekstu, z którego zostały pobrane. Pełne kopie stron szybko zajmują dużo miejsca i mogą zawierać dane niezwiązane z audytem, dlatego lepiej przechowywać tylko potrzebny fragment oraz znacznik czasu.
Ponowne skanowanie wszystkich źródeł codziennie zwykle nie ma sensu. Dla aktywnie poprawianych wpisów odpowiedni jest interwał 7–14 dni, a po ustabilizowaniu danych wystarczy kontrola co 30–90 dni. Profile o wysokim priorytecie można sprawdzać częściej niż małe katalogi.
Trzeba również przewidzieć ręczną akceptację. Wynik automatyczny nie może samodzielnie zmieniać danych firmy ani zgłaszać poprawek w serwisach zewnętrznych. Błędne dopasowanie mogłoby doprowadzić do „naprawienia” profilu innego przedsiębiorstwa.
Najbardziej irytującym elementem utrzymania skanera są zmiany struktury stron. Selektor CSS działający w poniedziałek może przestać działać po aktualizacji katalogu w piątek. Dlatego każdy adapter powinien mieć test kontrolny uruchamiany przynajmniej raz dziennie na znanym profilu. Jeżeli parser nagle nie znajduje żadnego telefonu w źródle, które zwykle go publikuje, trzeba oznaczyć wyniki jako technicznie niepewne, zamiast raportować masowy brak danych.
Pierwszą wersję narzędzia najlepiej ograniczyć do 10–20 najważniejszych źródeł, jednego miasta i kilku testowych firm. Dopiero gdy ręczna kontrola potwierdzi poprawność co najmniej 90–95% dopasowań, warto rozszerzać listę katalogów. Dodanie setnego źródła przed dopracowaniem normalizacji nie zwiększa jakości. Zwiększa jedynie liczbę fałszywych alarmów.
FAQ
Czy zgodność NAP gwarantuje wyższą pozycję w Mapach Google? Nie. Spójne dane ograniczają niejednoznaczność informacji o firmie, ale nie zastępują kompletnego profilu, opinii, trafności kategorii, lokalizacji ani jakości strony internetowej.
Czy skaner powinien oceniać również godziny otwarcia? Tak, ale jako osobny moduł. Godziny są zmienne, mogą być sezonowe i często różnią się między oddziałami. Nie należy mieszać ich z podstawowym wynikiem zgodności NAP.
Czy numer telefonu trzeba porównywać razem z prefiksem +48? Najpierw należy sprowadzić wszystkie polskie numery do jednolitego formatu. Zapisy `12 345 67 89`, `+48 12 345 67 89` i `0048123456789` powinny zostać uznane za ten sam numer.
Czy do skanera potrzebna jest sztuczna inteligencja? Nie w pierwszej wersji. Reguły, selektory i punktowy model zgodności są tańsze, szybsze i łatwiejsze do kontrolowania. Model językowy można później wykorzystać do interpretowania nietypowych adresów albo klasyfikowania niejednoznacznych wyników.
Jak długo trwa zbudowanie działającego prototypu? Programista znający Python i web scraping może przygotować wersję obsługującą około 10 źródeł w ciągu 5–10 dni roboczych. System z panelem, kolejką zadań, historią, alertami i kilkudziesięcioma adapterami wymaga zwykle 4–8 tygodni pracy oraz późniejszego utrzymania.
Ile kosztuje utrzymanie własnego skanera? Prosty system może zamknąć się w 30–160 zł netto miesięcznie za serwer. Koszt rośnie po dodaniu komercyjnych API, proxy, przechowywania większej liczby danych i częstych skanów. Najtrudniejszy do wyceny jest czas przeznaczony na naprawę parserów po zmianach w serwisach.
Czy można skanować dowolny katalog? Nie. Przed uruchomieniem automatyzacji trzeba sprawdzić regulamin, `robots.txt`, sposób udostępniania danych i dopuszczalną częstotliwość zapytań. Brak technicznej blokady nie oznacza automatycznie zgody na intensywne pobieranie treści.
Zacznij od jednego poprawnie zatwierdzonego rekordu firmy i pięciu ręcznie wybranych źródeł. Najpierw usuń błędy normalizacji numeru telefonu oraz adresu, bo to one najczęściej powodują fałszywe alarmy. Dopiero gdy skaner bezbłędnie rozróżnia poprawny wpis, stary adres i obcy profil, dodawaj kolejne katalogi oraz automatyczne wyszukiwanie.
Więcej informacji na: https://biznap.pl