2013-07-22 74 views
0

現在,幫助我,我嘗試用ajax發佈數據到nodejs服務器。 和服務器接受postdata。現在我使用http.get要求www.baidu.com,並希望得到的HTML,最後返回HTML到front.but是錯誤如何在nodejs服務器中獲取結果?

前阿賈克斯

$("#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); 
       } 
      }); 
     } 
    }); 

和服務器。 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); 
     }) 
    }) 
} 

回答

0

解析POST數據可能是棘手的業務。我建議使用一個模塊來幫助你。 Formaline有你需要的所有花裏胡哨或poor-form是一個更輕的版本。

相關問題