2014-11-19 11 views
9

Sto cercando di decodificare la pagina web www.dealstan.com usando CURL utilizzando il codice qui sotto:Come decodificare "Content-Encoding: gzip, gzip" usando curl?

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); // Define target site 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); // Return page in string 
curl_setopt($cr, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.3 Safari/533.2'); 
curl_setopt($ch, CURLOPT_ENCODING , "gzip");  
curl_setopt($ch, CURLOPT_TIMEOUT,5); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); // Follow redirects 

$return = curl_exec($ch); 
$info = curl_getinfo($ch); 
curl_close($ch); 

$html = str_get_html("$return"); 
echo $html; 

ma, sta mostrando alcuni spazzatura charater

"} {W6 9 X n .......... "per circa 100 linee.

ho cercato di trovare la risposta a hurl.it, ha trovato un punto interessante, sembra che l'html è codificato due volte (solo una supposizione, in base alla risposta)

Trova la risposta qui sotto: GET http://www.dealstan.com/

200 OK 18.87 kB 490 ms View richiesta Visualizza risposta HEADERS

cache-Control: max-age = 0, no-cache

Cf-Ray: 18be7f54f8d80f1b-IAD

Connection: keep-alive

Content-Encoding: gzip, gzip ==============>? sospettando questo, qualcuno lo sa?

Content-Type: text/html; charset = UTF-8

Data: Wed, 19 Nov 2014 18:33:39 GMT

Server: CloudFlare-nginx

Set-Cookie: __cfduid = d1cff1e3134c5f32d2bddc10207bae0681416422019; scade = Gio, 19-Nov-15 18:33:39 GMT; percorso = /; domain = .dealstan.com; HttpOnly

Transfer-Encoding: chunked

Vary: Accept-Encoding

X-Page-Velocità: 1.8.31.2-3973

X-Pingback: http://www.dealstan.com/xmlrpc.php

X-Powered -In HHVM/3.2.0 vista CORPO greggio

H4sIAAAAAAAAA5V8Q5AoWrBk27Ztu/u2bdu2bdu2bdu2bds2583f/pjFVOQqozZnUxkVJ7PwoyA A/qeAb3y83LbYHs/3Hv79wKm/2N5cZyJVtCWu1xyteyzLNqYuWbdtHeELCyIZRRp/1Fe7es3 + wL3Vfb

qualcuno sa come decodificare la risposta con l'intestazione "Content-Encoding: gzip, gzip",

Questo sito si sta caricando correttamente in Firefox, Chrome ecc ma, non sono in grado di decodificare usando CURL.

Please help me per decodificare questo problema?

+0

In google, trovato un errore segnalato in mozilla per il problema simile, https://bugzilla.mozilla.org/show_bug.cgi?id = 205156, ma non sono riuscito a trovare alcuna patch per quel bug, dal momento che il sito si sta caricando correttamente in firefox, avrebbero dovuto risolvere questo problema – stackguy

+0

Dispari. La spazzatura è esattamente ciò che sta tornando, lo dimostra anche in Safari. Quindi in pratica si sta rimandando indietro la pagina gzip, anche se afferma che il Content-Type è text/html. (È inteso per assomigliare? Mi sembra come se il loro sito web sia appena rotto. Mostra, come mi aspetterei, la rappresentazione testuale dei dati GZIP se navigo in Safari ...) NB: Sembra essere gzip in transito e * anche * inviare una versione gzip della pagina, quindi ho dovuto gunzip * due volte * per vedere l'HTML effettivo. –

+0

Basta controllare un paio di altri browser: Firefox e Chrome mi mostrano correttamente la pagina web; Opera e Safari mi mostrano dati gzip non elaborati. Quindi, direi che il sito Web non è configurato correttamente e sta tagliando la pagina due volte, ma che alcuni browser Web stanno rilevando questa violazione e la decodificano due volte per te. Non sono sicuro che potrei fare affidamento sul fatto che sia sempre rotto in questo modo, prima o poi capiranno che il loro sito Web è rotto in alcuni browser principali e correggono la configurazione ... –

risposta

6

È possibile decodificarlo ritagliando le intestazioni e utilizzando gzinflate.

$url = "http://www.dealstan.com" 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); // Define target site 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); // Return page in string 
curl_setopt($cr, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.3 Safari/533.2'); 
curl_setopt($ch, CURLOPT_ENCODING , "gzip");  
curl_setopt($ch, CURLOPT_TIMEOUT,5); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); // Follow redirects 

$return = curl_exec($ch); 
$info = curl_getinfo($ch); 
curl_close($ch); 

$return = gzinflate(substr($return, 10)); 
print_r($return); 
+2

Sì, direi che questa è la strada da percorrere. Questo metodo in realtà sta decomprimendo il contenuto due volte, poiché Curl lo decomprimerà una volta e quindi lo decomprimerai manualmente. Ma potresti voler controllare la risposta * prima * manualmente decomprimila (i primi due byte nella risposta saranno 1f 8b se è ancora gzip), poiché ad un certo punto questo sito Web riceverà sicuramente delle lamentele da Safari, Opera, ecc. ., utenti e risolvere il problema di configurazione che sta portando al contenuto doppiamente codificato ... –

+0

Ho provato e non funziona con gzinflate. – stackguy

+0

Ho modificato la risposta allo snippato effettivamente testato (non ho str_get_html). Il print_r ($ return) è corretto? vedere anche http://stackoverflow.com/a/4841712/3922511 che contiene è una funzione più versatile. –