Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Importowanie danych z innej strony po wykonaniu javascriptu
Forum PHP.pl > Forum > PHP
Qlimmax
Witam,
próbowałem przy użyciu PHP Simple HTML DOM Parser zaimportować dane dot. powietrza ze strony http://air.wroclaw.pios.gov.pl/dane-pomiar...metry/wszystkie
Niestety dane doładowują się javascriptem i wypluwa mi stronę bez pomiarów (tabelka). Od WIOŚ danych nie dostanę, mogę liczyć tylko na to co zaciągnę ze strony. Założenie jest takie, aby co godzinę pobierać aktualne pomiary, lub na bieżąco jeżeli będzie to wystarczająco szybkie.

  1. <?php
  2. require('simple_html_dom.php');
  3. $html = file_get_html("http://air.wroclaw.pios.gov.pl/dane-pomiarowe/automatyczne/stacja/23/parametry/wszystkie");
  4. echo $html;
  5. ?>
trueblue
Dane są pobierane metodą POST.
Sprawdź zakładkę Network/Sieć konsoli przeglądarki (Chrome->F12).
nospor
ps: nie ma to jak w produkcyjnym js zostawic console.log....
Cytat
response: Object { success=true, data={...}} success
browse.js?v3 (line 36)
pobrano dane: Object { charts=[0], title="Dane pomiarowe dla stacj...go w dniu 20.12.2016 r.", unitLabel="&micro;g/m<sup>3</sup>", more...}
browse.js?v3 (line 36)
@config.series: 1 [Object { label="Dwutlenek siarki<sup>3)</sup>", measType="auto", paramLabel="Dwutlenek siarki", more...}]
browse.js?v3 (line 32)
value: 350
browse.js?v3 (line 32)
@config.series: 3 [Object { label="Dwutlenek azotu", measType="auto", paramLabel="Dwutlenek azotu", more...}, Object { label="Tlenki azotu", measType="auto", paramLabel="Tlenki azotu", more...}, Object { label="Tlenek azotu", measType="auto", paramLabel="Tlenek azotu", more...}]
browse.js?v3 (line 32)
value: 200
browse.js?v3 (line 32)
@config.series: 2 [Object { label="Ozon", measType="auto", paramLabel="Ozon", more...}, Object { label="Ozon 8h<sup>2)</sup>", measType="auto", paramLabel="Ozon", more...}]
browse.js?v3 (line 32)
value: 120
browse.js?v3 (line 32)
@config.series: 2 [Object { label="Tlenek węgla", measType="auto", paramLabel="Tlenek węgla", more...}, Object { label="Tlenek węgla 8h<sup>2)</sup>", measType="auto", paramLabel="Tlenek węgla", more...}]
browse.js?v3 (line 32)
value: 10000
browse.js?v3 (line 32)
@config.series: 1 [Object { label="Benzen", measType="auto", paramLabel="Benzen", more...}]
browse.js?v3 (line 32)
@config.series: 1 [Object { label="Pył zawieszony PM10", measType="auto", paramLabel="Pył zawieszony PM10", more...}]
browse.js?v3 (line 32)
@config.series: 1 [Object { label="Pył zawieszony PM2.5", measType="auto", paramLabel="Pył zawieszony PM2.5", more...}]
Pyton_000
I tak tam nie ma nic co można by było poprzeglądać w źródle strony smile.gif
nospor
Nie o to mi chodzilo. Chodzilo mi o sam fakt console.log, ktory czesto potrafi zamulic takiego np. firefox dla duuuuzych danych. A w produkcji jest to totalnie zbedne. Juz nie bede wspominal o tym ze stare przegladarki sie poprostu wyloza na takim js i guzik zobaczysz wink.gif
Qlimmax
Cytat(trueblue @ 20.12.2016, 13:52:42 ) *
Dane są pobierane metodą POST.
Sprawdź zakładkę Network/Sieć konsoli przeglądarki (Chrome->F12).



Dziękuję za podpowiedź, zerknąłem do tej zakładki:

Request URL:http://air.wroclaw.pios.gov.pl/dane-pomiarowe/pobierz
Request Method:POST
Accept:application/json, text/javascript
query:{"measType":"Auto","viewType":"Station","dateRange":"Day","date":"20.12.2016","viewTypeEntityId":"23","channels":[418,423,432,425,428,539,422,419,424]}

Tyle udało mi się zrozumieć, że metodą POST pobiera sobie dane w formacie JSON z http://air.wroclaw.pios.gov.pl/dane-pomiarowe/pobierz

Macie jakiś pomysł jak można by te dane uzyskać, tak by można je cyklicznie zaciągać, czy da się GET-em pobrać tego JSON-a?
nospor
php curl
http://php.net/manual/en/book.curl.php
i robisz wszystko tak jak oni na stronie. NIe ma wowczas problemu czy to POST czy GET.
Qlimmax
Cytat(nospor @ 20.12.2016, 14:46:56 ) *
php curl
http://php.net/manual/en/book.curl.php
i robisz wszystko tak jak oni na stronie. NIe ma wowczas problemu czy to POST czy GET.



