基于nodejs模拟浏览器post请求爬取json数据

来源:互联网 发布:财经新闻数据库 编辑:程序博客网 时间:2024/04/27 15:29

  今天想爬取某网站的后台传来的数据,中间遇到了很多阻碍,花了2个小时才请求到数据,所以我在此总结了一些经验。

  首先,放上我所爬取的请求地址http://api.chuchujie.com/api/?v=1.0;

 下面我们开始爬取数据。

一.写一个基于nodejs的爬虫

   1.引入所需模块

    这里需要引入http模块(nodejs用来向浏览器发送http请求的模块)和querystring模块(把前台传过来的对象形式的参数转化成字符串形式);

  

var http = require("http"); //http 请求//var https = require("https"); //https 请求var querystring = require("querystring");

  2.配置http.router(options,fn)参数options

  在配置中,重点在于模拟浏览器请求头,一般必须模拟Cookie,User-Agent(访问设备系统),Content-Type,有的需要模拟更多。在这里,我们的这个目标并没有Cookie,所以不用传。

  

  3.给目标后台发起http post请求得到数据

 var req = http.request(options, function (res) {        var json = ""; //定义json变量来接收服务器传来的数据        console.log(res.statusCode);        //res.on方法监听数据返回这一过程,"data"参数表示数数据接收的过程中,数据是一点点返回回来的,这里的chunk代表着一条条数据        res.on("data", function (chunk) {            json += chunk; //json由一条条数据拼接而成        })        //"end"是监听数据返回结束,callback(json)利用回调传参的方式传给后台结果再返回给前台        res.on("end", function () {            callback(json);        })    })    req.on("error", function () {        console.log('error')    })//这是前台参数的一个样式,这里的参数param由后台的路由模块传过来,而后台的路由模块参数是前台传来的//    var obj = {//        query: '{"function":"newest","module":"zdm"}',//        client: '{"gender":"0"}',//        page: 1//}    req.write(querystring.stringify(param)); //post 请求传参    req.end(); //必须要要写,

  4.模块化导出

  完整的spider代码

/** * Created by Administrator on 2017/2/12. */var http = require("http"); //http 请求//var https = require("https"); //https 请求var querystring = require("querystring");function request(path,param,callback) {    var options = {        hostname: 'api.chuchujie.com',        port: 80, //端口号 https默认端口 443, http默认的端口号是80        path: path,        method: 'POST',        headers: {            "Connection": "keep-alive",            "Content-Length": 111,            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"        }//伪造请求头    };    var req = http.request(options, function (res) {        var json = ""; //定义json变量来接收服务器传来的数据        console.log(res.statusCode);        //res.on方法监听数据返回这一过程,"data"参数表示数数据接收的过程中,数据是一点点返回回来的,这里的chunk代表着一条条数据        res.on("data", function (chunk) {            json += chunk; //json由一条条数据拼接而成        })        //"end"是监听数据返回结束,callback(json)利用回调传参的方式传给后台结果再返回给前台        res.on("end", function () {            callback(json);        })    })    req.on("error", function () {        console.log('error')    })//这是前台参数的一个样式,这里的参数param由后台的路由模块传过来,而后台的路由模块参数是前台传来的//    var obj = {//        query: '{"function":"newest","module":"zdm"}',//        client: '{"gender":"0"}',//        page: 1//}    req.write(querystring.stringify(param)); //post 请求传参    req.end(); //必须要要写,}module.exports = request;

  

0 0