2014-11-19 11 views
9

Ben aşağıdaki kodu kullanarak CURL kullanarak web sayfasını www.dealstan.com çözmeye çalışıyorum: bazı önemsiz charaterCurl kullanarak "Content-Encoding: gzip, gzip" nasıl çözülür?

"} gösteriyor,

$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; 

ama {w6 Yaklaşık 100 satır için 9 X n .......... ". html

altına yanıtı bulun (yanıta göre, sadece bir tahmin) iki kez kodlanmış gibi

ben hurl.it içinde yanıtı bulmak için çalıştı, ilginç bir noktayı bulduk, görünüşe: http://www.dealstan.com/ GET

200 OK 18.87 kB 490 ms Görünüm İsteği görüntüle Tepki BAŞLIKLAR

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

Cf-Ray: 18be7f54f8d80f1b-İçişler

Bağlantı: canlı tutma

İçerik-Kodlama: gzip, gzip ==============>? Bundan şüphelenen var mı?

İçerik Türü: text/html; charset = UTF-8

Tarih: Çar 2014 19 Kasım 18:33:39 GMT

Sunucu: cloudflare nginx

Set-Cookie: __cfduid = d1cff1e3134c5f32d2bddc10207bae0681416422019; geçerlilik süresi = Per, 19 Kasım-15 18: 33: 39 GMT; yol = /; alan = .dealstan.com; HttpOnly

Transfer-Encoding: chunked

Vary: Accept-Encoding

X-Sayfa-Hız: 1.8.31.2-3973

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

X-Enerjili Stoklar;: HHVM/3.2.0 ham VÜCUT görünüşüdür

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

kimse başlık "Content-Encoding: gzip, gzip" ile tepkisini deşifre bilen

,

Yani sitesi içinde ateş düzgün yükleniyor, krom vs. ancak CURL kullanarak kod çözemiyorum.

Lütfen bu sorunu çözmemde bana yardımcı olun.

+0

Google'da, benzer bir konu için mozillada bildirilen bir hata bulundu: https://bugzilla.mozilla.org/show_bug.cgi?id = 205156, ancak bu hata için herhangi bir yama bulamadık, çünkü site firefox'ta düzgün bir şekilde yükleniyor, bu sorunu – stackguy

+0

Odd. Çöplük tam olarak geri geliyor - bu da Safari'de böyle gösteriyor. Dolayısıyla, İçerik Türü'nün text/html olduğunu iddia etse de, temel olarak gzip sayfasını geri gönderiyor. (Benim gibi görünüyor mu? Bana kendi web sitesi sadece kırık gibi görünüyor. Ben beklediğiniz gibi, ben Safari'de gezinirseniz GZIP veri metinsel gösterimi gösterir ...) NB: Görünüşe göre transit olarak gzipping, ve * de * sayfanın gzipli bir versiyonunu göndermek, bu yüzden gerçek HTML'yi görmek için * iki kez * gunzip gerekiyordu. –

+0

Sadece birkaç başka tarayıcıyı kontrol ettiniz — Firefox ve Chrome bana web sayfasını başarıyla gösteriyor; Opera ve Safari ham gzip verilerini gösteriyor. Dolayısıyla, web sitesinin yanlış yapılandırıldığını ve sayfayı iki kez kopyaladığını söyleyebilirim, ancak bazı web tarayıcıları bu kırıklığı algılayarak sizin için iki kez kod çözüyor. Her zaman böyle kırıldığına emin değilim, er ya da geç web sitelerinin bazı önemli tarayıcılarda kırıldığını fark edecekler ve yapılandırmayı düzeltebilecekler ... –

cevap

6

Başlıkları kırparak ve gzinflate kullanarak çözebilirsiniz.

$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

Yup, bunun bir yol olduğunu söyleyebilirim. Bu yöntem, Curl'ın bir kez açılmasına neden olacak şekilde, içeriği iki kez açıyor ve daha sonra el ile tekrar sıkıştırıyorsunuz. Ancak, yanıtı kontrol etmek isteyebilirsiniz * önce * siz el ile unzip (hala ilk iki bayt cevap hala 1g 8b olacaksa), bu noktada kesinlikle web sitesi Safari, Opera, vb bazı şikayetler alacaksınız Kullanıcıları ve çift kodlanmış içeriğe yol açan yapılandırma sorununu düzeltin ... –

+0

Denedim ve gzinflate ile çalışmıyor. – stackguy

+0

Yanıtı test ettiğim gerçek snipped (Ben str_get_html yok) cevabı değiştirdim. Print_r ($ return) orada doğru mu? Ayrıca bkz. Http://stackoverflow.com/a/4841712/3922511, daha çok yönlü bir işlevdir. –