Ale czy oni nie muszą tego curla obsługiwać? albo coś instalować? da się to jakoś prosto sprawdzić?
Przepraszam za tyle pytań smile.gif
nospor
cURL sluzy do imitowania requestow, ktore robia przegladarki - tak w skrocie
Wiec nie, oni nic nie musza robic. przy pomocy cURL ty wysylasz dokladnie takie samo żądanie co przegladarka wiec oni nawet sie nie kapna ze to ty a nie przegladarka
Qlimmax
Cytat(nospor @ 20.12.2016, 15:08:24 ) *
cURL sluzy do imitowania requestow, ktore robia przegladarki - tak w skrocie
Wiec nie, oni nic nie musza robic. przy pomocy cURL ty wysylasz dokladnie takie samo żądanie co przegladarka wiec oni nawet sie nie kapna ze to ty a nie przegladarka

Super, dziękuję za odpowiedź, teraz już wiem nad czym pracować.
Puszy
Cytat(nospor @ 20.12.2016, 15:08:24 ) *
cURL sluzy do imitowania requestow, ktore robia przegladarki - tak w skrocie
Wiec nie, oni nic nie musza robic. przy pomocy cURL ty wysylasz dokladnie takie samo żądanie co przegladarka wiec oni nawet sie nie kapna ze to ty a nie przegladarka


Z tego co się orientuję mogliby zablokować dostęp i udostępnić skryptom jedynie z konkretnej puli domen.
nospor
Jakich domen?
Puszy
Cytat(nospor @ 20.12.2016, 16:32:53 ) *
Jakich domen?


A czy niemożliwym jest żeby dostęp do http://air.wroclaw.pios.gov.pl/dane-pomiarowe/pobierz miały tylko skrypty odpalane z *.wroclaw.pios.gov.pl?
nospor
A jak to zrobisz by serwer przyjmowal tylko i wylacznie żądanie z *.wroclaw.pios.gov.pl ? Bo chyba nie masz na mysli REFERER wink.gif
Puszy
O nie, nie, referer jest zawodny. Kiedyś spotkałem się z takim przypadkiem, jedyne info jakie otrzymywałem to tekst o tym że skrypt nie jest odpalany właśnie z domeny xyz.com, stąd też wiem że jest opcja wyfiltrowania takich requestów. Być może było to sprawdzanie IP, lub inne dane z nagłówka HTTP, nigdy się w to nie zagłębiałem.
nospor
Cytat
O nie, nie, referer jest zawodny.
Ja to wiem. To bylo pytanie retoryczne wink.gif

Cytat
Być może było to sprawdzanie IP, lub inne dane z nagłówka HTTP, nigdy się w to nie zagłębiałem.
Raczej nie. Co ci da sprawdzenie IP usera? user ma prawo odpalic twoja strone z dowolnego IP (chyba ze pozwalasz tylko na userow z danej firmy a co za tym idzie z danego IP). Inne naglowki tez raczej nie wchodza w gre. Mogli co najwyzej dodawac jakis token do swoich ajaxow/requestow ale i to idzie odczytac.
Puszy
http://erwinmayer.com/labs/asin2ean/index.php#ASIN-to-EAN

tokenów nie widzę nigdzie, nagłówki w HTTP które ewentualnie mogłyby być brane pod uwagę: Host, Origin. Choć teraz jak na to patrzę to rzeczywiście jest cookie, nie podawałem wtedy ciasteczek, będę musiał to sprawdzić jeszcze raz.
nospor
Masz moze kod php, ktorym probowales pobrac dane? Zaciekawiles mnie smile.gif
Puszy
Cytat(nospor @ 20.12.2016, 17:07:14 ) *
Masz moze kod php, ktorym probowales pobrac dane? Zaciekawiles mnie smile.gif


Napisałem kod na nowo i działa, wiem w czym był problem. Strona którą podałem wykonuje dwa zapytania XRH z czego jedno pobiera dane w JSONie a drugie zwraca <iframe> ze stroną Amazona. Z kolei Amazon ma ustawione ograniczenia co do nagłówka Origin, w teorii (być może w praktyce też) nie możesz otworzyć Amazona w ramce i to Amazon wyrzucał błąd. Poniżej kod z ZF2 który pobiera JSONa z danymi o ASINie i EANie:

  1.  
  2. $request = new Request();
  3. $request->getHeaders()->addHeaders([
  4. 'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8',
  5. 'X-Requested-With' => 'XMLHttpRequest',
  6. ]);
  7. $request->setMethod(Request::METHOD_POST);
  8. $request->setUri('http://erwinmayer.com/labs/asin2ean/processing3.php');
  9. $request->setPost(new Parameters([
  10. 'locale' => 'fr',
  11. 'mode' => 'ASIN-to-EAN',
  12. 'ids' => '020530902X',
  13. 'searchIndex' => 'All',
  14. 's' => '',
  15. ]));
  16.  
  17. $client = new Client();
  18. /** @var \Zend\Http\Response $response */
  19. $response = $client->dispatch($request);
  20.  
