• vue+node+mongoDB火车票H5(七)-- nodejs 爬12306查票接口


    菜鸟一枚,业余一直想做个火车票查票的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=ADULT
    const 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接口输出

    更多代码详情戳 https://github.com/leitingting08/train 更新中,这里为了方便,nodejs服务端代码和前端代码写在同一个项目里,

    要启动项目的话先npm install 安装依赖,进入到前端项目命令行运行npm start打开localhost:8088端口查看,如果想查看接口运行

    server目录下的文件 node server/bin/www 打开localhost:3000端口查看,localhost:3000/query是查票接口,先这样,前进一小步,后面持续完善...

  • 相关阅读:
    51Nod1740 蜂巢迷宫
    51Nod1279 扔盘子
    51Nod1095 Anigram单词
    51Nod1094 和为k的连续区间
    51Nod1072 威佐夫游戏
    PHP 图片处理
    ubuntu 安装 ftp
    linux下ab网站压力测试命令
    iptables FOr linux
    discuz 个性化时间函数
  • 原文地址:https://www.cnblogs.com/leiting/p/9594292.html
Copyright © 2020-2023  润新知