PDA

View Full Version : passare delle pagine


Fenomeno85
10-07-2004, 09:26
ciao a tutti io dovrei riuscire a prelevare tutti i dati di questo indirizzo http://setiweb.ssl.berkeley.edu/team_display.php?teamid=30265 senza però dover passare ogni volta la pagina cliccando su next 20.

Qualcuno sa come fare questa cosa??

~§~ Sempre E Solo Lei ~§~

Mixmar
10-07-2004, 12:28
Non saprei... se il sito te li da' 20 alla volta, c'è poco da fare... però, osservando come è scritto l'indirizzo, noto che in fondo c'è un parametro "offset": forse, anzichè cliccare, puoi "visitare" con un programma per estrarre i dati (non dovrebbe essere difficile, il formato è standardizzato) tutte le pagine con i vari offset...

Il numero dei membri del team lo trovi in ogni pagina.

Forse sto dicendo cavolate... :D

cionci
10-07-2004, 13:03
Originariamente inviato da Mixmar
Forse sto dicendo cavolate... :D
Nono...hai ragione...

Fenomeno85
10-07-2004, 13:06
quindi?? x estrarli tutti come faccio?

~§~ Sempre E Solo Lei ~§~

Mixmar
10-07-2004, 13:47
Potresti effettuare un Parsing del file HTML per estrarre le informazioni interessanti: ci sono librerie in Java (credo) e in C# (credo). Forse anche in altri linguaggi... :confused:

Max 555
10-07-2004, 14:52
puoi fare cosi

http://setiweb.ssl.berkeley.edu/team_display.php?teamid=30265&sort_by=expavg_credit&offset=80

alla pagina viene passato un offset, quindi gli passi 20,40,60 e cosi- via

con un ob_start leggi l html,lo
parsifichi eliminando tutto fino a qui
"<th>Country</th></tr>"

poi ti leggi i vari tr e salvi..

qualcosa del genere

Fenomeno85
11-07-2004, 10:44
scusa che cos'è l'ob_start??

~§~ Sempre E Solo Lei ~§~

Fenomeno85
11-07-2004, 10:47
scusa sto guardando quella funzione :D

~§~ Sempre E Solo Lei ~§~

Fenomeno85
11-07-2004, 10:50
ok, allora ho capito che con quella funzione posso mettere in un buffer il contenuto della pagina html ... il problema è che come facico a puntare il codice della pagina html se ho solo l'indirizzo??

~§~ Sempre E Solo Lei ~§~

cionci
11-07-2004, 11:39
Con fopen... Puoi aprire direttamente il link...

Fenomeno85
11-07-2004, 14:44
si ma una volta aperto cosa faccio? come faccio a leggere solo la tabella??

~§~ Sempre E Solo Lei ~§~

cionci
11-07-2004, 14:48
Intanto ti leggi tutto... E poi scarti l'HTML fino a "</table><p><table"...
Salti i successivi due tr e sei al punto dove ci sono i dati...

Fenomeno85
11-07-2004, 15:04
ho provato freed ma non funziona :( scusa ma come devo impostare la grandezza ??

che devo usare per leggere

~§~ Sempre E Solo Lei ~§~

Fenomeno85
11-07-2004, 15:18
ok la lettura di un sito funziona ;) .. adesso devo solo capire come estrarre solo la parte interessata ;)

~§~ Sempre E Solo Lei ~§~

Fenomeno85
11-07-2004, 15:44
qual'è la funzione corrispondente del mid in php??

edit: la funzione è substr ;)

~§~ Sempre E Solo Lei ~§~

Fenomeno85
11-07-2004, 18:12
è tutto il pomeriggio che sto lavorondo e non vuole funzionare niente :cry:

:help:

~§~ Sempre E Solo Lei ~§~

cionci
11-07-2004, 18:29
Posta il codice...

