Integracja Scrape - ustawienia

Walczę z ustawieniem integracji scrape, na razie bezskutecznie.
Chciałbym ze strony https://www.walutomat.pl/ wyciągnięć kurs sprzedaży USD.

- platform: scrape
  name: Kurs USD
  resource: https://www.walutomat.pl/kursy-walut/usd-pln/
  select: ".sell"
  unit_of_measurement: "PLN"

Niestety powyższy wpis nie działa.
Ktoś może pomóc w tym temacie?

Powinno zadziałać select: '.value' ,ale tam są jakoś modyfikowane wartości, bo co innego wyświetla strona, a co innego jest w kodzie źródłowym.

Dzięki wielkie, sprawdzę.
@Marek, mam jeszcze jedną sprawę. Wpis .value zwraca trzy wartości tj. sprzedaż, kupno i średni kurs.
Wiesz może jak za pomocą value_template sczytać tylko wartość "sprzedaż "?
Za nic nie mogę załapać logiki działania CSS Selector.

Jeśli jest więcej takich samych tagów CSS, to możemy użyć parametru index:
Na tej stronie interesująca nas wartość jest pierwsza index: 0, więc ten parametr można pominąć, bo domyślnie ma on wartość 0. Jak chcesz odczytywać kolejne, to zmieniasz tylko index.

Czyli tak powinien wyglądać cały wpis?:

- platform: scrape
  name: Kurs USD
  resource: https://www.walutomat.pl/kursy-walut/usd-pln/
  select: '.value'
  index: 0
  unit_of_measurement: "PLN"

Tak. Sprawdziłem u siebie i działa.

Fragment kodu źródłowego strony, skąd pobierane są dane.
2

Ale wygląda na to, że ta wartość przed wyświetleniem jest jakoś modyfikowana, bo się różni.
1

Jeszcze raz dziękuję za pomoc.
@Marek coś jest nie tak z tą stroną, u mnie cały czas podaje wartość 3,6359. Jak jest u Ciebie?

Podepnę się pd temat jak wyjąć poprawne wartosci z tunein? Tz tytuł wykonawcę okładkę :wink:

No właśnie o tym pisałem wcześniej. Na tej stronie, chyba działają jakieś skrypty, które modyfikują te wartości, już po jej załadowaniu. W tym wypadku scrape raczej nie zadziała.
Według dokumentacji, scrape to prosty mechanizm który ładuje kod HTML strony i ją przeszukuje. Jak sobie zobaczysz kod źródłowy tej strony, to widać właśnie 3,6359 którą to poprawnie wyciąga.

Dla przykładu tu jest działający kod na stronę cinkciarz.pl. Odświeżanie co 5 minut. Ale nie wiem, czy te strony nie będą blokowały takiej metody wyciągania danych. Do tego celu takie serwisy udostępniają API i to najczęściej płatne.

- platform: scrape
  name: Kurs USD
  resource: https://cinkciarz.pl
  select: '.rate-buy'
  index: 1
  scan_interval: 300
  value_template: '{{- value -}}'
  unit_of_measurement: "PLN"

@tikooo W scrape podajesz konkretny adres url strony, którą przeszukujesz. Z tego co wiem tunein dla każdej stacji ma inny adres url, więc ta metoda będzie raczej mało skuteczna. Trzeba by robić oddzielne sensory dla każdej stacji radiowej.

1 Like

@Marek tak jak napisałeś coś jest nie tak z danymi z tej strony.
Natomiast sprawdziłem teraz kod strony i wartość value jest taka sama:
wal1
wal2

@rafkan w narzędziach developerskich F12 jest poprawna wartość, ale jak zobaczysz źródło strony przez Ctrl+U to jest 3,6359. Ja nie wiem z czego to wynika, może ktoś mądrzejszy mnie oświeci :thinking:

Sprawdź CTRL + F5 w przeglądarce, to wysyła nowy request (zapytanie) do serwera HTTP. Jak widać najpierw na tej stronie pojawia sie kurs 3,6359 po czym na zakończenie przetwarzania tego zapytania pojawia się “aktualny” kurs widoczny na stronie, to wynika z dynamicznych skryptów na tej stronie.
Źródło strony to nie to samo co dostajesz jako efekt w narzędziach developerskich F12, zobacz sobie w narzędziach w zakładce.
image
że strona jest “dynamiczna”.
Chyba prościej będzie skorzystać z gotowego API, odsyłam do dokumentacji Walutomat API dla firm - wymiana walut i przelewy walutowe.

Wygodniej imho użyć dostępnego w walutomacie api i wciągnąć to do HA poprzez rest. Przykład dla pobrania najlepszych kursów sprzedaży/zakupu usd:

rest:
  - resource: 'https://user.walutomat.pl/api/public/marketPriceVolumes/USD_PLN?brief=true'
    scan_interval: 60
    sensor:
      - name: WT USD BID
        value_template: '{{ value_json.BID_USD_PLN[0].rate }}'
        unit_of_measurement: 'PLN'
      - name: WT USD ASK
        value_template: '{{ value_json.ASK_USD_PLN[0].rate }}'
        unit_of_measurement: 'PLN'
3 Likes

I to jest to, działa super :grin:

@Andrzej_Dopierała jeśli to nie problem to dasz radę zrobić kursy euro i franka?

W stosunku do pln? Robi się analogicznie, czyli:

rest:
  - resource: 'https://user.walutomat.pl/api/public/marketPriceVolumes/USD_PLN?brief=true'
    scan_interval: 60
    sensor:
      - name: WT USD BID
        value_template: '{{ value_json.BID_USD_PLN[0].rate }}'
        unit_of_measurement: 'PLN'
      - name: WT USD ASK
        value_template: '{{ value_json.ASK_USD_PLN[0].rate }}'
        unit_of_measurement: 'PLN'
  - resource: 'https://user.walutomat.pl/api/public/marketPriceVolumes/CHF_PLN?brief=true'
    scan_interval: 60
    sensor:
      - name: WT CHF BID
        value_template: '{{ value_json.BID_CHF_PLN[0].rate }}'
        unit_of_measurement: 'PLN'
      - name: WT CHF ASK
        value_template: '{{ value_json.ASK_CHF_PLN[0].rate }}'
        unit_of_measurement: 'PLN'
  - resource: 'https://user.walutomat.pl/api/public/marketPriceVolumes/EUR_PLN?brief=true'
    scan_interval: 60
    sensor:
      - name: WT EUR BID
        value_template: '{{ value_json.BID_EUR_PLN[0].rate }}'
        unit_of_measurement: 'PLN'
      - name: WT EUR ASK
        value_template: '{{ value_json.ASK_EUR_PLN[0].rate }}'
        unit_of_measurement: 'PLN'

Jeżeli byłoby potrzebne więcej kursów/par, można sięgnąć do zbiorczego endpointu https://user.walutomat.pl/api/public/marketPriceVolumes/
Przy czym tu jest mały haczyk - “zbiorczy” endpoint waży jakieś 400kB, podczas gdy poszczególne w/w endpointy jak użyjemy brief=true mają po ok 4kB. Więc biorąc tylko trzy co minutę będziemy ciagnąć 3*4kB=12kB zamiast 400kB z pełnego stanu giełdy.

2 Likes

Nie zdążyłem napisać, że podmieniłem w linku resource waluty i poszło. Jeszcze raz dziękuję.