2010-06-04 5 views
2

Я пытаюсь вытащить страницу для разбора информации из нее с помощью cfhttp. Заголовки страниц, которые я звоню являются:Проблема кодирования CFHTTP

Content-Encoding: GZIP

Connection: Keep-Alive

Content-Length: 19066

Сервер: IBM_HTTP_Server

Варах : Accept-Encoding, User-Agent

Content-Language: en-US

Cache-Control: нет кэша = "Set-Cookie,

установка Cookie2"

Content-Type:

текст/html; Charset = ISO-8859-1

Я установил кодировку в ISO-8859-1, но я получаю следующее в FileContent (только небольшой образец показан ниже, но я думаю, что он имеет возможность указать).

EðÑq · ​​OA? · М \ ZóL¯þ'Vú5ðbä £ ÿæ¾_HÉÒñQãO \ Çþãë85ÁÜ а ± ° UO} & bßý?, И? 2SùQyk5g? UÛ3Ѹfã × ARÃi_iûRã _ òCA¿-Я. "b /¯ßíWÝÆ´}w~,°iøÜCáÇþ@ÃZ5¤ïsÁ8½°ì* ZÜéjOÝK/Ë4§ÈG5×ä*¬6ÚwÇ0]ã:àÑþé¬G"ÅÁl/t° jlá»5¶&¯lìYìºØ'yDð½|#ý<ñìTé%¾ï¬ùƪx¶}«±o9»ë¼ÂÆÒï'w8Y? ÷ ðxsllû 6íqüGÞsÜóÀx · ªk®XºàåZ {íÁ½åo ÷ МБк ¥ ÝÃ8M

Я попробовал другие кодировки и рассматриваю кодирование GZIP, чтобы вызвать проблему, но я не уверен, как испытание, если это вопрос. Любые предложения или помощь будут оценены в значительной степени.

Ниже мой код

<cfhttp 
    METHOD="get" 
    throwonerror="yes" 
    CHARSET="ISO-8859-1" 
    URL="http://www.cars.com/for-sale/searchresults.action?sf1Dir=DESC&prMn=1&crSrtFlds=stkTypId-feedSegId-pseudoPrice&rd=100000&zc=44203&PMmt=0-0-0&stkTypId=28881&sf2Dir=ASC&sf1Nm=price&sf2Nm=miles&feedSegId=28705&searchSource=UTILITY&pgId=2102&rpp=10"> 

    <cfhttpparam type="Header" name="Accept-Encoding" value="deflate;q=0"> 
    <cfhttpparam type= "Header" name= "TE" value= "deflate;q=0" > 
</cfhttp> 

<cfset listings = #cfhttp.FileContent#> 
<cfoutput> 
    #listings# 
</cfoutput> 

Я также попытался заголовки:

<cfhttpparam type="Header" name="Accept-Encoding" value="*"> 
    <cfhttpparam type= "Header" name= "TE" value= "deflate;q=0" > 

И попытался удалить 'Accept-Encoding' заголовок и просто оставить TE.

UPDATE: Я до сих пор havn't понял это, но я нашел то, что может помочь кому-то помочь мне. Когда я использовал тестовый php-сервер для запуска file_get_contents на той же странице, и он работал нормально, тогда, если бы я запустил один и тот же код cfhttp для вызова страницы php, которая вызывала страницу, мне нужно, чтобы она работала нормально. Спасибо за предложения до сих пор.

ответ

10

Проблема с cars.com, кажется, что они gzipping выход в два раза (на основе this thread)

таким образом, нам нужно распаковать содержимое ... снова ...

Во-первых, нам нужно получить содержимое в двоичном виде, поэтому вызов CFHTTP должен включать

getasbinary="yes" 

Затем нам нужно разархивировать его.

Мы можем использовать java.util.zip для этого. Gunzip представляет собой модифицированную версию this cflib.org function:

<cfhttp 
    getasbinary="yes" 
    METHOD="get" 
    throwonerror="yes" 
    CHARSET="ISO-8859-1" 
    URL="http://www.cars.com/for-sale/searchresults.action?sf1Dir=DESC&prMn=1&crSrtFlds=stkTypId-feedSegId-pseudoPrice&rd=100000&zc=44203&PMmt=0-0-0&stkTypId=28881&sf2Dir=ASC&sf1Nm=price&sf2Nm=miles&feedSegId=28705&searchSource=UTILITY&pgId=2102&rpp=10" > 

    <cfhttpparam type="Header" name="Accept" value="application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"> 
    <cfhttpparam type="Header" name="User-Agent" value="Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41"> 
    <cfhttpparam type="Header" name="Accept-Encoding" value="deflate"> 
    <cfhttpparam type="Header" name="TE" value="deflate, chunked, identity, trailers"> 

</cfhttp> 

<cfset unzippedHTML = gunzip(cfhttp.FileContent)> 

<cfoutput> 
    #unzippedHTML# 
</cfoutput> 

<cfscript> 

    function gunzip(inBytes) { 
     var gzInStream = createObject('java','java.util.zip.GZIPInputStream'); 
     var outStream = createObject('java','java.io.ByteArrayOutputStream'); 
     var inStream = createObject('java','java.io.ByteArrayInputStream'); 
     var buffer = repeatString(" ",1024).getBytes(); 
     var length = 0; 
     var rv = ""; 

     try { 
      inStream.init(inBytes); 
      gzInStream.init(inStream); 
      outStream.init(); 
      do { 
       length = gzInStream.read(buffer,0,1024); 
       if (length neq -1) outStream.write(buffer,0,length); 
      } while (length neq -1); 
      rv = outStream.toString(); 
      outStream.close(); 
      gzInStream.close(); 
      inStream.close(); 
     } 
     catch (any e) { 
      rv = ""; 
      try { 
       outStream.close(); 
      } catch (any e) { } 
       try { 
        gzInStream.close(); 
       } catch (any e) { 
        try { 
         inStream.close(); 
        } catch (any e) {} 
       } 
     } 
     return rv; 
    } 
</cfscript> 

Обязательно перепроверьте УАК область видимости функции. Возможно, я что-то пропустил.

+0

Твои люди! Вот так! – Patcouch22

+0

Рад это слышать! Это было весело, чтобы понять. –

0

Первое, что я хотел бы сделать, это убедиться, что это не исходный контент/сервер, это проблема, попробовав один и тот же код с другими страницами. Если они работают нормально, то, скорее всего, сервер/контент, который вы пытаетесь использовать. Если у них такая же проблема, проблема в коде. Было бы также полезно, если бы вы разместили свой код.

+0

Спасибо, это похоже на проблему с содержимым, которое я пытаюсь использовать, но не на сервере, поскольку я могу использовать cfhttp для любых файлов css или js, но это, скорее всего, html-страницы. – Patcouch22

3

В заголовке то, что вы видите, является содержимым файла gzipped. Он должен быть несжатым, прежде чем он вам будет полезен. Я предполагаю, что вы можете сделать это с помощью cfzip, но у меня не было опыта в этом.

This post, кажется, указывает, что вы можете добавить заголовок в запросе, чтобы он расстегнул/спущенный перед возвращением:

<cfhttp ...> 
    <cfhttpparam type="Header" name="Accept-Encoding" value="deflate;q=0"> 
    <cfhttpparam type="Header" name="TE" value="deflate;q=0"> 
</cfhttp> 
+0

Это, похоже, не проблема, это была моя первая мысль, но если бы у меня была эта проблема, я бы получил проблему с неудачей подключения. Похоже, что это скорее проблема с кодировкой, но в то же время никакая кодировка не работает. – Patcouch22