Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Pobieranie treści strony
Forum PHP.pl > Forum > Przedszkole
emiter
Witam.

Czy da się wymusić w jakiś sposób by pobieranie treści strony zostało wykonane w 100% - uniemożliwić przerwanie tej operacji. Próbowałem pobrać treść spod pewnego url'a za pomocą file_get_contents($url) jak i z wykorzystaniem biblioteki curl. W obu przypadkach dopiero za którymś wywołaniem skryptu (odświeżeniem strony) ściągana była cała treść spod danego url'a, w pozostałych przypadkach tylko część. (W sumie to nawet nie wiem czy część. Po wyświetlenie tego co dostałem oczom ukazywało się morze krzaków (przypadkowych symboli)).

Czy da się coś z tym zrobić?
r4xz
  1.  
  2. ob_start("ob_gzhandler");
  3.  
  4.  


coś w tym stylu? (nierozumiem twojego problemu).

erix
Cytat
Czy da się wymusić w jakiś sposób by pobieranie treści strony zostało wykonane w 100% - uniemożliwić przerwanie tej operacji.

No jak? Przecież jak nawala łącze, to nie za wiele zrobisz; możesz tylko sprawdzić, czy masz całość - strrpos i </html>, a jeśli masz nagłówek content-length, to sprawdzenie długości zwracanego ciągu.
emiter
strrpos to jasna sprawa tylko:
  1. $ch = curl_init($INARRAY['URI']);
  2. curl_setopt($ch, CURLOPT_USERAGENT, $INARRAY['USER_AGENT']);
  3. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  4. $Zawartosc=curl_exec($ch);
  5. curl_close($ch);

i gdy zrobię
  1. echo $Zawartosc;

to dostaję coś takiego:
�������íýÝrDz&�^ŻőŐ�Ó[����ůý´ ° ŞVU�ŃÖ&IH�l�\ÜÔ�šŮ6mó {ú�ď°ď�Í÷Ň{�đüŤ�Ę �� ĺěą#vo­DUf�GzÄWî��ó��ÍóĺtôËĂ�ëŃňéţÉl2zôĺăÇgtňřńÁć`ôĂ�ÍéÉ(ú*mî.nno.Ž?�Î�ýňđđvďńă÷ďß�ő�~u{÷óăÍęń?C[<\]~ů <
...
i gdzie ja mam w tym szukać '</html>' ?

ale jak już mówiłem za którymś razem dane są poprawne i ww. instrukcja wyświetla mi ściągniętą stronę
w sumie to nawet nie wiem czy powodem tego jest niepełne ściągnięcie danych spod url'a? tak mi jedynie podpowiada intuicja
erix
A może byś tak dał odpowiednik nagłówek accept i wykluczył z niego zawartość skompresowaną?
emiter
Cytat(erix @ 5.09.2009, 12:57:13 ) *
A może byś tak dał odpowiednik nagłówek accept i wykluczył z niego zawartość skompresowaną?

To co mam wpisać w Accept-Encoding? nic? czy może 'identity'? czy może * i coś tam za nią?
Muszę przyznać że zielony z tego jestem.
erix
* - oznacza dowolny, czyli akceptowany jest również skompresowany.

Zobacz, jakie przykładowe accept jest wysyłane przez przeglądarkę i trochę pogłówkuj.
franki01
  1. curl_setopt($ch, CURLOPT_HTTPHEADER, Array('Accept: text/html,application/xhtml+xml,application/xml'));
emiter
Cytat(erix @ 6.09.2009, 19:13:31 ) *
Zobacz, jakie przykładowe accept jest wysyłane przez przeglądarkę i trochę pogłówkuj.

A jak to można sprawdzić?
Czy zamiast dawać w headersach Accept-Encoding: gzip;q=0, compress;q=0, itd... nie wystarczy w CURLOPT_ENCODING => 'false'?
A do tego jeszcze sprecyzować Content-Lenght? Web-Sniffer stwierdził że zawartość nieskompresowana tej strony to 180kB.
erix
Cytat
A jak to można sprawdzić?

Masz Firebuga, to sprawdzisz.
emiter
Oka.
Zabanglało przy:
  1. $header[0] = "'Accept: xml/xhtml, text/plain, text/html'";
  2. $header[] = "'Content-Length: 250000'"; //tak z lekkim zapasem tongue.gif
  3.  
  4. $ch = curl_init($url);
  5. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  6. curl_setopt($ch, CURLOPT_ENCODING, 'false'); //wszelka kompresja wyłączona
  7. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  8. $zawartoscSite=curl_exec($ch);
  9. curl_close($ch);

yahoo.gif
Dzięki za wskazówki

Cytat(emiter @ 7.09.2009, 18:15:35 ) *
Zabanglało przy:

Przedwczesna radość
Dobra, teraz konkretnie. Strona która ściągam to
http://bossa.pl/index.jsp?layout=3&pag...;zakladka=akcje

skrypt wygląda tak:
  1. $url = 'http://bossa.pl/index.jsp?layout=3&page=0&news_cat_id=268&cl=przebieg&zakladka=akcje';
  2.  
  3. $header[0] = "'Accept: xml/xhtml, text/plain, text/html'";
  4. $header[] = "'Content-Length: 250000'";
  5. $header[] = "'Connection: keep-alive'";
  6. $header[] = "'Keep-Alive: 300'";
  7. $header[] = "'Cache-Control: no-store'";
  8.  
  9. $ch = curl_init($url);
  10. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  11. curl_setopt($ch, CURLOPT_ENCODING, 'false');
  12. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  13. $zawartoscSite=curl_exec($ch);
  14. curl_close($ch);
  15.  
  16. echo $zawartoscSite = mb_convert_encoding($zawartoscSite, 'iso-8859-2', 'utf-8');

Jak widać na stronie umieszczone są notowania spółek giełdowych.
O ile kod który zaprezentowałem powyżej działa o tyle pojawiają się pewne błędy ze ściąganymi wartościami.
Otóż:
dla każdej spółki przedstawiony jest czas kiedy to ostatni raz zmieniła się jej cena (kolumna 6)
uruchamiam skrypt kilka razy pod rząd i wyświetlam wynik (wyświetla mi się strona)
z tym że jeżeli mamy spółkę której kurs zmienia się co kilka/naście/dziesiąt sekund (np. KGHM) to za każdym uruchomieniem skryptu wyświetla się inny czas w kol. 6, a dokładnie czasy (i wartości pozostałych kolumn w sumie też) z kilku ostatnich zmian kursu danej spółki. Dokładnie tak jakby gdzieś były przechowywane poprzednie wersje tej strony sprzed kilkunastu sekund.
Natomiast kiedy normalnie wejdę na daną stronę to po każdym odświeżeniu dane są prawidłowe
Myślałem że to strona jest gdzieś keszowana ale ustawienie Cache-Control na no-store, no-cache czy max-age=1 nic nie dało.
O co może chodzić? dry.gif
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.