­čö¬ Data scraping / Skrobanie danych ze stron

Data scraping / Skrobanie danych

:hocho:
po angielsku chyba lepiej brzmi :wink:

Poka┼╝─Ö jak w bardzo ┼éatwy sps├│b mo┼╝na pobiera─ç dane ze stron bo np. nie ma api a wiemy, ┼╝e jest jaka┼Ť informacja na stronie i chcemy j─ů mie─ç w HA.
Scraping nie jest do ko┼äca legalnyÔÇŽ omijamy reklamy itdÔÇŽ robimy to czysto edukacyjnie :slight_smile:

Zrobimy to na bramce w JavaScript - NodeJS:

Załużmy, że chcemy pobrać kurs miedzi ze strony bankier.pl

Selektor css

w tym celu otweiramy w przegl─ůdarce ┼║r├│d┼éo strony i lokalizujemy element z cen─ů:

jak wida─ç jest to div.profilLast

Program w nodejs

Teraz napiszemy programik który będzie te dane skrobał (echh) ze strony cenę miedzi.
W konsoli przechodzimy do AIS i tworzymy folder programy

cd ~/AIS
mkdir programy
cd programy

dodajemy plik miedz.js

nano miedz.js

z takim kodem:

const axios = require('axios');
const jsdom = require('jsdom');
const {JSDOM} = jsdom;

(async () => {
 const html = await axios.get('https://www.bankier.pl/inwestowanie/profile/quote.html?symbol=MIEDZ');
 const dom = new JSDOM(html.data);

 const cena = dom.window.document.querySelector('div.profilLast');

 if (cena) {
   console.log(cena.textContent)
 }
})();

zapisujemy plik, instalujemy 2 biblioteki:

npm install axios
npm install jsdom

teraz mo┼╝emy ju┼╝ wywo┼éa─ç nasz program wpisuj─ůc w konsoli:

node miedz.js 

Pomocnik w aplikacji

dodajemy pomocnika w aplikacji - to w nim b─Ödziemy zpisywali cen─Ö miedzi

kopujemy identyfikator encji nowego pomocnika

i dodajemy go na stron─Ö w aplikacji

Wywołanie programu z usługi

service: ais_shell_command.execute_command
data:
  command: node ~/AIS/programy/miedz.js
  entity_id: input_text.cena_miedzi

Automatyzacja

To już wiadomo - możemy wywołać uslugę z automatyzacji i sprawdzać cenę codziennie automatycznie.

:warning: Data scraping nie jest legalnym sposobem na dostęp do danych i dlatego ten post ma charakter czysto edukacyjny - żeby pokazać jak technicznie działa skrobanie danych ze stron.

5 polubień

Bardzo dziękuję za przykład. Edukacja trwa :wink:

O ile w konsoli otrzymuję prawidłowy wynik zeskrobanej ceny miedzi,
obraz

o tyle w HA jest jaki┼Ť kwiatek przy karcie encji.

W narz─Ödziach deweloperskich podobnie:

Kod \xc2\xa0 w kodowaniu UTF-8 to tzw. niełamliwa spacja. trzeba by to odfiltrować :slight_smile:

1 polubienie

Tu jest troch─Ö wi─Öcej ┼Ťmieci:

  1. bÔÇÖÔÇŽÔÇÖ - to raczej jest dodane przez serwis Jolki wi─Öc tego nie naprawisz
  2. \xx - mo┼╝na obej┼Ť─ç regexem kt├│ry kasuje non-ASCI znaki
  3. \n - koniec linii odczytany przez serwis Jolki i tam chyba powinien by─ç ogarni─Öty, ewentualnie mo┼╝na napisa─ç np. process.stdout.write(cena.textContent); zamiast console.log(cena.textContent)

Tylko jak to jest, ┼╝e u @jolka jest czysty wynik a u mnie ┼Ťmieci? Nie jestem programist─ů ale ciekawi mnie sk─ůd taka r├│┼╝nica?

bÔÇÖxxxxÔÇÖ to klasa typu bytes z Python:

>>> text = b"9\xc2\xa0748,25 USD/tona\n"
>>> type(text)
<class 'bytes'>
>>> print(text)
b'9\xc2\xa0748,25 USD/tona\n'
>>> print(text.decode('UTF-8'))
9 748,25 USD/tona

po metodzie decode() w Phyton na print() mamy ju┼╝ bez ÔÇťfarfocliÔÇŁ :slight_smile:

Witam .
A czy kto┼Ť mo┼╝e znalaz┼é by czas ┼╝eby ┼éopatologicznie wy┼éo┼╝y─ç jak zrobi─ç takie pobieranie danych w przypadku je┼╝eli trzeba si─Ö zalogowa─ç na stron─Ö i dopiero pobra─ç wy┼Ťwietlane dane.

1 polubienie

Je┼╝eli strona do scrapingu jest prosta mo┼╝na skorzysta─ç z oficjalnej integracji Scrape - Home Assistant, jest te┼╝ mo┼╝liwo┼Ť─ç autentykacji (podania loginu i has┼éa). Przy konieczno┼Ťci logowania do strony bardzo cz─Östo mo┼╝na skorzysta─ç z RESTful - Home Assistant.