nospor
No i sprawa z "blokowaniem" wyjasniona wink.gif

dzieki za kod
Qlimmax
Próbowałem z Curl i nie mogę zrozumieć, gdzie błąd popełniam, ciągle otrzymuje zwrotnie: {"success":false,"error":""}

  1. $json = '{"measType":"Auto","viewType":"Station","dateRange":"Day","date":"21.12.2016","viewTypeEntityId":"23","channels":[418]}';
  2. $data = json_decode($json);
  3. $data_string = json_encode($data);
  4.  
  5. $ch = curl_init('http://air.wroclaw.pios.gov.pl/dane-pomiarowe/pobierz');
  6. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
  7. curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
  8. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  9. curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  10. 'Content-Type: application/json',
  11. 'Content-Length: ' . strlen($data_string))
  12. );
  13.  
  14. $result = curl_exec($ch);
  15. echo $result;
  16. curl_close($ch);


Próbuję pobrać jeden rodzaj zanieczyszczenia z jednej stacji http://air.wroclaw.pios.gov.pl/dane-pomiar...enny/21.12.2016

Zrzut z F12/sieć/pobierz
Request URL:http://air.wroclaw.pios.gov.pl/dane-pomiarowe/pobierz
Request Method:POST
Status Code:200 OK
Remote Address:95.50.19.22:80
Response Headers
view source
Cache-Control:no-cache
Connection:keep-alive
Content-Type:application/json
Date:Thu, 22 Dec 2016 10:23:53 GMT
Server:nginx/1.6.2
Transfer-Encoding:chunked
X-Powered-By:PHP/5.4.16
Request Headers
view source
Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip, deflate
Accept-Language:pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Content-Length:199
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Cookie:start_selector_nth=0; start_selector_hide=no; _ga=GA1.3.656740653.1480503322; _gat=1
Host:air.wroclaw.pios.gov.pl
Origin:http://air.wroclaw.pios.gov.pl
Referer:http://air.wroclaw.pios.gov.pl/dane-pomiarowe/automatyczne/stacja/23/parametry/418/dzienny/21.12.2016
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
X-Requested-With:XMLHttpRequest
Form Data
view source
view decoded
query:%7B%22measType%22%3A%22Auto%22%2C%22viewType%22%3A%22Station%22%2C%22dateRange%22%3A%22Day%22%2C%22date%22%3A%2221.12.2016%22%2C%22viewTypeEntityId%22%3A%2223%22%2C%22channels%22%3A%5B418%5D%7D
view URL encoded
query:{"measType":"Auto","viewType":"Station","dateRange":"Day","date":"21.12.2016","viewTypeEntityId":"23","channels":[418]}


Jak cały request headers przekopiowałem, to tylko kilka krzaków dostałem. Nie ma pomysłu co robię nie tak.
trueblue
HEADER jest niepoprawny. Nie jest w ogóle potrzebny.
Dane POST są niepoprawne. Brakuje nazwy zmiennej, która powinna mieć przypisaną wartość JSON (encodowaną).
Qlimmax
Cytat(trueblue @ 22.12.2016, 12:31:57 ) *
HEADER jest niepoprawny. Nie jest w ogóle potrzebny.
Dane POST są niepoprawne. Brakuje nazwy zmiennej, która powinna mieć przypisaną wartość JSON (encodowaną).

Pozbyłem się HEADER

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string))
);

nie wiem skąd tą nazwę zmiennej pozyskać, aby była prawidłowa.

  1. $data = array('measType' => 'Auto', 'viewType' => 'Station', 'dateRange' => 'Day', 'date' => '21.12.2016', 'viewTypeEntityId' => '23', 'channels' => array(418));
  2. $data_string = json_encode($data);
  3.  
  4. $ch = curl_init('http://air.wroclaw.pios.gov.pl/dane-pomiarowe/pobierz');
  5. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
  6. curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
  7. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  8.  
  9.  
  10. $result = curl_exec($ch);
  11. echo $result;
  12. curl_close($ch);

nospor
Cytat
nie wiem skąd tą nazwę zmiennej pozyskać, aby była prawidłowa.
No to jak wejdziesz na ich strone i spojrzysz w ajaxa ktory idzie to jak wol masz napisane ze parametr nazywa sie:
query
Qlimmax
Cytat(nospor @ 22.12.2016, 14:31:30 ) *
No to jak wejdziesz na ich strone i spojrzysz w ajaxa ktory idzie to jak wol masz napisane ze parametr nazywa sie:
query

Działa i ładnie zwraca dane, zbyt dosłownie potraktowałem to query, sądząc że to opis wypisanej pozycji, kłania się brak znajomości narzędzi. Jeszcze raz dziękuję za pomoc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.