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