Skaner cytowań NAP nie służy do liczenia wszystkich wzmianek o firmie. Jego zadanie jest bardziej precyzyjne: ma znaleźć strony, na których pojawiają się dane Name, Address, Phone, porównać je z rekordem wzorcowym i wskazać rozbieżności wymagające poprawy. Dla lokalnego SEO różnica między „ul. Piłsudskiego 12” a „Piłsudskiego 12” zwykle nie jest problemem. Stary numer telefonu, błędny kod pocztowy albo poprzedni adres siedziby — już tak.
Największy błąd przy budowie takiego narzędzia polega na traktowaniu NAP jak jednego ciągu znaków. Dane trzeba rozbić na osobne pola, znormalizować i oceniać według różnych reguł. Nazwa firmy toleruje drobne różnice. Numer telefonu nie powinien tolerować prawie żadnych. Adres wymaga natomiast uwzględnienia polskich skrótów, odmiany nazw ulic, numerów lokali oraz miejscowości pocztowych.
Dobrze zaprojektowany skaner nie wydaje prostego werdyktu „zgodne” albo „niezgodne”. Powinien pokazywać źródło cytowania, wykryte dane, poziom podobieństwa, rodzaj błędu i priorytet naprawy. Dopiero taki raport można wykorzystać do rzeczywistego porządkowania obecności firmy w katalogach, mapach, serwisach branżowych i lokalnych portalach.
Najpierw zbuduj rekord wzorcowy i zasady normalizacji
Punktem odniesienia nie może być przypadkowy zapis ze strony firmowej. Potrzebny jest jeden zatwierdzony rekord, najlepiej zgodny z danymi używanymi w Profilu Firmy w Google, na stronie kontaktowej, fakturach oraz w dokumentach rejestrowych.
Minimalny rekord wejściowy powinien zawierać:
- pełną nazwę firmy;
- nazwę skróconą lub markę używaną publicznie;
- ulicę, numer budynku i numer lokalu;
- kod pocztowy;
- miejscowość;
- numer telefonu;
- adres strony internetowej;
- opcjonalnie numer KRS, NIP lub REGON;
- poprzednie nazwy, adresy i telefony, które mogą nadal występować w sieci.
Praktyczny zapis danych może wyglądać tak:
{
"name": "Pracownia Rowerowa Koło sp. z o.o.",
"aliases": ["Pracownia Rowerowa Koło", "Koło Serwis Rowerowy"],
"street": "Marszałkowska",
"building": "58",
"unit": "4",
"postal_code": "00-545",
"city": "Warszawa",
"phone": "+48221234567",
"domain": "kolo-rowery.pl"
}
Następnie każdą wartość trzeba przepuścić przez warstwę normalizacji. Bez niej skaner będzie produkował dużą liczbę fałszywych alarmów.
Dla nazwy firmy usuń:
- wielkość liter;
- nadmiarowe spacje;
- kropki, przecinki i cudzysłowy;
- końcówki prawne, takie jak „sp. z o.o.”, „spółka z ograniczoną odpowiedzialnością”, „S.A.” czy „JDG”;
- znaki oddzielające nazwę od opisu działalności.
Nie należy natomiast usuwać wszystkich słów branżowych. Jeżeli wzorcem jest „Kowalski Stomatologia”, znalezienie samego „Kowalski” nie daje jeszcze pewności, że chodzi o właściwy podmiot.
Dla telefonu usuń spacje, myślniki, nawiasy oraz prefiks tel.. Polskie numery krajowe warto zamienić do formatu +48XXXXXXXXX. Zapis 22 123 45 67, +48 22 123-45-67 oraz 0048 221234567 powinien po normalizacji dać tę samą wartość. Numer różniący się choćby jedną cyfrą trzeba oznaczyć jako błąd wysokiego priorytetu, nie jako „prawie zgodny”.
Najwięcej pracy wymaga adres. Potrzebny jest słownik skrótów i wariantów, między innymi:
ul.→ulica;al.→aleja;pl.→plac;gen.→generała;św.→świętego;m.lublok.→ numer lokalu.
Trzeba również oddzielić numer budynku od lokalu. Zapisy 12/4, 12 m. 4, 12 lok. 4 oraz 12, lokal 4 powinny prowadzić do tego samego wyniku. Nie można jednak bezwarunkowo uznać 12A i 12 za ten sam adres. W praktyce taka różnica często oznacza inny budynek.
Polskie znaki diakrytyczne warto zachować w raporcie, ale podczas porównania można utworzyć dodatkową wersję techniczną: Łódź → lodz, Kościuszki → kosciuszki. Dzięki temu brak polskich znaków nie obniży przesadnie wyniku.
Do porównywania nazw i adresów dobrze nadają się miary podobieństwa dostępne w bibliotece RapidFuzz, szczególnie token_set_ratio oraz WRatio. Sensowny punkt startowy to:
- 95–100 punktów — zgodność lub różnica czysto redakcyjna;
- 85–94 punkty — rekord prawdopodobnie zgodny, ale wymaga kontroli;
- 70–84 punkty — możliwe dopasowanie, nie należy automatycznie przypisywać go firmie;
- poniżej 70 punktów — odrzuć albo skieruj do ręcznej analizy.
Nie stosuj jednego progu do wszystkich pól. Dla nazwy wynik 90 może być wystarczający. Dla numeru telefonu podobieństwo tekstowe nie ma sensu — obowiązuje zgodność wszystkich cyfr.
Zbieranie cytowań: wyszukiwarka, katalogi i kontrolowane indeksowanie
Skaner potrzebuje listy stron, na których mogą występować dane firmy. Najbezpieczniej połączyć trzy źródła: wyniki wyszukiwania, znane katalogi oraz adresy zapisane podczas poprzednich kontroli.
Generator zapytań powinien tworzyć kombinacje danych, a nie wysyłać wyłącznie nazwy firmy. Przykładowy zestaw:
"Pracownia Rowerowa Koło" Warszawa
"Pracownia Rowerowa Koło" "22 123 45 67"
"Pracownia Rowerowa Koło" "Marszałkowska 58"
"+48 22 123 45 67"
"kolo-rowery.pl" -site:kolo-rowery.pl
"Pracownia Rowerowa Koło" -site:kolo-rowery.pl
Wyszukiwanie samego telefonu bywa wyjątkowo skuteczne. Pozwala znaleźć stare wizytówki, kopie katalogów, ogłoszenia oraz profile, na których nazwa została zapisana inaczej. Zapytanie z domeną i operatorem wykluczającym stronę firmową pomaga natomiast wykrywać wzmianki zewnętrzne.
Nie należy pobierać stron wyników Google zwykłym skryptem wysyłającym setki zapytań. Takie rozwiązanie szybko trafia na blokady, CAPTCHA i niestabilny HTML. W produkcyjnym skanerze lepiej zastosować legalnie udostępnione API wyszukiwania albo dostawcę SERP API. Koszt zależy od operatora i wolumenu, ale przy niewielkim audycie trzeba zwykle zakładać kilkadziesiąt złotych miesięcznie, a przy regularnym monitorowaniu wielu lokalizacji — od kilkuset złotych wzwyż.
Dla jednej firmy wystarczy zazwyczaj:
- 10–20 zapytań startowych;
- maksymalnie 20–50 wyników na zapytanie;
- ponowne skanowanie co 30 dni;
- dodatkowy skan po zmianie nazwy, adresu, telefonu lub domeny.
Codzienne sprawdzanie wszystkich cytowań rzadko ma sens. Dane w katalogach nie zmieniają się z godziny na godzinę, a częste odpytywanie podnosi koszt i zwiększa ryzyko blokad. Wyjątkiem jest okres po przeprowadzce firmy — wtedy przez pierwsze cztery do sześciu tygodni można wykonywać kontrolę raz na siedem dni.
Drugim źródłem powinna być własna lista katalogów. W polskich realiach warto sprawdzać między innymi:
- serwisy mapowe i nawigacyjne;
- katalogi firm;
- portale branżowe;
- izby gospodarcze i organizacje zawodowe;
- lokalne portale miejskie;
- serwisy z opiniami;
- profile społecznościowe;
- platformy rezerwacyjne;
- katalogi franczyzowe i strony centrów handlowych.
Nie zakładaj, że każda wzmianka ma taką samą wartość. Profil w popularnym serwisie mapowym ma większy priorytet niż automatycznie wygenerowana podstrona w katalogu bez ruchu. Skaner powinien przechowywać dla domeny pole source_weight, na przykład w skali od 1 do 5.
Po znalezieniu adresu URL pobierz stronę z limitem czasu wynoszącym około 10–15 sekund, kontrolą przekierowań i maksymalnym rozmiarem odpowiedzi. Dla zwykłej wizytówki limit 2–5 MB jest wystarczający. Większe dokumenty, obrazy i pliki wideo należy pomijać.
Przed pobraniem sprawdź:
- status i reguły
robots.txt; - regulamin serwisu;
- dozwoloną częstotliwość zapytań;
- typ treści w nagłówku
Content-Type; - wcześniejsze błędy i blokady dla danej domeny.
Dobrą praktyką jest opóźnienie co najmniej 1–3 sekund między kolejnymi żądaniami do tej samej domeny. Publiczna usługa Nominatim OpenStreetMap nie powinna być traktowana jak bezpłatny geokoder do masowego przetwarzania. Przy większym wolumenie potrzebna jest płatna usługa, własna instancja albo lokalna baza adresowa. Najbardziej irytujący problem w tej części projektu to strony renderowane wyłącznie przez JavaScript. Zwykłe requests lub httpx pobiorą pusty szablon, mimo że użytkownik widzi pełne dane firmy. Wtedy trzeba uruchomić przeglądarkę automatyczną, na przykład Playwright, ale tylko dla stron, na których zwykłe pobranie nie znalazło treści. Renderowanie każdej strony przeglądarką kilkukrotnie wydłuża skan i zwiększa zużycie pamięci.
Ocena zgodności, raport i automatyzacja napraw
Po pobraniu strony nie porównuj wzorca z całym dokumentem. Najpierw usuń menu, stopkę techniczną, skrypty, style i ukryte elementy. Następnie szukaj bloków zawierających przynajmniej dwa składniki NAP, na przykład nazwę i telefon albo adres i domenę.
Dane mogą być zapisane w:
- widocznym tekście strony;
- znacznikach
address; - linkach
tel:imailto:; - danych strukturalnych Schema.org;
- metadanych Open Graph;
- tabelach;
- atrybutach elementów HTML;
- skryptach JSON osadzonych w kodzie.
Najpierw należy odczytać dane strukturalne typu LocalBusiness, Organization, PostalAddress i ContactPoint. Są łatwiejsze do interpretacji niż zwykły tekst, ale nie wolno im ufać bezwarunkowo. Zdarza się, że użytkownik widzi nowy numer telefonu, a w niewidocznym JSON-LD nadal pozostaje stary.
Wynik cytowania warto liczyć oddzielnie dla każdego pola:
nazwa: 92/100
adres: 100/100
telefon: 0/100
domena: 100/100
Następnie można zastosować ważoną ocenę końcową:
wynik = nazwa × 0,25
+ adres × 0,35
+ telefon × 0,30
+ domena × 0,10
To tylko punkt startowy. Dla firmy obsługującej klientów głównie telefonicznie telefon powinien mieć jeszcze większą wagę. Dla gabinetu, salonu lub punktu odbioru najważniejszy będzie adres. Wirtualne biuro albo działalność mobilna wymaga natomiast osobnego profilu oceny — skaner nie powinien zgłaszać braku publicznego adresu jako błędu, jeżeli firma świadomie go nie publikuje.
Sam wynik liczbowy to za mało. Raport powinien przypisać problem do jednej z kategorii:
- krytyczny — obcy albo nieaktualny numer telefonu, poprzedni adres, błędna domena;
- wysoki — nieprawidłowy numer budynku, kod pocztowy lub miejscowość;
- średni — stara nazwa firmy, brak numeru lokalu, niespójny zapis marki;
- niski — różnice w skrótach, interpunkcji, wielkości liter lub zapisie prefiksu
+48; - informacyjny — brak jednego z pól, którego publikacja nie jest konieczna.
Rekord w bazie powinien przechowywać co najmniej:
source_url
domain
scan_date
http_status
detected_name
detected_address
detected_phone
detected_domain
field_scores
overall_score
issue_type
issue_priority
content_hash
first_seen
last_seen
Pole content_hash pozwala pominąć ponowną analizę strony, jeżeli jej istotna treść się nie zmieniła. first_seen i last_seen pokazują natomiast, czy błąd jest świeży, czy utrzymuje się od kilku miesięcy.
W praktyce sprawdza się następująca kolejność działań:
- napraw błędne dane na własnej stronie;
- popraw Profil Firmy w Google i główne serwisy mapowe;
- zaktualizuj katalogi generujące ruch lub widoczne wysoko w wynikach;
- usuń stare numery telefonu i poprzednie adresy;
- dopiero później poprawiaj kosmetyczne różnice w nazwie i interpunkcji.
Nie próbuj automatycznie wysyłać formularzy aktualizacyjnych do wszystkich katalogów. Każdy serwis ma inny proces: konto właściciela, potwierdzenie e-mail, kod SMS, dokument rejestrowy albo ręczną moderację. Automatyzacja zgłoszeń jest krucha i może doprowadzić do zablokowania konta. Skaner powinien generować kolejkę zadań, gotową treść zgłoszenia i link do panelu edycji, ale zatwierdzenie zmiany lepiej pozostawić człowiekowi.
Prosty stos technologiczny dla pierwszej wersji może obejmować:
- Python 3.12 lub nowszy;
httpxdo pobierania stron;BeautifulSoupalboselectolaxdo analizy HTML;extructdo danych strukturalnych;phonenumbersdo normalizacji telefonów;RapidFuzzdo porównywania tekstu;Playwrightdo stron renderowanych przez JavaScript;- PostgreSQL do przechowywania wyników;
- Celery, RQ albo prosty harmonogram cron do obsługi zadań;
- Metabase, Grafana lub własny panel do raportowania.
Dla jednej firmy i kilkuset adresów URL wystarczy mały serwer VPS z 2 rdzeniami procesora i 2–4 GB RAM. Przy intensywnym użyciu Playwrighta bezpieczniej zacząć od 4 GB RAM. Sam serwer to zwykle wydatek rzędu 25–80 zł miesięcznie. Większą pozycją w budżecie może być API wyników wyszukiwania, zwłaszcza gdy skaner obsługuje setki lokalizacji.
Pierwszą wersję da się zbudować bez panelu użytkownika. Wystarczy plik CSV z rekordem wzorcowym, baza SQLite, skrypt uruchamiany ręcznie i raport HTML. Panel, logowanie, role użytkowników oraz powiadomienia warto dodać dopiero wtedy, gdy mechanizm wykrywania daje stabilne wyniki. Budowanie rozbudowanego interfejsu przed sprawdzeniem jakości dopasowań jest stratą czasu.
Więcej informacji na: https://biznap.pl
FAQ
Czy każde cytowanie NAP musi być zapisane identycznie?
Nie. Skróty takie jak „ul.” zamiast „ulica”, brak spacji w numerze telefonu czy pominięcie formy prawnej zwykle nie wymagają poprawy. Krytyczne są różnice wskazujące na inny numer telefonu, adres, domenę albo inną firmę.
Ile źródeł powinien sprawdzać skaner?
Dla pojedynczego lokalnego biznesu rozsądny pierwszy audyt obejmuje około 50–200 unikalnych adresów URL. Liczba zależy od wieku firmy, liczby lokalizacji, wcześniejszych przeprowadzek oraz aktywności w katalogach branżowych.
Jak często uruchamiać skanowanie?
Standardowo raz na 30 dni. Po zmianie adresu, telefonu lub nazwy firmy — raz w tygodniu przez cztery do sześciu tygodni. Częstsze skanowanie zwykle zwiększa koszty, ale nie przyspiesza aktualizacji danych w zewnętrznych serwisach.
Czy można oprzeć skaner wyłącznie na wynikach Google?
Nie. Wyszukiwarka nie pokaże wszystkich podstron, część katalogów blokuje indeksowanie, a niektóre stare rekordy pojawiają się tylko po wyszukaniu telefonu lub konkretnego adresu. Potrzebna jest także własna lista domen oraz historia wcześniej znalezionych cytowań.
Czy niski wynik podobieństwa zawsze oznacza błąd?
Nie. Może oznaczać inną placówkę tej samej sieci, oddział franczyzowy, działalność mobilną albo stronę opisującą firmę w kontekście historycznym. Wyniki graniczne należy skierować do ręcznej kontroli.
Czy skaner poprawi dane automatycznie?
Zwykle nie powinien. Może przygotować listę problemów, dane do wklejenia i adres panelu edycji. Sama aktualizacja często wymaga zalogowania, potwierdzenia własności profilu albo przejścia moderacji.
Pierwszym zadaniem nie jest więc podłączenie wyszukiwarki ani budowa panelu. Zacznij od 20 ręcznie sprawdzonych cytowań i dopracuj normalizację telefonu oraz adresu tak, aby skaner poprawnie klasyfikował co najmniej 18 z nich. Jeżeli narzędzie myli numer lokalu, traktuje 12A jak 12 albo akceptuje telefon różniący się jedną cyfrą, usuń te błędy przed zwiększeniem skali. Automatyzowanie wadliwego dopasowania tylko szybciej produkuje niewiarygodny raport.