Fenomeno85
11-07-2004, 19:00
il codice l'ho riscritto mille volte ogni volta diverso ... questo è l'ultimo :(

function preleva ($url){
$handle = fopen($url, "rb");
$contents = "";
do {
$data = fread($handle, 8192);
if (strlen($data) == 0) {
break;
}
$contents .= $data;
} while (true);
fclose($handle);
return $contents;
}

function posizioni_table ($val){
for ($i =0 ; $i < strlen($val); $i ++){
if ($val [$i] == "<") {
if ($val[$i+1] == "t" and $val[$i+2] == "a" and $val[$i+3] == "b" and $val[$i+4] == "l" and $val[$i+5] == "e"){
$array [] = $i;
}
}
}
return $array;
}

function posizioni_fine_table ($val){

for ($i=0;$i< strlen($val);$i ++){
if ($val[$i] == "/") {
if ($val[$i+1] == "t" and $val[$i+2] == "a" and $val[$i+3] == "b" and $val[$i+4] == "l" and $val[$i+5] == "e"){
$array [] = $i+6;
}
}
}
return $array;
}

function posizione ($val){
for ($i=0;$i< strlen($val);$i ++){
if ($val[$i] == "C") {
if ($val[$i+1] == "o" and $val[$i+2] == "u" and $val[$i+3] == "n" and $val[$i+4] == "t" and $val[$i+5] == "r" and $val[$i+6] == "y"){
$array [] = $i;
}
}
}
return $array;
}

function utenti ($valore, $stringa){
echo $valore;
$a = gettype ($stringa);
echo $a;
for ($i =0; $i < strlen ($stringa); $i ++){
if ($stringa[$i] == "<"){
$c =substr ($stringa, $i, $i +9);
echo $c;
echo "<br>";
if ( $c == "<td align="){
echo "trovato";
}
else
echo "<br> no" ;
}
}
}
?>

<?

$fine = "";

//for ($i = 0; $i < 80; $i = $i + 20) {
$url = "http://setiweb.ssl.berkeley.edu/team_display.php?teamid=30265&sort_by=expavg_credit&offset=10";
$val = preleva ($url);
$array_inizio = posizioni_table ($val);
$array_fine = posizioni_fine_table ($val);
$pos_country = posizione ($val);
$array_utenti = utenti ($pos_country [1], $val);

$fine = substr ($val, $array_inizio[2], $array_fine [2]);
echo $fine;


la funzione utenti è da finire, comunque con substr non da un cavolo :(

~§~ Sempre E Solo Lei ~§~

cionci
12-07-2004, 00:11
Ti sei un po' complicato la vita...

$url = "http://setiweb.ssl.berkeley.edu/team_display.php?teamid=30265&sort_by=expavg_credit&offset=10";
$val = preleva ($url);

$pos = strpos($val, "<a href=show_user.php?userid=");

while($pos !== false)
{
$pos = strpos($val, "<a href=show_user.php?userid=", $pos);
if($pos === false)
break;
$pos2 = strpos($val, ">", $pos);
if($pos2 === false)
break;
$userid = substr($val, $pos+1, $pos2-$pos-1);

$pos = pos2;
$pos2 = strpos($val, "</a>", $pos);
if($pos2 === false)
break;
$username = substr($val, $pos+1, $pos2-$pos-1);

$pos = strpos($val, "<td align=center>", $pos2);
if($pos === false)
break;
$pos2 = strpos($val, "</td>", $pos);
if($pos2 === false)
break;
$total = substr($val, $pos+1, $pos2-$pos-1);

$pos = strpos($val, "<td align=center>", $pos2);
if($pos === false)
break;
$pos2 = strpos($val, "</td>", $pos);
if($pos2 === false)
break;
$average = substr($val, $pos+1, $pos2-$pos-1);

$pos = strpos($val, "<td align=center>", $pos2);
if($pos === false)
break;
$pos2 = strpos($val, "</td>", $pos);
if($pos2 === false)
break;
$country = substr($val, $pos+1, $pos2-$pos-1);

//ora te li puoi salvare
}

Fenomeno85
12-07-2004, 07:17
grazie mille oggi pome provo tutto :)

~§~ Sempre E Solo Lei ~§~

Fenomeno85
12-07-2004, 12:14
allora non viene visualizzato nulla :( se cerco di visualizzare le varie variabili che contengono i dati.

guarda qui:http://utenti.lycos.it/Fenomeno85/seti%1f_list/prova.php

perchè con echo non viene visualizzato una mazza ??

~§~ Sempre E Solo Lei ~§~

Fenomeno85
12-07-2004, 14:28
allora il problema deriva dalla funzione strpos che non restituisce una mazza. Infatti ho fatto un controllo sulla variabile e ho scoperto che la variabile $pos è NULL :(

come si fa allora??

~§~ Sempre E Solo Lei ~§~

Fenomeno85
12-07-2004, 14:43
ho testato la funzione su una stringa e funziona tutto :wtf: allora l'unica cosa che può essere è per forza la variabile $val :(

~§~ Sempre E Solo Lei ~§~

cionci
12-07-2004, 15:01
$url = "http://setiweb.ssl.berkeley.edu/team_display.php?teamid=30265&sort_by=expavg_credit&offset=10";
$val = preleva ($url);


$pos2 = strpos($val, "<a href=show_user.php?userid=");
$pos2++;

for($i = 0; $i<20; ++$i)
{
$pos = strpos($val, "<a href=show_user.php?userid=", $pos2) + strlen("<a href=show_user.php?userid=");
if($pos === false)
break;
$pos2 = strpos($val, ">", $pos);
if($pos2 === false)
break;
$userid = substr($val, $pos, $pos2-$pos);

$pos = $pos2;
$pos2 = strpos($val, "</a>", $pos);
if($pos2 === false)
break;
$username = substr($val, $pos+1, $pos2-$pos-1);

$pos = strpos($val, "<td align=center>", $pos2) + strlen("<td align=center>");
if($pos === false)
break;
$pos2 = strpos($val, "</td>", $pos);
if($pos2 === false)
break;
$total = substr($val, $pos, $pos2-$pos);

$pos = strpos($val, "<td align=center>", $pos2) + strlen("<td align=center>");
if($pos === false)
break;
$pos2 = strpos($val, "</td>", $pos);
if($pos2 === false)
break;
$average = substr($val, $pos, $pos2-$pos);

$pos = strpos($val, "<td align=center>", $pos2) + strlen("<td align=center>");
if($pos === false)
break;
$pos2 = strpos($val, "</td>", $pos);
if($pos2 === false)
break;
$country = substr($val, $pos, $pos2-$pos);
echo "$userid $username $total $average $country <br>";

//ora te li puoi salvare
}?>

Questo funziona...bastava dargli un'aggiustatina...

Scusa, ma hai agiunto la tua funzione preleva ?

Fenomeno85
12-07-2004, 16:50
si :wtf: ... comunque stasera dopo le 9 quando torno a casa lo riprovo :)

~§~ Sempre E Solo Lei ~§~

Fenomeno85
13-07-2004, 07:09
scusa ma ho provato solo stamattina. Il problema sembra essere di lycos che non so per quale motivo non faccia visualizzare niente mentre se provo qui sul mio pc tutto funziona alla grande :)

~§~ Sempre E Solo Lei ~§~

cionci
13-07-2004, 09:27
Ci deve essere un'opzione abilitata nel file di configurazione del php per poter aprire url con fopen...

Fenomeno85
13-07-2004, 11:48
si ma posso accedere al file di configurazione di lycos?

~§~ Sempre E Solo Lei ~§~

cionci
13-07-2004, 12:23
No...appunto...
In tal caso l'unico modo di aprire un url è con i socket...

Fenomeno85
13-07-2004, 12:59
Originariamente inviato da cionci
No...appunto...
In tal caso l'unico modo di aprire un url è con i socket...

mi e come si fa??

altra cosa:

io ho il seguente tipo di array:

array ( 1 -> userid -> id
username-> nome
total -> totale ...
)



esiste qualche funzione per ordinare secondo il totale ?? o mi tocca scriverla?

ultima cosa, ho qualche problema con la quantità di dati elaborata, infatti troppe pagine elaborate mi da errore dei 30 secondi di elaborazione.

adesso provo a vedere se iscrivendomi ad altavista posso usare questo metodo oppure proverò con i socket.

ps: come si complica con i socket?

~§~ Sempre E Solo Lei ~§~

cionci
13-07-2004, 14:43
Riguardo all'array non ho ben capito...mi puoi fare un esempio di come è composto ?

Per i socket devi fare qualcosa di simile a quello scritto qui:
http://it.php.net/manual/en/function.fsockopen.php

Fenomeno85
13-07-2004, 14:58
ho un indice che punta a un array:

$array [] = $array2;

quindi esempio



array
(
[1] -> "id" -> valore
|_> "usename" -> valore
|_> "total" -> valore

[2] -> "id" -> valore
|_> "usename" -> valore
|_> "total" -> valore

)




1) non ci dovrebbero essere problemi con i socket?

