Case study – 1053 profile na LinkedIn w 30 godzin ( 26,5 tys. w kieszeni)
Abraham Lincoln miał powiedzieć: „Gdybym miał 8 godzin na ścięcie drzewa, poświęciłbym 6 godzin na ostrzenie siekiery”.
Ja nie miałem 8 godzin na to zadanie, trochę więcej, ale nadal, dobre 30 godzin poświęciłem na ostrzenie… automatów.

Co było do zrobienia?
Paweł Strykowski dał mi zadanie – powyciągać imiona i nazwiska prelegentów z wydarzeń HR w Polsce w minionym roku.
Dostałem od niego 20 maili w formacie .eml. Standardowy proces?
- Klikam maila.
- Klikam link.
- Wchodzę na stronę.
- Spisuję nazwiska.
- Wklejam do Excela.
I bardzo spodobało mi się słowa Pawła.
– Ale jako mistrz n8n i automatyzacji chyba nie robisz tego ręcznie.
Mistrzem nie jestem, ale prosty, działający automat ułożę. I musiałem to zrobić, bo:
- na niektórych stronach prelegenci byli podpisani normalnie, to dało się zaznaczyć i skopiować,
- na innych ich nazwiska były podlinkowane, a kto próbował skopiować tekst z linka bez klikania w niego, ten wie, o czym mówię,
- jeszcze na innych były na obrazkach, nie do skopiowania.
I wtedy przyszła myśl – czy nazwiska prelegentów nie będą czasem w kodzie strony? No chyba że ktoś tagów alt nie wstawi do obrazków, wtedy nie, ale w pozostałych przypadkach – czy link, czy tekst, czy alt – da się to zesrapować i wyłowić.
Pierwsza iteracja
Najpierw chciałem to zrobić zwykłym węzłem HTTPS Request z metodą GET i potem czyszczenie HTML, ale problematyczne okazało się ustawienie atrybutów i kluczy (teraz już umiem. Teraz nawet scrapera zrobię). Wszak każda strona ma inny kod, inny CSS, inne klasy, inne nazewnictwo.
Dlatego ustawiłem prosty crawler w n8n na zasadzie:
- Wrzucam adres URL w chat.
- Firecrawl zbiera content ze strony internetowej.
- LLM wyciąga imię i nazwisko prelegenta i daje mi listę.


Nie dla wszystkich URLi zadziałało. Jedne wyrzucały 404, inne 403, jeszcze inne nie zwracały treści lub nazwisk. Te już trzeba będzie zrobić ręcznie.
Ale 80% URLi wchodziło jak w masło.
Problem?
Za wolno. To było nadal one-by-one.
A gdyby tak – wkleić URLe w jednej kolumnie, wrzucić w pętlę i zmapować dane do odpowiednich kolumn Google Sheets? 🤔
Wklejenie linków z maila nie jest takie proste
Pierwszy krok – skopiowałem linki osadzone na anchorach w mailach i wkleiłem do Google Sheets.
Błąd. n8n traktuje to jako tekst (string), nie jako URL. Dałoby się to przerobić na URL funkcją, ale…
… do n8n zasysało mi anchor text tego linka, a nie URL. Znowu problem.
Jak wyciągnąć kilkaset URLi w tej sytuacji? n8n? LLM? Python? Kombinuj, jak nie umiesz.
Formuła w Excelu
Jako że jestem biegły w Excelu w moment wyszedłem z koncepcją formuły, która wyciągnie URLe… no dobra, żartuję, nie wiem nic o Excelu.
Ale są ejaje.
Spytałem Chata GPT o formułę, która to zrobi. A Chat odpowiedział tak.

Wtedy napotkałem kolejny problem – formuły nie dało się przeciągnąć, nie działało autouzupełnienie. Kiedy ciągnąłem ją w dół, kopiowała się formuła dla tej samej komórki, czyli A2.
Spoko, ale ja mam ich ponad 300.
Wróciłem do GPT i kazałem mu to przepisać dla kolejnych komórek. Dał radę.

Wkleiłem kod do kolumny w odpowiednim miejscu.
Tam, gdzie był link, system go wyciągnął.
Tam, gdzie go nie było, zostało puste.
Odsianie tego było proste – filtr w kolumnie, warunek, że zawartość nie może być pusta, i wio. Poszło.
Druga iteracja

