zoukankan      html  css  js  c++  java
  • 基于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;
    

      

  • 相关阅读:
    斐波那契数列实现方式,以及递归和非递归时间对比
    月份与季节
    时针与分针夹角
    二叉树非递归遍历 以及二叉树节点删除思路
    向左向右 —折半查找(二分法)
    c语言之字符串及字符集简介
    c语言之排序
    C语言代码页 预处理 和宏 结构体 共用体 枚举 指针简绍
    C语言之函数调用约定,递归,数组简介
    C语言之条件判断
  • 原文地址:https://www.cnblogs.com/BlueCc/p/6533064.html
Copyright © 2011-2022 走看看