菜鸟一枚,业余一直想做个火车票查票的H5,前端页面什么的已经写好了,node+mongoDB 也写了一个车站的接口,但
接下来的爬12306获取车次信息数据一直卡住,网上的爬12306的大部分是python,node的资料比较少,而且本身也不会node.js,
没有任何基础,只能看着文档写几个小demo...
nodejs爬取查票接口,获取json数据,由于12306的查票接口返回的数据是经过加密的,所以要再对result进行解析输出
写这个的时候,找了好多,还学了python,准备用pthon爬虫,python里有urllib爬虫很方便,想要用nodejs爬接口数据,
搜了好多,被网上的一些资料给误导了,一直用https和request请求,设置rejectUnauthorized: false忽略证书认证,还有
什么下载证书,读取证书,结果一直爬不到数据,在这里卡了好久,后来在踩了好多坑以及不断尝试的过程中偶然发现其实很简单(菜鸟o(╥﹏╥)o)
安装superagent
npm install superagent --save
js代码
var superagent = require('superagent')var express = require('express');var app = express();var router = express.Router();var stationobj = require('../models/query');router.post("/", function(req,res,next){ // 前端请求用post var params = req.body var fromsta = 'BJP'; var tosta = 'HZH'; var listrpage = params.listrpage?params.listrpage:1; for(let i in stationobj){ // 把车站名解析成三字码 fromsta = stationobj[params.FromStation] tosta = stationobj[params.ToStation] }//获取查询参数var config = { time:params.FromDate,//日期格式必须是这样 from_station:fromsta,//始发站车站代码,这里是北京北 end_station:tosta,//车次};// https://kyfw.12306.cn/otn/leftTicket/queryO?leftTicketDTO.train_date=2018-10-20&leftTicketDTO.from_station=HZH&leftTicketDTO.to_station=SHH&purpose_codes=ADULTconst url = 'https://kyfw.12306.cn/otn/leftTicket/queryO?leftTicketDTO.train_date='+config.time+'&leftTicketDTO.from_station='+config.from_station+'&leftTicketDTO.to_station='+config.end_station+'&purpose_codes=ADULT'let lists = []superagent.get(url) .end(function(response,result){ if (result.statusCode==200) { const r = result.body const flag = r.data.flag const map = r.data.map const ress = r.data.result let priceParams = {} ress.forEach((item,index)=>{ console.log(item.split('|')) let list = {} list.train_id = item.split('|')[2] list.train_no = item.split('|')[3] for(var key in stationobj){ if(stationobj[key]===item.split('|')[4]){ list.from_station_name = key } if(stationobj[key]===item.split('|')[7]){ list.to_station_name = key } } list.start_time = item.split('|')[8] list.arrive_time = item.split('|')[9] list.duration = item.split('|')[10].split(':')[0]+'时'+item.split('|')[10].split(':')[1]+'分' list.if_can_by = item.split('|')[11] list.leave_time = item.split('|')[13] list.seat_type = item.split('|')[15] list.seat_types = item.split('|')[35] list.from_station_no = item.split('|')[16] list.to_station_no = item.split('|')[17] // 普通K:21:软卧、 24:无座 25: 26:硬卧 27:硬座 // 普通T:19:高级软 20:其它 21:软卧 24:无座 26:硬卧 27:硬座 // 普通Z:19:高级软 21:软卧 24:无座 26:硬卧 27:硬座 // 普通Y:22:软座 24:无座 27:硬座 // 高铁G:23:特等 24:无座 28:二等 29:一等 30:商务 // 城际C:23:特等 24:无座 28:二等 29:一等 30:商务 // 动车D:21:软卧 24:无座 28:二等 29:一等 31:动卧 if(list.train_no.substr(0,1)=='K'|| list.train_no.substr(0,1)=='T'|| list.train_no.substr(0,1)=='Z'){ list.zc0 = '软卧' list.zc1 = '硬卧' list.zc2 = '硬座' list.zc3 = '无座' list.num0 = item[23]?'有票':'无票' list.num1 = item[28]?'有票':'无票' list.num2 = item[29]?'有票':'无票' list.num3 = item[26]?'有票':'无票' } if(list.train_no.substr(0,1)=='Y'){ list.zc0 = '软座' list.zc1 = '硬座' list.zc2 = '无座' list.zc3 = '' list.num0 = item[24]?'有票':'无票' list.num1 = item[29]?'有票':'无票' list.num2 = item[26]?'有票':'无票' list.num3 = '' } if(list.train_no.substr(0,1)=='D'){ list.zc0 = '一等座' list.zc1 = '二等座' list.zc2 = '无座' list.zc3 = '' list.num0 = item[31]?'有票':'无票' list.num1 = item[30]?'有票':'无票' list.num2 = item[26]?'有票':'无票' list.num3 = '' } if(list.train_no.substr(0,1)=='G'|| list.train_no.substr(0,1)=='C'){ list.zc0 = '商务座' list.zc1 = '一等座' list.zc2 = '二等座' list.zc3 = '无座' list.num0 = item[32] || item[25]?'有票':'无票' list.num1 = item[31]?'有票':'无票' list.num2 = item[30]?'有票':'无票' list.num3 = item[26]?'有票':'无票' } lists.push(list) }) res.json({ status:true, msg:'查询成功', data: lists }); } else { res.json({ status:false, msg:'查询失败', data:{} }); } }) });module.exports = router;
获取到原始数据,对原始数据还要进行解析,需要获取车站对应信息的json数据,然后对应读取,res.json接口输出
更多代码详情戳 更新中,这里为了方便,nodejs服务端代码和前端代码写在同一个项目里,
要启动项目的话先npm install 安装依赖,进入到前端项目命令行运行npm start打开localhost:8088端口查看,如果想查看接口运行
server目录下的文件 node server/bin/www 打开localhost:3000端口查看,localhost:3000/query是查票接口,先这样,前进一小步,后面持续完善...