Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Popranie danych z innej strony
Forum PHP.pl > Forum > Przedszkole
Stron: 1, 2
Nico~
Witam,

Chciałbym z tej strony http://playarena.pl/umbrella?city_id=1#bra...omming_meetings pobrać i wyświetlić 5 nadchodzących meczów na mojej stronie.
Jestem kompletnie zielony z php, a ta funkcja jest mi bardzo potrzebna. Chciałbym się dowiedzieć jak to zrobić i przy okazji nauczyć, także proszę o wyrozumiałość. Przeszukałem wiele stron, ale nigdzie nie znalazłem rozwiązania na swój problem.

Proszę o pomoc smile.gif
fate
Mam nadzieje ze HTMl ogarniasz:
http://nimishprabhu.com/top-10-best-usage-...dom-parser.html
Miłej nauki, jak grzyby po deszczu wszscy o to samo
Nico~
Udało pobrać mi się tylko <title> czyli tytuł, ale zawartości tam gdzie znajduje się ta lista meczów się jakoś nie umiem. Ktoś pomoże i wytłumaczy mi to ?
fate
Jak tak zerknąlem szukasz 5 piewrwszych divów:
div class="col-xs-8 meetTeamName"
uzywaj firebuga lub polecenia zbadaj zeby sie odnaleźć co potrzebujesz
tu wydaje mi sie masz odpowiedz jak to zrobic;
stackoverflow.com/questions/15761115/find-div-with-class-using-php-simple-html-dom-parser#answer-15761167
Nico~
Czyli 5 pierwszych div'ów to:

1. div class="col-xs-8 meetTeamName"
2. div class="text-right"
3. div class="text-center"
4. <div> </div>
5. div class="col-xs-3"

Dobrze myślę czy się mylę?
SmokAnalog
Fate, myślisz że osoba "kompletnie zielona z php" poradzi sobie z parserem DOM?
Nico~
Mniej więcej ogarnąłem to i testowo sprawdziłem na pierwszej lepszej tabelce z kursami walut i mi ją pięknie pobrało i wyświetliło.
Teraz próbuję pobrać tabelę ligową stąd: http://playarena.pl/umbrella?city_id=1#lea...asonTable_13947, no i niestety kicha. Próbuję pobrać i wyświetlić wszystkie linki (znacznik: <a>) i niestety wyświetla mi tylko link do: "zaloguj się, zarejestruj, itd" a powinno przecież linki do drużyn także pobierać...
Czy możliwe jest że ta tabela jest jakoś zabezpieczona? Jeśli tak, to da się to jakoś obejść? BARDZO MNIE TO CIEKAWI
fate
no i widzisz Smoku jak Nico szybko się uczy.
Problemem jest to, że pobieramy dane z "niewłaściwego" linka czyli jest to jak to nazwałeś jest zabezpieczone

Content jest doczytywany z oddzielnych plików za pomocą AJAX jeżeli cos Ci to mowi w skrocie "bez przeladowania strony"
Gdbyś "odgadł" link do tych właśnie doczytywanych plików to byś sobie poradził.

Pewnie z cURL się da ale akurat nie robiłem nigdy tego, masz tu zalążek może błądząc po pokrewnych do czegoś dojdziesz
http://forums.phpfreaks.com/topic/285888-a...tml-dom-parser/
http://stackoverflow.com/questions/3928228...l-get-ajax-data
http://www.goldenline.pl/grupy/Komputery_I...problem,788950/


btw z ta lista 5 nadchodzacych meczy mialem na mysli pobranie zawartosci 5 divow od poczatku ale wszystkich z jednakowa klasa:
div class="col-xs-8 meetTeamName"
a nie ogolnie 5 1szych
tzm
Cytat(SmokAnalog @ 31.07.2014, 22:36:15 ) *
Fate, myślisz że osoba "kompletnie zielona z php" poradzi sobie z parserem DOM?



