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是查票接口,先这样,前进一小步,后面持续完善...
vue+node+mongoDB火车票H5(七)-- nodejs 爬12306查票接口的更多相关文章
- vue+node+mongoDB 火车票H5(六)---城市列表保存到MongoDB数据库并且启用node.js服务
把车站列表保存到数据库,并且从本地创建服务 node.js创建httpserver 1.搭建基于express的运行环境 全局安装express-gengerator cnpm install -g ...
- vue+node+mongoDB 火车票H5(一)---准备工作,基本配置
前端菜鸟一枚,由于公司项目用到了vue,我虽然参与了,但是很多环境配置和流程还不是特别清楚,就想自己个人业余做个webapp看看, 对于完全新手而言,很多坑会纠结很久,所以想借此机会自己做的同时记录各 ...
- vue+node+mongoDB 火车票H5(五)---城市选择
选择城市,支持搜索,储存选择过城市的历史记录,点击索引能跳到相应位置 1. 父子组件传值,trainCity城市选择组件,选择城市后改变父组件的值 2. 把城市数组按照字母A到Z排序 3.点击字母索引 ...
- vue+node+mongoDB 火车票H5(四)---完成静态页面
各项配置都好了,就可以开始写静态页面了,先别急着写,看一下页面又哪些公用的部分可以提取出来的,统一放到components组件文件夹中 header头部文件夹放一些头部常用组件,如首页的banner切 ...
- vue+node+mongoDB 火车票H5(三)---git提交时忽略不想提交的文件
想要把项目通过git提交到GitHub上,但提交时并不想提交node_modules文件夹,这个文件夹太大 git 提交代码时不提交配置文件夹node_modules 在.gitignore文件中添加 ...
- vue+node+mongoDB 火车票H5(二)---vux和less的配置
vue基本环境配置好之后,就可以开始开发页面了 开发页面之前先了解一下项目结构,原始的目录结构为: config是配置文件,环境配置好了开发阶段可以不再去修改了,node_modules文件夹是打包的 ...
- vue+node+mongodb实现的功能
用vue+node +mongodb实现前后台交互的页面代码,已经上传到github上, 地址是: https://github.com/GainLoss/vue-node-mongodb https ...
- 后台管理系统:vue&node&MongoDB(一)
后台管理系统 使用工具: Vue Node Mongodb Element-ui 一.后台(Node+Mongodb) 前期准备: 需要下载的包: mongooes -------- ...
- 学习笔记:Vue+Node+Mongodb构建简单商城系统(一)
所需前置知识: HTML.CSS.JS.Vue.ES6.Npm.Webpack.Node.Express.Mongodb 项目整体架构: IDE:webstorm: 项目建立过程(cmd常用命令行指令 ...
随机推荐
- 修改host简化远程访问
问题描述: 使用本机登陆服务器时,需要经常输入IP地址,在局域网下和非局域网下输入的IP又不一样,十分麻烦,如果可以给IP命名一个简单的名字,岂不是很方便? 解决方法: 修改host文件: vim / ...
- java调试打断点和不打断点执行结果不一致问题解决
java程序在调试的时候需要debug来跟踪一下结果,有一种情况是这样的,正常执行java程序就会出现问题,而断点debug跟踪此方法的时候却是正常的,不断测试结果都是这样,由此判断有可能是因为此方法 ...
- django abstract base class ---- 抽象基类
抽象蕨类用于定义一些同享的列.类本身并不会在数据库端有表与之对应 一.例子: 1.定义一个叫Person 的抽象基类.Student 继承自Person from django.db import m ...
- unity, 设置帧率上限
用unity做了个demo,把所有开销大的特效都去了,在真机上运行仍然卡.显示帧率来看,最高到30.原来unity在ios设备上帧率默认限制为不超过30. 可以通过Application.target ...
- [Jobdu] 题目1408:吃豆机器人
题目描述: 淘宝公司内部有许多新鲜的小玩具,例如淘宝智能机器人.小时候,大家都玩过那个吃豆子的游戏吧,这机器人就是按照这个游戏设计的,它会朝着豆子的方向行走.不过机器人还存在一个bug,他只会朝南和朝 ...
- DB2检测表字段改动的方法(不用触发器)
ALTER TABLE TEST ADD COLUMN RTS TIMESTAMP NOT NULL GENERATED ALWAYS FOR EACH ROW ON UPDATE AS ROW CH ...
- Python黑魔法,一行实现并行化
Python 在程序并行化方面多少有些声名狼藉.撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题.常见的经典 Python 多线程.多进程教程多显得偏“重”.而且往往隔靴搔 ...
- FreeRTOSConfig 配置文件详解
以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 的配置文件 FreeRTOSConfig.h 中每个选项的作用.初学的话 ...
- oracle中空值null的判断和转换:NVL的用法
1.NULL空值概念 数据库里有一个很重要的概念:空值即NULL.有时表中,更确切的说是某些字段值,可能会出现空值, 这是因为这个数据不知道是什么值或根本就不存在. 2.NULL空值判断 空值不等同于 ...
- 一款纯css3实现的tab选项卡
今天给大家带来一款纯css3实现的tab选项卡.单击左侧的选项的时候,右侧内容以动画的形式展示.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class=&quo ...