2) per il fatto del tempo?




~§~ Sempre E Solo Lei ~§~

cionci
13-07-2004, 15:13
Per il fatto del tempo: http://it2.php.net/manual/en/function.set-time-limit.php

Per il fatto che non ci siano problemi con i socket... Boh...non so... Bisogna provare...

Fenomeno85
13-07-2004, 15:18
stasera siccome smetto alle 6 qui a lavorare, mi metto e lo faccio con i socket.
Per l'ordinamento devo scrivere io la procedura oppure c'è qualche funzione già ottimizzata?


~§~ Sempre E Solo Lei ~§~

cionci
13-07-2004, 15:24
C'è la sort... Ma se vuoi ordinare per una campo de secondo vettore nonc redo che tu lo possa fare...

Fenomeno85
13-07-2004, 15:27
quindi mi tocca scrivere una bella procedura :)


~§~ Sempre E Solo Lei ~§~

Fenomeno85
14-07-2004, 07:50
allora ho provato questa procedura:

<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.example.com\r\n";
$out .= "Connection: Close\r\n\r\n";

fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>

funziona, rimndando in output sul video mentre se io lo faccio così non funziona why??



<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.example.com\r\n";
$out .= "Connection: Close\r\n\r\n";

fwrite($fp, $out);
while (!feof($fp)) {
$contenuto . = fgets($fp, 128);
}
fclose($fp);
}
echo $contenuto;

