Dlaczego zdecydowałem się na automatyzację monitorowania płatności?
Na początku mojej drogi z własnym systemem automatycznego śledzenia płatności, głównym motorem była chęć oszczędzenia czasu i uniknięcia pomyłek, które często zdarzały się przy ręcznym sprawdzaniu statusów na portalach kontrahentów. W małej firmie, gdzie każdy minut jest na wagę złota, ręczne odświeżanie stron, wpisywanie danych i porównywanie ich z bazą faktur to strata energii i ryzyko pomyłek. Postanowiłem więc stworzyć rozwiązanie, które będzie działało w tle, samodzielnie pobierało informacje i informowało mnie o ewentualnych problemach. To była dla mnie nie tylko kwestia wygody, ale też poprawy wiarygodności danych finansowych.
Wybór narzędzi i pierwsze kroki w projekcie
Decyzja o tym, jakich technologii użyć, nie była przypadkowa. Od początku wiedziałem, że Python będzie idealnym językiem do tego typu zadań. Jego biblioteki do web scrapingu i automatyzacji są na najwyższym poziomie, a społeczność aktywna. Na start wybrałem dwie główne biblioteki: BeautifulSoup do prostego parsowania statycznych stron oraz Selenium do obsługi stron dynamicznych, które korzystają z JavaScript. Wiedziałem, że wiele portali firmowych wymaga logowania i korzystania z elementów generowanych dynamicznie, więc Selenium było koniecznością.
Pierwszym krokiem było stworzenie skryptu logowania. Używając Selenium, automatycznie wpisywałem dane do formularza logowania, a następnie przechodziłem do stron z fakturami. Po tym etapie testowałem, czy uda się pobrać interesujące mnie dane, takie jak numer faktury, data płatności oraz status.
Przezwyciężanie wyzwań związanych ze stronami dynamicznymi
Największą trudnością okazało się radzenie sobie ze stronami, które ładowały dane za pomocą JavaScript. W przypadku prostych HTML-owych stron, BeautifulSoup zadziałało bez problemu. Jednak większość portali, które obsługiwałem, korzystała z dynamicznych elementów, co wymagało pełnej automatyzacji z Selenium. Po kilku eksperymentach z czekaniem na elementy (np. używając WebDriverWait) udało mi się ustalić, które elementy są kluczowe, aby system działał stabilnie i nie generował błędów.
Przy okazji musiałem dbać o stabilność sesji i obsługę błędów. Strony często się zmieniały, więc stale modyfikowałem skrypty, aby nie łapały błędów i potrafiły się poprawnie wylogować lub odświeżyć dane. Nie obyło się bez frustracji, ale systematyczne testowanie i dokumentowanie kroków pomogły mi wypracować solidne rozwiązanie.
Integracja z bazą danych i automatyzacja powiadomień
Kolejnym etapem było zapisywanie pobranych danych w bazie. Do tego celu wybrałem prosty, ale wydajny SQLite, który działał lokalnie i był łatwy w obsłudze. Tworzyłem tabelę z kolumnami na numer faktury, datę, status i datę ostatniej aktualizacji. Dzięki temu mogłem w prosty sposób sprawdzać, które płatności są zaległe lub opóźnione.
Automatyzacja powiadomień okazała się kluczowa. Po każdym uruchomieniu skryptu, sprawdzałem, czy są jakieś nieuregulowane płatności i wysyłałem mi e-mail lub wiadomość na Slacka. Użyłem do tego bibliotek smtplib i slack-sdk. W ten sposób byłem na bieżąco z sytuacją, bez konieczności ręcznego odświeżania informacji.
Cały proces uruchomiłem jako zadanie cron na Linuxie, co pozwoliło na automatyczne wykonywanie skryptu raz dziennie o określonej godzinie. Jasne, wymagało to trochę konfiguracji, ale od tego momentu system działał niemal bezobsługowo.
Praktyczne fragmenty kodu i przykłady automatyzacji
Chętnie podzielę się kilkoma fragmentami kodu, które najbardziej ułatwiły mi pracę. Na przykład, logowanie do portalu wyglądało tak:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('https://portal-firmowy.pl/login')
# Wpisanie loginu i hasła
driver.find_element(By.ID, 'username').send_keys('moj_login')
driver.find_element(By.ID, 'password').send_keys('moje_haslo')
driver.find_element(By.ID, 'login-btn').click()
# Czekanie na załadowanie strony głównej
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'dashboard'))
)
Po zalogowaniu, przechodziłem do strony z fakturami i pobierałem interesujące dane:
import csv
driver.get('https://portal-firmowy.pl/faktury')
# Przykład pobrania tabeli
soup = BeautifulSoup(driver.page_source, 'html.parser')
rows = soup.find_all('tr', class_='faktura')
for row in rows:
numer = row.find('td', class_='numer').text.strip()
data = row.find('td', class_='data').text.strip()
status = row.find('td', class_='status').text.strip()
# Zapisywanie do bazy
save_to_db(numer, data, status)
To tylko przykładowe fragmenty, które pokazały mi, jak można zautomatyzować nawet najbardziej skomplikowane procesy.
Refleksje i wnioski z własnego projektu
Wdrożenie własnego systemu automatycznego monitorowania płatności to nie tylko oszczędność czasu, ale też możliwość szybkiego reagowania na opóźnienia czy zaległości. Zyskałem dzięki temu większą kontrolę nad finansami firmy i zmniejszyłem ryzyko pomyłek. Co ważne, cały proces nauczył mnie dużo o web scraping, obsłudze dynamicznych stron i automatyzacji w Pythonie.
Oczywiście, nie obyło się bez wyzwań. Strony zmieniały się, trzeba było stale aktualizować skrypty, a czasem pojawiały się błędy, które wymagały szybkiej interwencji. Jednak suma tych doświadczeń i efekt końcowy – działający, niezawodny system – wynagrodziły trudy. Teraz wiem, że dobrze przygotowane narzędzie automatyzujące codzienne obowiązki to nie luksus, a konieczność, jeśli chcesz działać efektywnie w małej firmie.
Chcesz spróbować sam? Kilka rad na koniec
Jeśli myślisz o własnym systemie, zacznij od małego kroku. Przetestuj, jak działają strony, z którymi chcesz pracować, i sprawdź, czy uda się wyciągnąć z nich dane. Użyj Selenium, by obsłużyć strony dynamiczne, a BeautifulSoup do parsowania statycznych. Pamiętaj o obsłudze błędów i testowaniu na różnych urządzeniach czy przeglądarkach. W końcu, świetnym krokiem jest integracja z bazą danych i automatyczne powiadomienia – to naprawdę zwiększa komfort pracy.
Automatyzacja to nie tylko oszczędność czasu, ale też szansa na lepszą kontrolę i mniejszą liczbę błędów. Dla mnie to był strzał w dziesiątkę i polecam każdemu, kto chce zyskać więcej czasu na rozwijanie swojego biznesu, zamiast tracenia go na rutynowe zadania.