No a co w tym takiego? tydzień od tego jak się zacząłem uczyć php szef mi kazał napisać parser strony który pobierał 4000 produktów ze sklepu, na różnych stronach, kategoriach, zdjęcia, opisy, właściwości, dostępność magazynową... co prawda miesiąc to pisałem ale wszystko jest dla ludzi.

Nico~ na pierwszy rzut oka widzę że to Cie powinno najbardziej interesować:

  1. class="meetItem row meetUpcomming"


Potem to już explode i tablice i foreach. Dasz radę a jak nie to po pracy siądę smile.gif
Nico~
Jest! Udało mi się dostać do pliku, gdzie są przechowywane mecze. smile.gif Oto i odnośnik do niego: http://playarena.pl/branch/ajaxMeetings/branch_id/28
Jestem na dobrej drodze testowałem znacznik <a> i wszystko śmiga jak należy. Ale wracając do rzeczywistości to mam koda taki:

  1. <?php
  2. include_once('simple_html_dom.php');
  3.  
  4. $html = file_get_html('http://playarena.pl/branch/ajaxMeetings/branch_id/28');
  5.  
  6. // Find all images
  7. foreach($html->find('div.meetItem row meetUpcomming') as $element)
  8. echo $element;
  9. ?>


No i dalej nie pobiera mi tych spotkań, co teraz? sad.gif
SmokAnalog
W linii 7. masz nieprawidłowy selektor. taki zapis HTML:

  1. <div class="meetItem row meetUpcomming">


oznacza, że div ma 3 klasy: meetItem, row oraz meetupComming. Selektor CSS do wyboru elementu o kilku klasach wygląda tak:

  1. div.meetItem.row.meetUpcomming


Zauważ brak spacji. Spacja oznacza "element wewnątrz". Pytanie czy musisz identyfikować ten div po wszystkich klasach, pewnie wystarczy po jednej. Jaki wynik dokładnie Cię interesuje?
Nico~
Poprawiłem tą linijkę, jednak dalej mi wyświetla pustą stronę, nie wiadomo czemu.
Przepraszam, ale za bardzo rozumiem twojego pytania.
SmokAnalog
Co ma być wynikiem ostatecznym?
Nico~
Wynikiem ostatecznym mają być tylko najbliższe mecze.

Ale sprawdziłem to
  1. div.meetItem
i mi wyskoczyły te mecze wszystkie mecze, tylko że rozegrane + nadchodzące, a chciałbym same nadchodzące.
tzm
meetUpcomming == spotkaniaNadchodzące

angielski się kłania do pasa
Nico~
mitorski, właśnie na to wpadłem tongue.gif

Dobra, wszystko pięknie wpisałem klasę
  1. div.meetUpcomming
i mi wyświetla to co chciałem! smile.gif
Teraz dodatkowe pytanie, jak to wrzucić w tabelkę? I wyrzucić "Do meczu pozostało:"
Bo jak na razie jest w takiej o to formie:
Kod
01.08.2014
Fc Kleczków
vs
Royal Blue
Do meczu pozostało:
01.08.2014
Spartakus Wrocław
vs
The Invincbles
Do meczu pozostało:
01.08.2014
Runner's Football Team
vs
Dywizjon 71
Do meczu pozostało:
fate
Nico musisz mi powiedzieć jak "odgadles" ten link, co prawda to nie było moje zadanie ale szybciutko się poddałem
Cytat(Nico~ @ 1.08.2014, 02:21:21 ) *
BARDZO MNIE TO CIEKAWI

