Scrapowanie strony WizzAir

0

Czesc, chce zasceapeowac dane ze strony wizzair. Gdy klikne na element na stronie i potem zbadaj mam wszystkie dane. Gdy próbuje pobrac je poprzez pythona uzywajac BeautifulSoup dane sa bardzo okrojone i nie ma tego co bym chcial czyli cen. Jest jakis sposob na ekstrakcje tych danych. Szukam odpowiedzi w internecie juz drugi dzien i nigdzie nie moge jej znalezc.

4

Ułożenie fusów w mojej kawy mówi... Powodów może być wiele.

  • Kontent jest generowany przez js
  • Używasz złych selektorów
4

A nie myślałeś żeby użyć po prostu API WizzAir'a?

https://airlabs.co/wizz-air-developer-api

1

To jest fragment mojego kodu

from_dest = "WAW"
to_dest = "ORY"
date_from = datetime.date(2023, 3, 17)
people = 2

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
}
url = f"https://wizzair.com/pl-pl#/booking/select-flight/{from_dest}/{to_dest}/{date_from}/null/{people}/0/0/null"
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.text, "lxml")
results = soup.find("body")

print(soup)
print(url)
1

Zapisz do pliku dokładnie to, co pobierasz za pomocą requests.get, potem sprawdź, czy plik zawiera te informacje, które chcesz wyciągnąć.

Nie wiem, na jakim systemie operacyjnym próbujesz to zrobić i jaką postać ma aplikacja (backend do webu, czy aplikacja w GUI), jeżeli w tak zapisanym pliku nie ma poszukiwanych informacji, to myślę, że można to zrobić na dwa sposoby (pomijając API udostępnione przez WizzAir):

  1. Trudniejszy i bardziej pewny: Za pomocą narzędzi w przeglądarce sprawdzić, jakie dodatkowe pliki pobiera przeglądarka i jakie skrypty uruchamia, żeby dodać poszukiwane informacje. Prawdopodobnie da się wydedukować, jak pozyskać te informacje.
  2. Łatwiejszy i bardziej zawodny: Jeżeli do Pythona istnieje biblioteka GUI, która zawiera osadzoną przeglądarkę, to potrzebne będzie z niej skorzystanie. Ta aplikacja niech do tej wbudowanej przeglądarki wczyta adres i doczytają się wszystkie dodatkowe informacje tak samo, jak w standardowej przeglądarce. Potem możesz z przeglądarki odczytać finalny HTML, czyli to, co uzyskujesz za pomocą "zbadaj element". Jeżeli do Pythona nie istnieje odpowiednia biblioteka, to potrzebne będzie napisanie osobnej aplikacji, na przykład Windows Forms w .NET dawniej miał tak osadzony Internet Explorer, teraz nie wiem, czy WPF lub MAUI coś takiego posiada i jaką przeglądarkę można osadzić. Dodatkową aplikację należy tak zrobić, żeby przyjmowała komendy ze standardowego wejścia (np. żądanie otwarcie określonego adresu), a na standardowe wyjście przekazywała dane, np. na żądanie kodu HTML na standardowym wejściu powinna wysłać cały HTML na standardowe wyjście. W Pythona uruchamiasz tą dodatkową aplikację z przekierowaniem standardowego wejścia i wyjścia i wysterujesz ją poprzez podawanie informacji na standardowe wejście. Są też inne sposoby komunikacji między procesami, ale standardowe strumienie to jest chyba najprostszy z nich i najlepszy w przypadku, gdy pomocniczy program ma tylko reagować na żądania programu sterującego.
0
andrzejlisek napisał(a):
  1. Łatwiejszy i bardziej zawodny:

Selenium. Potem przy użyciu XPathów możesz łapać dane z interesujących Cię pól/miejsc. Wadą tego rozwiązania jest to, że jak zmienią coś na stronie to xpath mogą się rozjechać. Ale nie wiem jak często robione są większe zmiany na frontach 🤷‍♂️

0

W jaki sposob moge znalezc linki do json na wizzair?

0

Przejrzałem to wrzucone wcześniej api i do wyciągania cen biletów się nie przyda.
Api ze strony mają zabezpieczone jakimś ciastkiem czy czymś, bo nie można tak yolo sobie z postmana pingować. Nawet mają w TOS wpisane, że nie pozwalają na używanie automatyzacji na ich stronie bez ich zgody.

Pozostaje albo zgłębić temat i jakoś przejść zabezpieczenia w api. Trudniejsza jest to droga zdecydowanie i jeśli pytasz o 'linki' to bym jej raczej unikał.
Drugie podejście to użycie jakiegoś selenium / lub innego frameworka i odpalanie strony headless i wyciąganie danych które zwraca api.
Selenium to framework testowy to testowania aplikacji/stron w przeglądarce, jest dość popularny i sporo do niego poradników, więc myślę, że poszedłbym tą stroną. Dodatkowo zawsze możesz się czegoś nowego nauczyć.

Przykładowe dane zwracane są z https://be.wizzair.com/16.2.0/Api/search/search gdzie w danych wejściowych masz:

{
adultCount:int
childCount:int
flightList: [{
    "departureStation": "XXX", -- kod iata
    "arrivalStation": "XXX", -- kod iata
    "departureDate": date
}]
infantCount:int
isFlightChange:bool
wdc:bool
}

Pewnie trzeba by było posprawdzać co tam leci w headerze/ciastkach przy okazji requestu. Ale nawet jak tą wartość wyciągniesz ręcznie z przeglądarki to na 99% ma ona jakiś krótki lifetime i przestanie działać po iluś requestach lub jakimś czasie i będzie bezużyteczna w tym Twoim toolu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1