0

现在,帮帮我,我尝试使用 ajax 将数据发布到 nodejs 服务器。和服务器接受后数据。现在我使用http.get请求www.baidu.com,并想要获取html,最后将html返回到front.但是错误

前端ajax

    $("#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 回答