sobota, 26 stycznia 2013

Pobieranie treści ze strony. Przykład filmweb.

Wstęp... Czyli coś co możesz pominąć >>


Pobieranie treści strony to musi być wcale mozolne jeśli użyjemy do tego głowy. Widziałem wiele przykładów, które wykorzystują wyrażenia regularne, sam kiedyś ich używałem, tak więc sprawdziłem to empirycznie. Jest to bardzo skomplikowany sposób, łatwo się w nim pogubić, ponieważ wszystkie elementy DOM strony traktujemy jako ciąg znaków. Zaprezentuje wam alternatywną metodę, która wykorzystuje jQuery i porusza się po elementach DOM strony (jest wiele wiele szybsza). Nie pokaże wam jak robi się to przy pomocy wyrażeń regularnych ponieważ szkoda mi czasu, poza tym przestałem ich używać.

Krok pierwszy

Pierwszą rzeczą jaką musimy zrobić to załadować stronę z której chcemy wyciągnąć informacje do iframe. Tutaj ważna uwaga, aby dostać się do treści iframe adres musi być na tej samej domenie. Jak to zrobić skoro nasza domena to naszadomena.pl, a treść strony, którą chcemy pobrać znajduje się pod adresem filmweb.pl? Istnieje prosta metoda (Cross-Domain), musimy zrobić plik pobierz.php na naszym serwerze, który pobierze treść filmweb.


<?php

$after = $_GET['after'];

// Pobiera filmweb z parametrami after. 
$file = file_get_contents('http://www.filmweb.pl/'.$after, false);

echo $file;
?>

korzystanie z tego pliku będzie następujące.
Adres http://www.filmweb.pl/film/Niemo%C5%BCliwe-2012-586390 
odpowiada adresowi http://twojadomena.pl/?after=film/Niemo%C5%BCliwe-2012-586390

Przygotowanie Html

Gdy przygotujemy nasz plik zabieramy się za stworzenie pliku ładującego naszego iframa oraz przeglądającego jego zawartość. W tym miejscu musimy dodać do naszego pliku w sekcji head bibliotekę jQuery.

<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>

Następnie w sekcji body dodajemy iframe ze stroną, która chcemy pobrać.


<iframe src="http://naszadomena.pl/pobierz.php?after=film/Niemo%C5%BCliwe-2012-586390" style="display:none;"></iframe>

Przygotowanie JavaScirpt

Oraz kod Java Scirpt, który czeka na załadowanie iframe, a następnie przeszukuje go pod kątem potrzebnych nam informacji. W tym przykładzie wykorzystałem selektory jQuery oraz funkcję contents(), która pozwala mi dobrać się do wnętrza iframe. 

<script>
window.onload = function() {
$iframe = $('iframe').contents();

alert( $iframe.find('div.posterLightbox > a > img').attr('src') ); //adres miniatury
alert( $iframe.find('div.filmTitle h1 > a').text() ); // tytuł
alert( $iframe.find('span#filmYear').text() ); // rok wydania
alert( $iframe.find('div.pageBox > p.text.longText').text() + $iframe.find('div.pageBox > span.fullText hide').text() ); // pełen opis filmu
alert( parseFloat($iframe.find('span.filmRate > strong').text()) ); // ocena filmu

}
</script>



PS. nie wiem w jakiej czasoprzestrzeni będziesz czytał ten post... Dlatego uprzedzam się, że selektory mogą się zmienić dla wszystkich tych danych. Selektory napisałem w dniu (2013 - 01 - 26). Ich aktualizacja jest znacznie prostsza i szybsza niż w przypadku wyrażeń regularnych. Wierze, że z odrobiną determinacji sobie poradzisz. Pytania zostaw w komentarzu.

7 komentarzy:

  1. a mozna zrobic to samo ale bez ramek?

    OdpowiedzUsuń
  2. Wymagane jest jedynie zrobienie Cross Domain. Dopóki tego nie będzie, Java Script nie ma dostępu do treści strony.


    $.ajax({
    url: "http://naszadomena.pl/pobierz.php?after=film/Niemo%C5%BCliwe-2012-586390",
    context: document.body
    }).done(function() {
    var a = $(this);
    alert(a.find("div").text());
    });

    OdpowiedzUsuń
  3. Witam, Panie Eliaszu :) a mialby Pan chwilę i chęci żeby przygotowac takie testowe pliki do ściagnięcia? Takie już poskładane? Bo początkującemu jest ciężko to ogarnąć. pozdrawíam

    OdpowiedzUsuń
  4. Jasne, wyślij adres strony i wskaż info które chcesz pobrać. Potrzebny będzie Ci serwer by to uruchomić, niestety lokalnie nie otwierają się pliki php.

    OdpowiedzUsuń
    Odpowiedzi
    1. Potrzebuje z filmwebu pobrac opis,okladke,ocene ale wlasnie zrobic to bez ramek, podstawy php znam. Tylko z js mam problemy :) jest dla mnie mniej czytelny. konto mam na livehoscie do testow bedzie ok, ps. pisze z telefonu,sorry za polszczyzne

      Usuń
    2. Pod tym linkiem masz jest przykład bez ramek. Mam nadzieje, że udało mi się pomóc.

      http://freshfrog.pl/examples/1/

      Usuń
    3. Dziękuje za pomoc. Na pewno będę tu zaglądał. Pozdrawiam

      Usuń