SmokAnalog
Tak jak Mitorski zaproponował:
  1. foreach ($html->find('.meetUpcomming') as $element) {
tzm
Daj skrypta to Ci to poskładam w tablice i ogarnę tabele jakąś
fate
Nie musi być tabela możesz to poprostu ostylować na poczatek spróbuj
.row div{diplspay: inline; border: 1px solid #aaa}
na hama moglbys przekleic CSSa z ich strony glownej to bys mial idento ohno-smiley.gif

patrz jakie tam masz już użyte klasy i je wykorzystaj, chyba że wolisz wszystko rozbić a potem wyświetlać w rzeczywistej tabeli

mitorski jakie poświęcenie ^^ btw
Nico~
fate, bardzo dokładnie przejrzałem kod i znalazłem coś takiego:
Kod
<script>
    loadAjaxContent('/branch/ajaxMeetings/branch_id/28', 'branch_');
</script>


+ nie chcę identycznie jak u nich tongue.gif

mitorski, proszę bardzo kod:

  1. <?php
  2. include_once('simple_html_dom.php');
  3.  
  4. $html = file_get_html('http://playarena.pl/branch/ajaxMeetings/branch_id/28');
  5.  
  6.  
  7. foreach($html->find('div.meetUpcomming') as $element)
  8. echo $element;
  9. ?>
fate
EDIT
normalnie czat by sie przydał baaasmiley.gif

Dzięki, widać masz talent i zacięcie, nieformalny + dla Cb
SmokAnalog
Może to skok na głęboką wodę, ale ja proponuję zmienić skrypt parsera DOM na inny, bo ten jest dość ubogi. Aż za bardzo simple biggrin.gif

Ja używałem ostatnio tego: https://code.google.com/p/phpquery/ - przydałaby się zwłaszcza metoda map(), przerobilibyśmy ten HTML na surowe dane i mógłbyś to pięknie wtedy ostylować tak jak tylko chcesz smile.gif
tzm
Cytat(fate @ 1.08.2014, 11:48:33 ) *
mitorski jakie poświęcenie ^^ btw


nudze się, jakieś cssy robie i próbuje narysować linie między elementami na wykresie tongue.gif
Nico~
Tak dodatkowo chcę jeszcze pobrać i wyświetlić tabelę ligową http://playarena.pl/umbrella?city_id=1#lea...asonTable_13947
Cały kod przeszukałem no i niestety nie znalazłem pliku odpowiedzialnego za tabelę, jest może jakieś inne rozwiązanie aby to uczynić? wink.gif
SmokAnalog
Oczywiście: http://playarena.pl/leagueSeason/ajaxTable...season_id=13947
Nico~
Jesteś wielki! Wow gdzie to znalazłeś?
SmokAnalog
Użyłem Narzędzi Developerskich w Google Chrome, zakładka Network smile.gif Ona wyświetla wszystko, co zostało załadowane przez stronę. W kategorii XHR masz wszystkie żądania Ajaxowe. Nie było trudno znaleźć tabelę, bo były tam tylko 3 pozycje i nazwa aż się rzucała w oczy.
Nico~
A jak te mecze wrzucić w tabelkę, bo chciałbym popróbować coś zrobić zanim mitorski ogranie mi to? smile.gif
SmokAnalog
Jeśli myślisz poważnie o fajnym ostylowaniu, to tak jak mówiłem, proponuję najpierw sprowadzić te dane do surowych struktur. Potem możesz z nimi zrobić co zechcesz. I przypominam o mojej propozycji pobrania phpQuery. Z tamtejszą metodą map() zamienisz ten HTML w co tylko chcesz.
Nico~
No coś tam pokombinuję, może akurat mi uda się to opanować. Bo zależy mi na tym, aby to w styl wrzucić.
Wszystko spoko, tylko nie wiem od czego mam zacząć i jak to zrobić, masz może przydatne linki jeśli mógłbym prosić?
SmokAnalog
Ja nie ukrywam, że wrzucam Cię na dość głęboką wodę, bo widzę że nieźle sobie radzisz. Powiem Ci najpierw skąd moja propozycja. Cel jest taki, żeby móc osiągnąć zupełnie dowolny HTML i żeby móc go sobie dowolnie wygodnie zmieniać w każdej chwili. A żeby to zrobić, to najlepiej jest pracować na danych, a nie na innym HTML-u. Tutaj celem będzie tablica z wynikami. Mając taką tablicę, utworzysz sobie własny kod HTML, nie będziesz ograniczony w żaden sposób tym HTML-em, który oni napisali. Możesz z tego cuda-wianki zrobić smile.gif

Zacznij od zamiany ich HTML-a na tablicę z danymi. Jest wiele sposobów na to, ale najwygodniejszą jest ta wspomniana przeze mnie metoda map(). Ona przyjmuje jako parametr funkcję, w której robisz co zechcesz. W ten sposób możesz np. każdy wiersz z tabeli zamienić na tablicę z danymi.

To już jest dość wysoka szkoła jazdy smile.gif
Nico~
No trudno, może dam radę to ogarnąć. tongue.gif

Dasz mi może jakiś link do dokumentacji lub tutów, bo za bardzo nie wiem czego szukać. Czy to array_map?
SmokAnalog
Nie, mówię o phpQuery. Strona dokumentacji wspominająca o map() jest tu: https://code.google.com/p/phpquery/wiki/Traversing
Nico~
Czyli mam wzorować się tylko na tej funkcji map()? Czy na jakieś jeszcze? I powiedz mi czy ten kod co miałem, zostaje czy na jego podstawie działać dalej.
SmokAnalog
Jeśli chcesz użyć phpQuery to nie. To jest alternatywa dla tej biblioteki, której teraz używasz. Żebyś się nie przeraził metodą map(), wytłumaczę Ci jak ona działa. Wytłumaczę na przykładzie array_map, bo zasada działania jest taka sama. Napisałem taki oto bzdurny kod:

  1. $animals = array('cat', 'dog', 'hamster');
  2.  
  3. $animals = array_map(
  4. function($animal) {
  5. if (strlen($animal) === 3)
  6. return '!' . $animal . '!';
  7.  
  8. return '--' . $animal;
  9. },
  10. $animals
  11. );


Tutaj, po użyciu array_map, tablica składająca się z [cat, dog, hamster] zamieni się w tablicę składającą się z [!cat!, !dog!, --hamster]. Nie miałem lepszego pomysłu smile.gif

Dla każdego elementu tablicy zostaje wywołana funkcja i ten element zostaje zamieniony na to, co zwraca ta funkcja. Dałem taki przykład, żeby od czegokolwiek dodatkowo uzależnić wynik. Dlatego zwierzaki na 3 litery zostają zamienione inaczej niż pozostałe.

Rozumiesz? biggrin.gif
Nico~
Rozumiem tą kwestię, tylko nie bardzo kumam tej rzeczy jak to zasysa dane i jak to rozwiązać aby wklepywało do tablicy (dobrze mówię)?
SmokAnalog
Dam Ci jeszcze inny przykład. Załóżmy, że masz taką listę:
  1. <ul id="lista">
  2. <li title="Jedynka">Jeden</li>
  3. <li title="Dwójka">Dwa</li>
  4. <li title="Trójka">Trzy</li>
  5. </ul>

Chcemy na przykład uzyskać tablicę składającą się z wartości atrybutu title elementów listy #lista. Można to zrobić tak:
  1. $result = pq('#lista li')->map(function($element) {
  2. return pq($element)->attr('title');
  3. })->elements;


Wynikiem będzie tablica: [Jedynka, Dwójka, Trójka]. W ten sam sposób, choć trochę trudniej, zamień sobie strukturę tabelki HTML-owej na tablicę surowych danych.
Nico~
Dobra, tabele wyłapałem oto kod:
  1. <?php
  2. require('phpQuery/phpQuery.php');
  3. include_once('simple_html_dom.php');
  4.  
  5. $html = file_get_html('http://playarena.pl/leagueSeason/ajaxTable?league_season_id=13947');
  6.  
  7. foreach($html->find('table.separate') as $element)
  8. echo $element;
  9.  
  10. ?>


Teraz 'table.separate' muszę przekształcić na swoje "table"?
SmokAnalog
Pisałem Ci, że phpQuery to alternatywa dla Simple HTML DOM, więc ta ostatnia biblioteka jest teraz zbędna. Możesz usunąć jej pliki i usunąć include_once. Przeczytaj jak się "otwiera" kod HTML z phpQuery.

===

Proszę:
  1. <?php
  2.  
  3. require_once('phpQuery-onefile.php');
  4.  
  5. phpQuery::newDocumentFileHTML('http://playarena.pl/leagueSeason/ajaxTable?league_season_id=13947');
  6.  
  7. $cellsMap = array(
  8. 2 => 'team',
  9. 5 => 'wins',
  10. 'draws',
  11. 'fails',
  12. 'goals',
  13. 'points'
  14. );
  15.  
  16. $result = pq('tbody tr')->map(function($row) use ($cellsMap) {
  17. $result = array();
  18. $cells = pq($row)->find('td');
  19.  
  20. foreach ($cellsMap as $index => $name) {
  21. $result[$name] = trim($cells->eq($index)->text());
  22. }
  23.  
  24. return array($result);
  25. })->elements;
  26.  
  27. echo json_encode($result);


To jest kod, który może posłużyć Ci za piękną podstawę do formatowania. Użyłem json_encode, żeby nadać temu charakter API. Dzięki temu będziesz mógł ładować sobie tę tabelkę Ajaxem jeśli zechcesz.
Nico~
Super. Dzięki wielkie wink.gif

Tylko:
Kod
Parse error: syntax error, unexpected T_FUNCTION, expecting ')' in /home/obarapat/domains/obarapat.linuxpl.info/public_html/pa/test.php on line 16

dodałem brakującego ) i dalej to samo
SmokAnalog
Ojej, co Ty za wersję PHP masz u siebie?

P.S. Kod działa na PHP >= 5.3, sprawdziłem.
Nico~
laugh.gif teraz sprawdziłem i używałem 4.9, już zmienione na najnowsze. Kurde, że ja nie pomyślałem od razu biggrin.gif

Nie wiem czy to zamierzone, ale wynik jest taki:
Kod
[{"team":"Elita ND","wins":"2","draws":"0","fails":"0","goals":"21 : 7","points":"6"},{"team":"FC Ojca Beyzyma","wins":"2","draws":"0","fails":"0","goals":"19 : 11","points":"6"},{"team":"LGW Stare Miasto","wins":"1","draws":"0","fails":"0","goals":"8 : 2","points":"3"},{"team":"DEMONY FUTBOLU","wins":"1","draws":"0","fails":"0","goals":"9 : 6","points":"3"},{"team":"Gromow\u0142adni","wins":"0","draws":"0","fails":"1","goals":"6 : 7","points":"0"},{"team":"FC Do\u0142ek","wins":"0","draws":"0","fails":"2","goals":"9 : 14","points":"0"},{"team":"Zespu\u0142 Or\u0142y","wins":"0","draws":"0","fails":"1","goals":"8 : 14","points":"0"},{"team":"Beer_Crew","wins":"0","draws":"0","fails":"1","goals":"2 : 8","points":"0"},{"team":"Vicimus","wins":"0","draws":"0","fails":"1","goals":"1 : 14","points":"0"},{"team":"INDATA Software Sparta Wroc\u0142aw","wins":"0","draws":"0","fails":"0","goals":"0 : 0","points":"0"},{"team":"WiAdRoWcY","wins":"0","draws":"0","fails":"0","goals":"0 : 0","points":"0"},{"team":"Spartan Le\u015bnica","wins":"0","draws":"0","fails":"0","goals":"0 : 0","points":"0"},{"team":"Alkopoligamia","wins":"0","draws":"0","fails":"0","goals":"0 : 0","points":"0"},{"team":"Gmina Mi\u0119kinia FC B\u0142onie","wins":"0","draws":"0","fails":"0","goals":"0 : 0","points":"0"},{"team":"OdraZoo","wins":"0","draws":"0","fails":"0","goals":"0 : 0","points":"0"},{"team":"FC Lawiranci","wins":"0","draws":"0","fails":"0","goals":"0 : 0","points":"0"},{"team":"PIKNIK GRILL","wins":"0","draws":"0","fails":"0","goals":"0 : 0","points":"0"},{"team":"T.B TeaM","wins":"0","draws":"0","fails":"0","goals":"0 : 0","points":"0"},{"team":"Wr\u00f3ble Janusza","wins":"0","draws":"0","fails":"0","goals":"0 : 0","points":"0"},{"team":"Publicon","wins":"0","draws":"0","fails":"0","goals":"0 : 0","points":"0"}]

SmokAnalog
Bardzo dobrze, to jest zamierzony efekt smile.gif Zapisz sobie ten kod PHP w osobnym pliku, np. scores.php.

Teraz w tym poprzednim pliku daj takie coś:
  1. $json = file_get_contents('scores.php');
  2. $scores = json_decode($json);


Teraz w $scores będziesz miał piękną tablicę z wynikami w postaci obiektów. Zobacz sobie co zawiera w ten sposób:
  1. var_dump($scores);


I zaraz będziemy działać dalej, teraz już z górki, będziemy generować Twój HTML, jaki tylko sobie wymarzysz biggrin.gif
Nico~
Zawartość scores.php
  1. <?php
  2.  
  3. require_once('phpQuery-onefile.php');
  4.  
  5. phpQuery::newDocumentFileHTML('http://playarena.pl/leagueSeason/ajaxTable?league_season_id=13947');
  6.  
  7. $cellsMap = array(
  8. 2 => 'team',
  9. 5 => 'wins',
  10. 'draws',
  11. 'fails',
  12. 'goals',
  13. 'points'
  14. );
  15.  
  16. $result = pq('tbody tr')->map(function($row) use ($cellsMap) {
  17. $result = array();
  18. $cells = pq($row)->find('td');
  19.  
  20. foreach ($cellsMap as $index => $name) {
  21. $result[$name] = trim($cells->eq($index)->text());
  22. }
  23.  
  24. return array($result);
  25. })->elements;
  26.  
  27. echo json_encode($result);
  28. ?>


Zawartość test.php
  1. <?php
  2. $json = file_get_contents('scores.php');
  3. $scores = json_decode($json);
  4. var_dump($scores);
  5. ?>


I wyświetla: NULL
Dobrze zrozumiałem i zrobiłem?
SmokAnalog
Usuń ostanie linijki ze znakiem zamykającym PHP w obu plikach i zobacz czy dalej masz błąd.
Nico~
Dalej NULL
SmokAnalog
Zapomniałem o pewnej właściwości file_get_contents. Ta funkcja niestety zwraca kod źródłowy PHP, a nie jego wynik, gdy plik jest na tym samym serwerze. Głupie to, ale musimy z tym żyć smile.gif Zamiast tego zróbmy tak:
  1. <?php
  2. require 'scores.php';
  3. $json = ob_get_clean();
  4. $scores = json_decode($json);
  5. var_dump($scores);
Nico~
Nie powinno być tak ;p?
  1. require('scores.php');


Ale tak z tym czy bez tego, dalej zwraca wartość NULL
SmokAnalog
Cytat(Nico~ @ 2.08.2014, 00:35:52 ) *
Nie powinno być tak ;p?

W zasadzie właśnie NIE. Ja przeważnie używam nawiasów przy include i require, ale zalecane jest używanie spacji, jak przy echo. Po to, żeby podkreślić, że to nie są funkcje, a konstrukcje języka.

Zrób var_dump na $json i powiedz co wypluwa. "Bo u mnie działa".
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.