菜鸟一枚,业余一直想做个火车票查票的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是查票接口,先这样,前进一小步,后面持续完善...

vue+node+mongoDB火车票H5(七)-- nodejs 爬12306查票接口的更多相关文章

  1. vue+node+mongoDB 火车票H5(六)---城市列表保存到MongoDB数据库并且启用node.js服务

    把车站列表保存到数据库,并且从本地创建服务 node.js创建httpserver 1.搭建基于express的运行环境 全局安装express-gengerator cnpm install -g ...

  2. vue+node+mongoDB 火车票H5(一)---准备工作,基本配置

    前端菜鸟一枚,由于公司项目用到了vue,我虽然参与了,但是很多环境配置和流程还不是特别清楚,就想自己个人业余做个webapp看看, 对于完全新手而言,很多坑会纠结很久,所以想借此机会自己做的同时记录各 ...

  3. vue+node+mongoDB 火车票H5(五)---城市选择

    选择城市,支持搜索,储存选择过城市的历史记录,点击索引能跳到相应位置 1. 父子组件传值,trainCity城市选择组件,选择城市后改变父组件的值 2. 把城市数组按照字母A到Z排序 3.点击字母索引 ...

  4. vue+node+mongoDB 火车票H5(四)---完成静态页面

    各项配置都好了,就可以开始写静态页面了,先别急着写,看一下页面又哪些公用的部分可以提取出来的,统一放到components组件文件夹中 header头部文件夹放一些头部常用组件,如首页的banner切 ...

  5. vue+node+mongoDB 火车票H5(三)---git提交时忽略不想提交的文件

    想要把项目通过git提交到GitHub上,但提交时并不想提交node_modules文件夹,这个文件夹太大 git 提交代码时不提交配置文件夹node_modules 在.gitignore文件中添加 ...

  6. vue+node+mongoDB 火车票H5(二)---vux和less的配置

    vue基本环境配置好之后,就可以开始开发页面了 开发页面之前先了解一下项目结构,原始的目录结构为: config是配置文件,环境配置好了开发阶段可以不再去修改了,node_modules文件夹是打包的 ...

  7. vue+node+mongodb实现的功能

    用vue+node +mongodb实现前后台交互的页面代码,已经上传到github上, 地址是: https://github.com/GainLoss/vue-node-mongodb https ...

  8. 后台管理系统:vue&node&MongoDB(一)

    后台管理系统 使用工具: Vue    Node     Mongodb   Element-ui 一.后台(Node+Mongodb) 前期准备: 需要下载的包: mongooes -------- ...

  9. 学习笔记:Vue+Node+Mongodb构建简单商城系统(一)

    所需前置知识: HTML.CSS.JS.Vue.ES6.Npm.Webpack.Node.Express.Mongodb 项目整体架构: IDE:webstorm: 项目建立过程(cmd常用命令行指令 ...

随机推荐

  1. 修改host简化远程访问

    问题描述: 使用本机登陆服务器时,需要经常输入IP地址,在局域网下和非局域网下输入的IP又不一样,十分麻烦,如果可以给IP命名一个简单的名字,岂不是很方便? 解决方法: 修改host文件: vim / ...

  2. java调试打断点和不打断点执行结果不一致问题解决

    java程序在调试的时候需要debug来跟踪一下结果,有一种情况是这样的,正常执行java程序就会出现问题,而断点debug跟踪此方法的时候却是正常的,不断测试结果都是这样,由此判断有可能是因为此方法 ...

  3. django abstract base class ---- 抽象基类

    抽象蕨类用于定义一些同享的列.类本身并不会在数据库端有表与之对应 一.例子: 1.定义一个叫Person 的抽象基类.Student 继承自Person from django.db import m ...

  4. unity, 设置帧率上限

    用unity做了个demo,把所有开销大的特效都去了,在真机上运行仍然卡.显示帧率来看,最高到30.原来unity在ios设备上帧率默认限制为不超过30. 可以通过Application.target ...

  5. [Jobdu] 题目1408:吃豆机器人

    题目描述: 淘宝公司内部有许多新鲜的小玩具,例如淘宝智能机器人.小时候,大家都玩过那个吃豆子的游戏吧,这机器人就是按照这个游戏设计的,它会朝着豆子的方向行走.不过机器人还存在一个bug,他只会朝南和朝 ...

  6. DB2检测表字段改动的方法(不用触发器)

    ALTER TABLE TEST ADD COLUMN RTS TIMESTAMP NOT NULL GENERATED ALWAYS FOR EACH ROW ON UPDATE AS ROW CH ...

  7. Python黑魔法,一行实现并行化

    Python 在程序并行化方面多少有些声名狼藉.撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题.常见的经典 Python 多线程.多进程教程多显得偏“重”.而且往往隔靴搔 ...

  8. FreeRTOSConfig 配置文件详解

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 的配置文件 FreeRTOSConfig.h 中每个选项的作用.初学的话 ...

  9. oracle中空值null的判断和转换:NVL的用法

    1.NULL空值概念 数据库里有一个很重要的概念:空值即NULL.有时表中,更确切的说是某些字段值,可能会出现空值, 这是因为这个数据不知道是什么值或根本就不存在. 2.NULL空值判断 空值不等同于 ...

  10. 一款纯css3实现的tab选项卡

    今天给大家带来一款纯css3实现的tab选项卡.单击左侧的选项的时候,右侧内容以动画的形式展示.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class=&quo ...