0

今、私を助けてください、私はajaxでデータをnodejsサーバーに投稿しようとしています。サーバーはポストデータを受け入れます。そして今、http.getを使用してwww.baidu.comをリクエストし、htmlを取得したいのですが、最後にhtmlをfrontに返しますがエラーです

フロントアヤックス

    $("#subbtn").click(function(){
        var keywords = $("#kw").val();
        var target = $("#result");
        if (!keywords){
            target.html("<font color='#FF0000'>please key words</font>");
        }
        var keyArr = keywords.replace(/\,+/g, ",").split("\,");
        for (var i = 0; i < keyArr.length; i++){
            $.ajax({
                type: "POST",
                url: "http://127.0.0.1:10088",
                data : { kw : keyArr[i]},
                dataType: "json",
                cache: false,
                timeout: 5000,
                success: function(data) {
                    alert(data.rank);return false;
//                    $("#result").append(data.num);
                },
                error: function(jqXHR, textStatus, errorThrown) {
                    alert('error ' + textStatus + " " + errorThrown);
                }
            });
        }
    });

およびserver.js

    // Nodejs部分,主要作用是接收前端关键词,抓取百度知道页面。返回页面给前端
var http = require('http');
var cheerio = require('cheerio');
var iconv = require('iconv-lite');
http.createServer(function (req, res) {
    res.writeHead(200, { 'Content-Type': 'text/html', 'Access-Control-Allow-Origin' : '*' });
    var postData = "";
    var ret  = 0;
    req.setEncoding('utf-8');
    req.addListener('data', function(chunk){
        postData += chunk;
    });
    req.addListener('end', function(){
        var value = postData.replace(/kw=/, ''), result = 0;
        doRequest(value, 0);
    });
    res.end('{"rank":'+result+'}');
}).listen(10088);

/**
 * GET请求Baidu
 * @param kw 关键词
 * @param page
 */
var doRequest = function(kw, page){
    page = page * 10;
    var options = {
        host: 'zhidao.baidu.com',
        port: 80,
        path: '/search?word='+kw+'&pn='+page
    };
    http.get(options, function(res) {
        var buffers = [], size = 0;
        res.on('data', function(buffer) {
            buffers.push(buffer);
            size += buffer.length;
        });
        res.on('end', function() {
            var buffer = new Buffer(size), pos = 0;
            for(var i = 0, l = buffers.length; i < l; i++) {
                buffers[i].copy(buffer, pos);
                pos += buffers[i].length;
            }
            var gbk_buffer = iconv.decode(buffer,'GBK');
            $ = cheerio.load(gbk_buffer.toString());
            // 获取页面前三个的优质回答
            var target = "DARRY RING";
            var isBreak = false;
            var htmlTop = $("#cluster-items").find(".con-all").slice(0, 3);
            htmlTop.each(function(){
                var tContent = $(this).text().replace(/\s+/g, "");
                tContent = tContent.toLowerCase();
                if (tContent.indexOf("darryring") > 0 ){ // 当找到DY的时候,退出循环
                    isBreak = true;
                    return false;
                }
            });
            if (isBreak == true){
                return {keyword : kw, score : 1};
            }
            var html = $("#wgt-list").find("dd.answer");
            var n = 0;
            html.each(function(i, elem){
                var content = $(this).text().replace(/\s+/g, "");
                content = content.toLowerCase();
                if (content.indexOf("darryring") > 0 && n <= html.length ){ // 当找到DY的时候,退出循环
                    n = i + 1;
                    return false;
                }
            });
            if(n == 0){
                page++;
                if (page < 5){
                    doRequest(kw, page);
                }else{
                    return {keyword : kw, score : 9999};
                }
            }else{
                var num = page + n;
                return {keyword : kw, score : num};
            }
        });
        res.on('error', function(e){
            console.log("Got error: " + e.message);
        })
    })
}
4

1 に答える 1

0

POST データの解析は、厄介な作業になる可能性があります。モジュールを使用することをお勧めします。ホルマリンには、必要な機能がすべて備わっています。または、フォルマリンには軽量バージョンがあります。

于 2013-07-22T16:42:31.787 に答える