Cze┼Ť─ç, mo┼╝e pom├│g┼éby mi kto┼Ť w ogarni─Öciu odczytu danych z mojego invertera pv ze strony foxesscloud.com chodzi dok┼éadnie o dwa odczyty tzn: bie┼╝─ůca produkcja i chwilowa moc .
Na stron─Ö trzeba si─Ö oczywi┼Ťcie logowa─ç,



Fox Cloud API Protocol.pdf (451,0 KB)

Scraping tutaj nie ma sensu bo masz API, tylko musisz je skonfigurowa─ç.
Na dodatek jest opcja z MQTT wi─Öc ÔÇťdzie┼ä dobry XXI wiekÔÇŁ

1 polubienie

FajnieÔÇŽ Tylko kurka jak to osi─ůgn─ů─ç?

widz─Ö ┼╝e jest integracja custom_components:
GitHub - macxq/foxess-ha: Home Assistant & FoxESS integration (cdnweb.icu)
ale faktycznie jak jest mo┼╝liwo┼Ť─ç przez MQTT to najlepsze rozwi─ůzanie, zacznij od ustawienia tego:


gdzie ÔÇťBroker AddresÔÇŁ to adres ip twojej bramki

potem wykorzystuj─ůc MQTT Explorer zobacz czy sp┼éywaj─ů jakie┼Ť dane po MQTT

1 polubienie

Mo┼╝e za┼é├│┼╝ nowy temat, jak zainstalowa─ç niestandardowy komponent masz opisane na forumÔÇŽ

@Tomasz - :+1:
mo┼╝e ten link z instrukcj─ů b─Ödzie bardziej czytelny (ta sama integracja).

1 polubienie


powiedz co to jest?
masz to gdzie┼Ť w ustawieniach invertera a mo┼╝e w chmurze foxesscloud.com?
ja to tak rozumiem, ┼╝e gdzie┼Ť w ustawieniach invertera wpisujesz adres swojego serwera mqtt czyli twojej bramki i wtedy bramka wykrywa sensory z invertera, co┼Ť na zasadzie jak z Iot link

Zacznij od przeczytania lektury aby zrozumieć jak działa MQTT:

Postaraj się zrozumieć i załóż osobny temat, to w nim Ci pomożemy. Szoka robić off-topic.

1 polubienie

Dobra, jak przetrawi─Ö t─Ö wszystkie informacje i si─Ö troch─Ö w tym ogarn─Ö to za┼éo┼╝─Ö nowy temat i tam b─Öd─Ö dr─ů┼╝y┼é go dalej. Na t─ů chwil─Ö podzi─Ökowa─ç wam musz─Ö za pomoc!

faktycznie zwracamy obiekt w bajtach a nie tekst

image

zwraca

image

w python ┼╝eby przerobi─ç obiekt w bajtach na string trzeba zrobi─ç decode("utf-8")
trzeba dopisa─ç co┼Ť takiego w pliku integracji ais_shell_command kt├│ry jest na bramce

Poprawimy to w kolejnym wydaniu i opiszemy dok┼éadniej us┼éug─Ö execute_command bo ona mo┼╝e mie─ç wi─Öcej parametr├│w (dotychczas u┼╝ywali┼Ťmy j─ů tylko wewn─Ötrznie) i mo┼╝e si─Ö to komu┼Ť przyda─ç.

service: ais_shell_command.execute_command
data:
  command: echo "123 EUR"
  entity_id: input_text.cena_miedzi
  friendly_name: Aktualna cena miedzi
  icon: mdi:cash-100

ważne żeby zrozumieć działanie:


PS

Oczywi┼Ťcie mo┼╝na to zrobi─ç w inny spos├│b, np. przez ÔÇťasynchroniczny interfejs plikowyÔÇŁ. Czyli tak:

  1. Nasz program (w dowolnym j─Özyku kt├│ry jest na bramce), robi jak─ů┼Ť ÔÇťmagi─ÖÔÇŁ i zapisuje wynik do pliku ~/AIS/programy/sensor1.txt

np. powy┼╝szy program kt├│ry napisali┼Ťmy w nodejs
mo┼╝emy przekirowa─ç wyj┼Ťcie do pliku a nie bezpo┼Ťrednio do encji w aplikacji, co┼Ť takiego

service: ais_shell_command.execute_command
data:
  command: node ~/AIS/programy/miedz.js > ~/AIS/programy/sensor1.txt

po wywołaniu takiej usługi

mo┼╝emy sprawdzi─ç w konsoli efekt:

cat ~/AIS/programy/sensor1.txt

image

  1. Dodajemy w AIS/HA sensor kt├│ry zaczytuje dane z pliku
sensor:
  - platform: file
    file_path: ~/AIS/programy/sensor1.txt

Wszystko si─Ö dzieje asynchronicznie, nikt na nikogo nie czeka.

W efekcie mamy dane w encji nowego sensora, o te dane mo┼╝emy pyta─ç asystenta g┼éosowo komend─ů:

  • status ...
  • jaka jest ...
  • jaki jest ...
    ÔÇŽ
3 polubienia