Dorzuciłem filtr, żeby nie brało URLi, które już są zrobione.
Dorzuciłem pętlę, żeby zrobić kilkaset itemów, jeden po drugim.
Trzecia iteracja (porażka)
Próbowałem zvibecode’ować apkę, która:
- przetrzepie pliki .eml w poszukiwaniu nazw eventów, dat i nazwisk prelegentów,
- wyłowi mi je i zwróci jako CSV.
O ile wyławianie eventów i ich adresów URL szło nieźle, o tyle wyławianie nazwisk i dat szło średnio. Trafiał się rok 2044, 3057, 2137… nie no, dobra, ten akurat nie, ale do mema pasowało 🙂.
Aplikacja raz zwracała 26 eventów, raz 288.
Wyłożyła się ostatecznie na etapie crawlingu. Co bym nie zrobił, zwracało 403. Dodałem potem do niej Crawl4ai, ale apka całkiem siadła.
Niemniej widzę potencjał w tego typu rozwiązaniach w przyszłości, jak się tego poduczę.
Czwarta iteracja
Po kilkuset nazwiskach doszedłem do ściany, a w arkusz wkradł się bałagan. Które wydarzenia są zrobione? Które nie? Jak odsiać duplikaty?
Zrobiłem to, czego zazwyczaj w takich przypadkach się nie robi, czyli cofnąłem się do pierwszego punktu.
Zauważyłem, że w You.com mogę wrzucać pliki .eml. Wówczas oprócz You tylko ChatGPT miał taką możliwość.

Więc plik po pliku zacząłem je wrzucać i wyciągać tabelę z poprawną datą i adresem URL.

Wrzuciłem arkusze w Genspark, w moduł AI Sheets i kazałem mu zestawić te arkusze, wyłapać duplikaty, zaznaczyć, które wydarzenia są zrobione, a które nie.
I całkiem nieźle sobie z tym poradził.
Następnie ustawiłem crawler jeszcze raz, tym razem inaczej.
Dałem najpierw zwykły request HTTP – jeśli strona wpuszcza crawlera, to po co wjeżdżać na nią z Firecrawlem czy innym?
Ustawiłem też IF – jeśli strona zwraca błąd, wtedy dopiero idzie do crawlera (Serpdata.io).

Musiałem też przestawić jedną rzecz, bo Information Extractor przy błędzie 403 zwracał mi randomowe nazwiska przy błędzie 403. Dlatego po IF dałem osobny węzeł Sheet:
- jeśli idzie dobrze, nazwiska trafiają do kolumny z nazwiskami,
- jeśli 403, informacja o błędzie trafia do kolumny error.
Gotowe nazwiska zabieram.
Resztę wyklikam już ręcznie.
Czy można było to zrobić lepiej?
Pewnie tak. I pewnie zaraz się dowiem, co i jak 🙂.
Ale dla mnie jak zawsze najbardziej liczy się to, że zrobione.
W myśl zasady „Jeśli coś jest głupie, ale działa, to nie jest głupie”.
Druga runda
OK, mamy nazwiska, mamy adresy URL profili, pora na wyciąganie wypowiedzi z LinkedIn.
Problem – LinkedIn nie pozwala scrapować
Jakiekolwiek używanie API czy automatyzacji do zbierania postów, komentarzy, danych profilu jest wbrew ToS LinkedIn. Sam LinkedIn podobno całkiem sprawnie wykrywa wszelkie próby „Naśladowania” realnych użytkowników, wzorce klikania odbiegające od normy itd.
Tak, wiem, są aktory w Apify, i pewnie jeszcze kilka innych opcji, proxy, podstawione cookies, Playwright itd. ale nadal, to jest szara strefa.
Specjaliści z Indii czy Pakistanu, którzy tworzą aktorów na Apify nie bardzo się takimi rzeczami przejmują.
Najwyżej potem będzie: „Dear sir, why they block me?” i płacz na forum.
Ja swoim kontem na Linkedin ryzykować nie zamierzam.
Co z kolei wprowadziło dodatkową warstwę trudności.
Pierwsze podejście
Najpierw istotnie chciałem skorzystać z gotowego aktora Apify. Drogo. Za 1000 profili zapłaciłbym kilkadziesiąt dolców. Cebula_mode: ON.
Wziąłem opcję Creator, w której tworzę własnego aktora. Tu z kolei vibe coding nie pozwolił mi na utworzenie działającego aktora.
Marnowałem sporo czasu (i nerwów), więc udałem się do Chata GPT z pytaniem o radę.
App Script
Chat GPT zaproponował podejście półautomatyczne:
- wchodzę na dany profil,
- scrolluję,
- klikam,
- dane zbierają się do arkusza Google.
Tutaj już z Claude’m Opusem 4.5 w Antigravity napisałem rozszerzenie do App Script w Google Sheets, które:
- wyławia posty z DOM,
- analizuje liczbę komentarzy i reakcji,
- wybiera te, które mają ich najwięcej,
- odrzuca, jeśli najnowszy post jest sprzed 2 miesięcy i więcej,
- odrzuca, jeśli żaden z postów nie jest dłuższy niż 100 słów (silna korelacja z niską wartością merytoryczną).

