Проблема кодирования CFHTTP - PullRequest
2 голосов
/ 04 июня 2010

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

Кодировка содержимого: gzip

Соединение: Keep-Alive

Длина содержимого: 19066

Сервер: IBM_HTTP_Server

Варьируется: Accept-Encoding, User-Agent

Content-Language: en-US

Cache-Control: no-cache = "set-cookie,

установленный Cookie2"

Content-Type:

* * Текст тысячу двадцать-один / HTML, кодировка = ISO-8859-1 * * 1 022

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

EðÑq · ​​oÀ? · М \ ZóL¯þ'Vú5ðbä £ ÿæ¾_HÉÒñQãO \ Çþãë85ÁÜ а ± ° UO} & bßý?, U? 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: Я до сих пор не понял этого, но нашел кое-что, что могло бы помочь кому-то помочь мне. Когда я использовал мой тестовый php-сервер для запуска file_get_contents на той же странице, и он работал нормально, тогда, если я запустил тот же код cfhttp для вызова страницы php, которая вызывала нужную мне страницу, она работала просто отлично. Спасибо за предложения.

Ответы [ 3 ]

10 голосов
/ 04 ноября 2010

Проблема с cars.com, кажется, заключается в том, что они распаковывают вывод дважды (на основе этой темы )

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

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

getasbinary="yes"

Тогда нам нужно распаковать его.

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

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

Обязательно дважды проверьте область видимости функции. Я мог что-то пропустить.

3 голосов
/ 04 июня 2010

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

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

<cfhttp ...>
    <cfhttpparam type="Header" name="Accept-Encoding" value="deflate;q=0">
    <cfhttpparam type="Header" name="TE" value="deflate;q=0">
</cfhttp>
0 голосов
/ 04 июня 2010

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

...