?>


~§~ Sempre E Solo Lei ~§~

cionci
14-07-2004, 08:09
A me il secondo codice funziona perfettamente... L'unica cosa è . = che deve essere .=

Fenomeno85
14-07-2004, 08:11
allora mi sa che mi si sta rincoglionendo il pc :(

oggi riprovo :)

~§~ Sempre E Solo Lei ~§~

Fenomeno85
14-07-2004, 11:09
porca paletta :(

mi da questi errori:

Warning: fsockopen(): php_network_getaddresses: gethostbyname failed in C:\Programmi\Apache Group\Apache2\htdocs\sprova.php on line 15

Warning: fsockopen(): unable to connect to http://setiweb.ssl.berkeley.edu/team_display.php?teamid=30265&sort_by=expavg_credit&offset=20:80 in C:\Programmi\Apache Group\Apache2\htdocs\sprova.php on line 15
Operazione completata. (0)

Warning: strpos(): Offset not contained in string. in C:\Programmi\Apache Group\Apache2\htdocs\sprova.php on line 50


il problema sembra che non riesca a tradurre in ip l'indirizzo. Ho provato a mettere anche


$ip = gethostbyname($url);


ma non lo traduce :(

~§~ Sempre E Solo Lei ~§~

Fenomeno85
14-07-2004, 11:11
sto guardando che l'indirizzo è

indi...numero:80

e con quell'ottanta da problemi

~§~ Sempre E Solo Lei ~§~

cionci
14-07-2004, 11:16
No...devi separare il nome di host dalla pagina richiesta...

La pagina richiesta va al posto dello / accanto al comando get...
L'hostname va dopo Host:

Fenomeno85
14-07-2004, 11:23
fatto ma nisba:


$url = "team_display.php?teamid=30265&sort_by=expavg_credit&offset=$i";

$out = "GET /$url HTTP/1.1\r\n";
$out .= "Host: http://setiweb.ssl.berkeley.edu\r\n";
$out .= "Connection: Close\r\n\r\n";


gli errori:

Warning: fsockopen(): php_network_getaddresses: gethostbyname failed in C:\Programmi\Apache Group\Apache2\htdocs\sprova.php on line 14

Warning: fsockopen(): unable to connect to team_display.php?teamid=30265&sort_by=expavg_credit&offset=20:80 in C:\Programmi\Apache Group\Apache2\htdocs\sprova.php on line 14
()

Warning: fclose(): supplied argument is not a valid stream resource in C:\Programmi\Apache Group\Apache2\htdocs\sprova.php on line 28

Warning: strpos(): Offset not contained in string. in C:\Programmi\Apache Group\Apache2\htdocs\sprova.php on line 50


~§~ Sempre E Solo Lei ~§~

cionci
14-07-2004, 11:28
Leva http://

Fenomeno85
14-07-2004, 12:04
niente :(

la funzione non vuole andare:

function preleva ($url){
$fp = fsockopen($url, 80, $err, $err2, 100) ;
if (!$fp) {
echo "$errstr ($errno)<br />\n";
}
else {
$out = "GET /$url HTTP/1.1\r\n";
$out .= "Host: setiweb.ssl.berkeley.edu\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
$contenuto .= fgets($fp, 128);
}
}
fclose($fp);
return $contenuto;
}

$url = "http://setiweb.ssl.berkeley.edu/team_display.php?teamid=30265&sort_by=expavg_credit&offset=$i";
$val = preleva ($url);



~§~ Sempre E Solo Lei ~§~

Fenomeno85
14-07-2004, 12:07
ok risolto il tutto ;)

ragionando un attiamo avevo combinato una cavolata :D

~§~ Sempre E Solo Lei ~§~

Fenomeno85
14-07-2004, 12:13
maledizione!

Questo metodo non funziona :cry: sia su

lycos che su altervista :cry:

dove posso trovare uno spazio web che mi permetta di avere la possibilità di fare questa operazione

~§~ Sempre E Solo Lei ~§~

Fenomeno85
14-07-2004, 12:21
si sono tutte disattivate sia quelle dei socket che quella dell'url :muro:

e non si può in qualche modo attivare questi comandi??

~§~ Sempre E Solo Lei ~§~

cionci
14-07-2004, 12:29
Non so che dirti...prova con queste funzioni: http://it2.php.net/manual/en/function.socket-create.php

Sono ancora a più basso livello...ma dubito che siano attive...