from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.common.exceptions import TimeoutException, WebDriverException, StaleElementReferenceException,NoSuchElementException from urllib.parse import urlparse,urlunparse import time import re # Importujemy bibliotekę do pracy z wyrażeniami regularnymi import json def pobierz_ostatnia_liczbe(page): # Stała ścieżka XPath do elementu xpath = '/html/body/div[2]/section/div[1]/div/div[4]/div/div[3]/div' # Dynamiczny URL strony na podstawie parametru page url = f'https://www.futurepedia.io/ai-tools/personal-assistant?page={page}' # Konfiguracja przeglądarki options = Options() options.add_argument('--headless') # Tryb bezgłowy options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.add_argument('--disable-gpu') options.add_argument('--window-size=1920,1080') # Ścieżka do ChromeDriver chromedriver_path = "./chromedriver.exe" # Upewnij się, że ścieżka do ChromeDriver jest poprawna # Utwórz instancję przeglądarki service = Service(executable_path=chromedriver_path) try: with webdriver.Chrome(service=service, options=options) as driver: # Ustawienie timeoutów driver.set_page_load_timeout(10) driver.implicitly_wait(10) # Otwórz stronę driver.get(url) try: # Znajdź wszystkie elementy pasujące do podanej ścieżki XPath elementy = driver.find_elements(By.XPATH, xpath) # Sprawdź, czy znaleziono jakiekolwiek elementy if elementy: # Pobierz ostatni element z listy ostatni_element = elementy[-1] # Podziel tekst na linie i wybierz ostatnią linię linie = ostatni_element.text.splitlines() if linie: ostatnia_linia = linie[-1] # Wyodrębnij liczbę z ostatniej linii liczby = re.findall(r'\d+', ostatnia_linia) if liczby: return int(liczby[-1]) # Zwraca ostatnią liczbę znalezioną w linii else: return "Brak liczby w ostatniej linii tekstu." else: return "Brak linii tekstu w ostatnim elemencie." else: return "Nie znaleziono żadnych elementów dla podanej ścieżki XPath." except NoSuchElementException: return "Element nie został znaleziony dla podanej ścieżki XPath." except TimeoutException: return "Czas ładowania strony został przekroczony." except WebDriverException as e: return f"Wystąpił błąd związany z WebDriverem: {e}" finally: if driver: driver.quit() # Upewnij się, że przeglądarka zostanie zamknięta # znajdż maksymalną stronę def znajdz_maksymalne_x(): i = 99 poprzednie_x = 16 while True: # Oblicz aktualne x aktualne_x = pobierz_ostatnia_liczbe(i) # Sprawdź, czy x przestało rosnąć if aktualne_x == poprzednie_x: break # Aktualizuj poprzednie x poprzednie_x = aktualne_x print(f"Iteracja {i}: x = {aktualne_x}") # Przejdź do następnej iteracji i += 1 return poprzednie_x def pobierz_dane(url): # Stałe ścieżki XPath do elementów xpath_nazwa = '/html/body/div[2]/div/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[2]/h1' xpath_obraz = '/html/body/div[2]/div/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[1]/img' xpath_kategoria = '/html/body/div[2]/div/div[1]/div[1]/div[1]/div[2]/div[1]/p[2]' xpath_cena = '/html/body/div[2]/div/div[1]/div[1]/div[1]/div[2]/div[1]/div[3]/div' xpath_media_spolecznosciowe = '/html/body/div[2]/div/div[1]/div[1]/div[1]/div[2]/div[1]/div[4]/div' xpath_link_do_narzedzia = '/html/body/div[2]/div/div[1]/div[1]/div[1]/div[2]/div[1]/div[5]/a' xpath_dodatkowa_wartosc = '//*[@id="what-is-tool"]/div[2]/div' xpath_opis_narzedzia = '/html/body/div[2]/div/div[1]/div[1]/div[1]/div[2]/div[1]/p[1]' # Konfiguracja przeglądarki options = Options() options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.add_argument('--disable-gpu') options.add_argument('--window-size=1920,1080') # Ścieżka do ChromeDriver chromedriver_path = "./chromedriver.exe" # Utwórz instancję przeglądarki service = Service(executable_path=chromedriver_path) try: with webdriver.Chrome(service=service, options=options) as driver: # Ustawienie timeoutów driver.set_page_load_timeout(3) driver.implicitly_wait(3) # Otwórz stronę driver.get(url) try: # Pobierz nazwę narzędzia z określonego XPath element_nazwa = driver.find_element(By.XPATH, xpath_nazwa) nazwa_narzedzia = element_nazwa.text # Pobierz adres URL obrazu z określonego XPath element_obraz = driver.find_element(By.XPATH, xpath_obraz) adres_obraz = element_obraz.get_attribute('src') # Pobierz kategorię z paragrafu element_kategoria = driver.find_element(By.XPATH, xpath_kategoria) wartosc_kategoria = element_kategoria.text # Przekształć kategorię na listę kategoria = [item.strip() for item in wartosc_kategoria.split(',')] # Pobierz cenę ze ścieżki XPath element_cena = driver.find_element(By.XPATH, xpath_cena) wartosc_cena = element_cena.text # Przekształć cenę na listę cena = [item.strip() for item in wartosc_cena.split(',')] # Pobierz wszystkie linki do mediów społecznościowych z określonego XPath element_media_spolecznosciowe = driver.find_element(By.XPATH, xpath_media_spolecznosciowe) linki = element_media_spolecznosciowe.find_elements(By.TAG_NAME, 'a') media_spolecznosciowe = [link.get_attribute('href') for link in linki if link.get_attribute('href')] # Pobierz adres URL z elementu określonego XPath bez parametrów element_link_do_narzedzia = driver.find_element(By.XPATH, xpath_link_do_narzedzia) url_bez_parametru = element_link_do_narzedzia.get_attribute('href') # Usuń dodatkowe parametry z URL parsed_url = urlparse(url_bez_parametru) link_do_narzedzia = urlunparse(parsed_url._replace(query="", params="", fragment="")) # Pobierz wartość z dodatkowej ścieżki XPath element_dodatkowa_wartosc = driver.find_element(By.XPATH, xpath_dodatkowa_wartosc) dodatkowa_wartosc = element_dodatkowa_wartosc.text # Pobierz opis narzędzia z określonego XPath element_opis_narzedzia = driver.find_element(By.XPATH, xpath_opis_narzedzia) opis_narzedzia = element_opis_narzedzia.text # Zbuduj wynikowy JSON result = { "nazwa_narzedzia": nazwa_narzedzia, "obraz_url": adres_obraz, "kategoria": kategoria, "cena": cena, "media_spolecznosciowe": media_spolecznosciowe, "link_do_narzedzia": link_do_narzedzia, "dodatkowa_wartosc": dodatkowa_wartosc, "opis_narzedzia": opis_narzedzia } return result except NoSuchElementException: print(f"Element nie został znaleziony dla jednej z podanych ścieżek XPath.") return None except TimeoutException: print("Czas ładowania strony został przekroczony.") return None except WebDriverException as e: print(f"Wystąpił błąd związany z WebDriverem: {e}") return None except Exception as e: print(f"Wystąpił błąd: {e}") return None finally: if driver: driver.quit() # Upewnij się, że przeglądarka zostanie zamknięta def znajdz_wszystkie_linki_z_wielu_stron(max_pages): # Stała URL template dla paginacji, teraz w funkcji URL_TEMPLATE = "https://www.futurepedia.io/ai-tools/personal-assistant?page={page}" def znajdz_wszystkie_linki(url): # Sprawdzenie poprawności URL parsed_url = urlparse(url) if not all([parsed_url.scheme, parsed_url.netloc]): print("Niepoprawny URL") return [] # Konfiguracja przeglądarki options = Options() options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.add_argument('--disable-gpu') options.add_argument('--window-size=1920,1080') # Ścieżka do ChromeDriver chromedriver_path = "./chromedriver.exe" # Utwórz instancję przeglądarki service = Service(executable_path=chromedriver_path) driver = None try: driver = webdriver.Chrome(service=service, options=options) # Ustawienie timeoutów driver.set_page_load_timeout(10) driver.implicitly_wait(10) # Otwórz stronę driver.get(url) # Spróbuj znaleźć i przetworzyć linki znalezione_linki = set() # Użycie zestawu do przechowywania unikalnych linków for _ in range(3): # Pętla próbująca trzykrotnie w razie błędu try: linki = driver.find_elements(By.TAG_NAME, 'a') for link in linki: href = link.get_attribute('href') if href and "/tool/" in href: # Dodaj link tylko jeśli zawiera "/tool/" znalezione_linki.add(href) break # Jeśli się powiedzie, przerwij pętlę except StaleElementReferenceException: time.sleep(1) # Czekaj sekundę i spróbuj ponownie except TimeoutException: print("Czas ładowania strony został przekroczony.") znalezione_linki = set() except WebDriverException as e: print(f"Wystąpił błąd związany z WebDriverem: {e}") znalezione_linki = set() except Exception as e: print(f"Wystąpił błąd: {e}") znalezione_linki = set() finally: if driver: driver.quit() # Upewnij się, że przeglądarka zostanie zamknięta return list(znalezione_linki) # Konwersja zestawu na listę wszystkie_linki = set() for page in range(1, max_pages + 1): url = URL_TEMPLATE.format(page=page) linki = znajdz_wszystkie_linki(url) wszystkie_linki.update(linki) print(f"Przetworzono stronę {page}") return list(wszystkie_linki) # Przykładowe użycie funkcji def main(): maksymalne_x = znajdz_maksymalne_x() wszystkie_znalezione_linki = znajdz_wszystkie_linki_z_wielu_stron(max_pages=1) # Wyświetl wszystkie znalezione linki if wszystkie_znalezione_linki: print(f"Znaleziono {len(wszystkie_znalezione_linki)} unikalnych link(ów) zawierających '/tool/' na stronach:") for i, link in enumerate(wszystkie_znalezione_linki, 1): print(f"Link {i}: {link}") result = pobierz_dane(link) print(result) else: print("Nie znaleziono żadnych linków zawierających '/tool/' na stronach.") if __name__ == "__main__": main()