2

cfhttpを使用して、ページから情報を解析するためのページを取得しようとしています。私が呼んでいるページヘッダーは次のとおりです。

コンテンツエンコーディング:gzip

接続:Keep-Alive

コンテンツ-長さ:19066

サーバー:IBM_HTTP_Server

変更:Accept-Encoding、User-Agent

コンテンツ-言語:en-US

キャッシュ制御:no-cache = "set-cookie、

set-cookie2 "

コンテンツタイプ:

text / html; charset = ISO-8859-1

文字セットをISO-8859-1に設定しましたが、FileContentで次のようになります(以下に示すのは小さなサンプルのみですが、わかりやすいと思います)。

EðÑq・Oã?・Ì\ZóL¯þ´Vú5ðbä£ÿæ¾_HÉÒñQãO\Çþãë85ÁÜà±°ùÖ}&bßý?、u?2SùQyk5g?UÛ3Ѹfã×ARÃi_iûRã "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÷mbq¥ÝÃ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をそのままにしてみました。

更新: 私はまだそれを理解していませんが、誰かが私を助けるのを助けるかもしれない何かを見つけました。私のテストphpサーバーを使用して同じページでfile_get_contentsを実行し、それが正常に機能した場合、同じcfhttpコードを実行して、ページを呼び出していたphpページを呼び出すと、問題なく機能しました。これまでの提案に感謝します。

4

3 に答える 3

10

cars.comの問題は、出力を2回gzipしていることのようです(このスレッドに基づく)

したがって、コンテンツを解凍する必要があります...もう一度...

まず、コンテンツをバイナリとして取得する必要があるため、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>

関数のvarスコープを再確認してください。私は何かを逃したかもしれません。

于 2010-11-04T15:47:54.127 に答える
3

ヘッダーごとに表示されているのは、ファイルの gzip された内容です。使用する前に、圧縮を解除する必要があります。cfzipでこれを行うことができると思いますが、それを行った経験はありません.

この投稿は、リクエストにヘッダーを追加して、返される前に解凍/収縮させることができることを示しているようです:

<cfhttp ...>
    <cfhttpparam type="Header" name="Accept-Encoding" value="deflate;q=0">
    <cfhttpparam type="Header" name="TE" value="deflate;q=0">
</cfhttp>
于 2010-06-04T13:30:40.873 に答える
0

私が最初に行うことは、他のページに対して同じコードを試して、問題がソース コンテンツ/サーバーではないことを確認することです。それらが正常に機能する場合、消費しようとしているのはサーバー/コンテンツである可能性があります。同じ問題がある場合、問題はコードにあります。コードを投稿していただけると助かります。

于 2010-06-04T12:59:00.283 に答える