首页 > 代码库 > 基于nodejs模拟浏览器post请求爬取json数据

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

  今天想爬取某网站的后台传来的数据,中间遇到了很多阻碍,花了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;

  

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