May 17, 2026, 11:40 PM

This commit is contained in:
Paweł Domański
2026-05-18 06:40:19 +00:00
commit 64944cf004
896 changed files with 310709 additions and 0 deletions
+288
View File
@@ -0,0 +1,288 @@
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/div/div'
# Dynamiczny URL strony na podstawie parametru page
url = f"https://www.futurepedia.io/ai-tools/ai-agents?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}"
# 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 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/ai-agents?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)
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)
# 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()
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)
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
# Przykładowe użycie funkcji
def main():
# Znajdź linki na wszystkich stronach (np. od 1 do 19)
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)
# Wyświetl pobrane dane w formacie JSON
if result:
print(json.dumps(result, indent=2))
else:
print("Nie udało się pobrać danych.")
else:
print("Nie znaleziono żadnych linków zawierających '/tool/' na stronach.")
if __name__ == "__main__":
main()