Jackblues
16.11.2009, 12:29:26
Witam,
Chcialbym poprosic o porade ze sciaganiem stron za pomoca CURL.
Stronka ktora probuje otworzyc ma w sobie kawalek kodu
<script language=javascript>function updateprogress(nPercent){document.getElementById('imgprogress').width=nPercent*3;document.getElementById('txtprogress').innerHTML=nPercent+" %";if( nPercent < 100 )setTimeout( 'updateprogress('+(nPercent+1)+')', 75 );}</script>
<script language=javascript>updateprogress(1);</script>
<script language=javascript>document.getElementById('progress').style.visibility="hidden";document.getElementById('progress').style.height="0";document.getElementById('progress').style.position="absolute";</script><br/>
<table border=0 cellpadding=0 cellspacing=0 width=500 class=StoreTable><tr><td colspan="10" align=right>
</table>
Wyglada na to ze za pomoca javascript zaimplementowano petle opozniajaca czytanie tabeli <class=StoreTable>.
Wydaje mi sie ze na serwerze przygotowywana jest odpowiedz dopiero jak stronka zaczyna sie wczytywac.
Jak otwieram strone w pregladarce widac pasek postepu ktory po pewnym czasie znika i pojawia sie tabelka ktora chcialem pobrac.
Niestety curl nie wykonuje javascript - tak ze tabelka ktora pobieram jest pusta.
Probowalem wprowadzic petle opozniajaca podczas czytania naglowka oraz czytania body
curl_setopt($ch, CURLOPT_HEADERFUNCTION, ‘read_header’);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, ‘read_body’);
niestety caly czas w tabeli StoreTable nie ma informacji ktore potrzebuje - tak jakby serwer nie zdazyl jeszcze wypelnic tabeli.
Czy jest jakis sposob zeby zmusic curl do poczekania z pobieraniem strony juz po tym jak rozpocznie jej sciaganie ?
Piotrek
darko
16.11.2009, 12:31:06
Jackblues
16.11.2009, 13:08:50
Cytat(darko @ 16.11.2009, 12:31:06 )

To juz probowalem - w roznych miejscach
Stronka ktora chcialem sparsowac wyglada tak
http://www.gettextbooks.com/search/?isbn=2246656419a po czytaniu curl - wsadzalem sleep - ale wyglada ze sleep opoznia tylko wykonywanie skryptu php.
http://jbl.gofreeserve.com/justcopy.php?ISBN=2-246-65641-9Curl sciagnal juz cala stronke - i tablica jest pusta
wsadzalem tez sleep do callback CURLOPT_WRITEFUNCTION.
Piotrek
darko
16.11.2009, 13:14:47
Jackblues
16.11.2009, 14:00:13
Ale te przyklady pokazuja jak czekac az stronka sie sciagnie - a tu wyglada ze curl bez problemow sciaga cala strone ale bez zawartosci.
Nie dostaje zadnych bledow od curl - curl_error() nic nie zwraca.
Wydaje mi sie ze gdy strona jest analizowana przez browser - to wykonywanie skryptu zawiesza samo sciaganie strony z serwera.
W przypadku curl - nie moge zasymulowac takiego zachowania.
Stronka wyglada poprawnie w przegladarce a z curl kawalek jest nie wypelniony.
webcitron
16.11.2009, 20:54:40
Technicznie mogę się wypowiedzieć dlaczego tak się dzieje, co jest w zasadzie zupełnie zrozumiałe.
Podczas wywołania strony przez HTTP najpierw wykonuje się PHP, ładuje wynik do przeglądarki, <*> dopiero wtedy (w 99% przeypadków) zaczyna swe działanie JavaScript. Jesli JavaScript odpowiada za wypełnienie właściwie całej strony to przez cURLa chyba nie da się tego zrobić. cURL wchodzi do gry w chwili wyganerowania treści przez PHP a przed załadowaniem JavaScriptu (oznacznie wyżej przez <*>).
Technicznie nie jest możliwe po prostu żeby cURL dostał się do treści wygenerowanej przez JavaScript (przypomiam - JavaScript wykonuje się po stronie przeglądarki, a cURL emuluje tekstową przeglądarkę).
Jak dla mnie problem nierozwiązywalny.. Chyba że prześledzisz JS który generuje te dane (możęsz podejrzeć w podglądzie źródeł) i dostaniesz się bezpośrednio do plików generujących dane.
Jackblues
17.11.2009, 09:33:19
Pierwsze moje skojarzenie bylo dokladnie takie samo ale przegladnalem javascript i wyglada ze to tylko petla opozniajaca na timerze - do rysowania progresu
Oto caly skrypt ze stronki ktora chce parsowac.
<script language=javascript>
function updateprogress(nPercent)
{
document.getElementById('imgprogress').width=nPercent*3;
document.getElementById('txtprogress').innerHTML=nPercent+" %";
if( nPercent < 100 )setTimeout( 'updateprogress('+(nPercent+1)+')', 75 );
}</script>
<script language=javascript>
updateprogress(1);
</script>
<script language=javascript>document.getElementById('progress').style.visibility="hidden";document.getElementById('progress').style.height="0";document.getElementById('progress').style.position="absolute";</script>
Stronka sie sciaga przegladarka analizuje na biezaco kod i natrafia na wywolanie updateprogress.
Ten skrypt jest zaraz przed tabela ktora mnie interesuje.
Chyba w trakcie wysowania progresu server jeszcze przygotowuje jakies dane i jak przegladarka skonczy to dopiero dane sa gotowe.
Wydaje mi sie ze jak zmusze curl do wstrzymania transferu ze stronki to mi sie uda.
Ale wszystkie proby jak na razie jedynie wstrzymuja wykonanie php a curl w tle sciaga i tak stronke ze swoja predkoscia.
Tak ze nie wyglada zeby javascript generowal jakakolwiek zawartosc strony.
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.