Tu niestety rykoszetem dostały posty graficzne i karuzele. Coś za coś.

Użyteczność
Tutaj już ustawiłem automat w n8n, który:
- odpalał się, gdy pojawia się nowy wpis,
- analizował treść tego wpisu pod kątem wartościowości i użyteczności,
- odrzucał wpisy o słabej wartości merytorycznej, jak info o eventach, posty pochwalne czy reposty,
- zostawiał tylko te wartościowe.



Trzecia runda
W trzeciej rundzie przyszedł czas na przetrzepanie tych postów i sprawdzenie, które z nich faktycznie niosą wartość, a które tylko prześlizgnęły się przez automat.
Istotnie, automat oznaczył ponad połowę postów jako niemerytoryczne – relacje, wiadomości, podziękowania, gratulacje i powiadomienia o nowym stanowisku.
Ale pomimo to nadal wśród 1275 wypowiedzi znalazły się te, które automat w n8n powinien był odrzucić.
Tutaj niestety uznałem, że muszę to przeklikać ręcznie, i powybierać te wypowiedzi, przeanalizowawszy je.
Mniej więcej za połową zdałem sobie sprawę z tego, że ręcznie tego nie zrobię. Czytanie tych postów, zwłaszcza długich, w Google Sheets to czysty masochizm.
Tak powstał LinkedIn Post Extractor.

Po długiej rozmowie z Chatem GPT 5.2 Thinking, wrzuciłem wszystko do Antigravity, gdzie Claude 4.5 Opus napisał mi tę apkę.

Apka działa tak, że:
- wrzucam CSV,
- kolumny już są zmapowane,
- wklejam klucz API OpenAI i model GPT 4o-mini (wystarczy do tego zadania, a jest dość tani), analizuje posta i wybiera ciekawy fragment.

Mogę sobie zaznaczyć swój fragment, skopiować, usunąć.
W prawym górnym rogu mam adres URL posta oraz guzik do jego skopiowania.

Na koniec wszystkie zaznaczone posty mogę wyeksportować do CSV.

Dodatkowo apka scaliła wypowiedzi jednej osoby i gdy ktoś miał np. 5 postów, a mam wybrać 2, to apka wybrała te 2 na podstawie kryteriów. W Sheetsie miałbym 5 rzędów po prostu.
Tym sposobem w półtorej godziny zrobiłem tyle roboty, ile wcześniej w 3 dni.
Podsumowanie
Załóżmy, że nie mam żadnej automatyzacji, i żadnego AI:
- wyciągnięcie 283 eventów z 20 maili – każdy mail to 10-15 minut = 200 minut = 3 godziny 20 minut.
- Wyciągnięcie nazwisk prelegentów z 283 eventów – 15 minut na stronę x 283 = 70 godzin
- wyciągnięcie wypowiedzi 1053 osób z LinkedIn – wejść na profil, przeczytać ostatnie 10 postów, orzec, czy są merytoryczne, skopiować wypowiedź, link, imię i nazwisko, liczmy 10 minut na osobę – 175,5 godziny,
- przygotowanie opisów tych osób – po selekcji zostało 337 osób, po 20 minut na osobę = 112 godzin.
Razem: 361 godzin. Ponad 2 etaty.
Mnie cały ten proces rozłożony na miesiąc zajął sumarycznie ok. 30 godzin.
331 godzin do przodu. Licz po 80 zł typową średnią stawkę godzinową wirtualnej asystentki.
26 480 zł
Jest jeszcze jedna korzyść
Kiedy wykonujesz jakąś pracę ręcznie, to jesteś obecny na 100%.
Kiedy automat ją wykonuje, Ty jesteś wolny.
Więc to równanie to nie jest:
Twój czas pracy – czas pracy automatu = zysk
Bo nie jest tak, że Ty byś robił 100 godzin, automat zrobił w 5 godzin, więc masz 95h do przodu. Ty nadal masz te 100 godzin dla siebie, pomniejszone o czas ustawiania automatu.
To równanie powinno wyglądać tak:
(Twój czas pracy + czas pracy automatu) – czas na ustawienie automatu = ZYSK.
Nie mówię też o mentalnym ciężarze klikania 1275 postów.
Masz przed sobą kolosalne zadanie? Dużo pracy? Dużo klikania?
Odezwij się, daj znać, pogadamy. Może Tobie też zaoszczędzę trochę czasu lub kasy.
