例子来源于马哥的公众号,看了几遍,有些地方存在些疑问,然后就自己查找些资料,重写的一下,但是对于获取到的信息,并不能有效的解析出来,而且对于中文字符处理,并不是很好,请大神指教下!谢过!

  1、接口设置:用户只要输入出发站,到达站及日期就能查到火车信息;python tickets [-hgdtkz] from to date

  2、解析参数,使用docopt模块

  3、获取数据,打开12306官网余票查询的界面,浏览器按F2到开发人员工具界面,点击network标签,再点击查询,有查询URL,这个将是我们要使用的URL,但是发现from_station 和to_station并不是汉字,是一个代号;

  4、获取各个站点的代号,打开网面的源代码可以查询到汉字与代号的转换的URL:https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9010

  5、将用户的请求转换为站点代号再请求数据;

第一步:

先获取站点的代号(调用函数时将转换URL代入参数即可):

def Main(IP):
Re = urllib2.Request(IP)
try:
Response = urllib2.urlopen(Re,timeout=5)
with open ('./urllib2_content.txt','w+') as fp:
fp.write(Response.read())
print "目标地址为:%s"%Response.geturl()
print "目标返回代码为:%s"%Response.getcode()
print "目标信息为:%s"%Response.info()
print "已获取目标主机内容,存放当前目录下的urllib2_content.txt,请自行查看!!!"

第二步:解析站点代码(此部分没有很好解决中文字符的匹配)

#!/usr/bin/env python
#coding:utf-8
import re
with open('urllib2_content.txt') as fp:
text = fp.read()
stations = re.findall(u"([\x80-\xff]+)\|([A-Z]+)",text)
for i in stations:
print "\""+i[0]+"\""+" : "+"\""+i[1]+"\""+","

第三步:将解析后的代码制作成字典(部分内容)

#!/usr/bin/env python
#coding:utf-8
stations = {"北京北" : "VAP",
"北京东" : "BOP",
"北京" : "BJP",
"北京南" : "VNP",
"北京西" : "BXP"......}

第四步:请求转换

#!/usr/bin/env python
#coding:utf-8
"""Train tickets query via command-line. Usage:
tickets [-gdtkz] <from> <to> <date> Options:
-h,--help 帮助
-g 高铁
-d 动车
-t 特快
-k 快车
-z 直达 Example:
tickets 南京 北京 2016-07-01
tickets -dg 南京 北京 2016-07-01
"""
import docopt,json,requestsfrom station import stations
def cli():
"""command-line interface"""
arguments = docopt.docopt(__doc__)
from_station = stations.get(arguments['<from>'])
to_station = stations.get(arguments['<to>'])
date = arguments['<date>']
url = "https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=%s&leftTicketDTO.from_station=%s&leftTicketDTO.to_station=%s&purpose_codes=ADULT"%(date,from_station,to_station)
j = 0
r = requests.get(url,verify=False)
for i in r.json()["data"]["result"]:
print i
j += 1
print j if __name__ == "__main__":
cli()

  

Python实现查询12306火车票信息的更多相关文章

  1. python django查询12306火车票

    逢年过节,想坐个高铁票,都得上12306去买票,但用过的都会发现,它会把临近站点的也筛出来了.但有时我们压根就不会考虑买到临近站点的. 另一方面,在购票高峰期,有可能你要的出发站到目的站都没有票了,这 ...

  2. Python 爬取12306火车票

    获取火车站 stations.py #import certifi #import urllib3 import re import requests from pprint import pprin ...

  3. python爬虫之12306网站--火车票信息查询

    python爬虫之12306网站--火车票信息查询 思路: 1.火车票信息查询是基于车站信息查询,先完成车站信息查询,然后根据车站信息查询生成的url地址去查询当前已知出发站和目的站的所有车次车票信息 ...

  4. python爬虫之12306网站--车站信息查询

    python爬虫查询车站信息 目录: 1.找到要查询的url 2.对信息进行分析 3.对信息进行处理 python爬虫查询全拼相同的车站 目录: 1.找到要查询的url 2.对信息进行分析 3.对信息 ...

  5. 使用python制作查询火车票工具

    使用python脚本实现查询火车票信息的效果图如下: 实现的代码: # coding: utf-8 """命令行火车票查看器 Usage: tickets [-gdtkz ...

  6. Python 实现的 12306抢票脚本

    Python12306抢票脚本 本脚本使用一个类来实现所有代码,大体上分为以下几个模块及其步骤:- 初始化对象属性(在抢票前进行的属性初始化,包括初始化浏览器模拟对象,个人信息等).- 建立模拟浏览器 ...

  7. python+splinter实现12306网站刷票并自动购票流程

    python+splinter实现12306网站刷票并自动购票流程 通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站 ...

  8. 在linux中查询硬件相关信息

    1.查询cpu的相关 a.查询CPU的统计信息 使用命令:lscpu 得到的结果如下: Architecture: x86_64 CPU op-mode(s): -bit, -bit Byte Ord ...

  9. 查询rman备份信息经常使用指令

    查询rman备份信息经常使用指令 ----登陆到rman $rman target / ----以精简的格式查看备份信息 RMAN> list backup of database summar ...

随机推荐

  1. SpringBoot 整合MinIO

    引入依赖 <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifact ...

  2. C++之递归遍历数组

    倒序输出 源码 void print_arr_desc(int arr[], unsigned int len) { if (len) { std::cout << "a[&qu ...

  3. 【LeetCode】361. Bomb Enemy 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力搜索 日期 题目地址:https://leetco ...

  4. 【LeetCode】638. Shopping Offers 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 回溯法 日期 题目地址:https://le ...

  5. B. Petya and Exam

    B. Petya and Exam 题目链接 题意 给你一串字符,在这个串中所有出现的字符都是\(good\)字符,未出现的都是\(bad\)字符, 然后给你另一串字符,这个字符串中有两个特殊的字符, ...

  6. 1319 - Monkey Tradition

    1319 - Monkey Tradition   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB ...

  7. Docker 与 K8S学习笔记(二)—— 容器核心知识梳理

    本篇主要对容器相关核心知识进行梳理,通过本篇的学习,我们可以对容器相关的概念有一个全面的了解,这样有利于后面的学习. 一.什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在 ...

  8. 一个简单的js时钟

    演示地址 代码 <html> <head> <title> Nonove js clock 时钟 </title> <script type=&q ...

  9. vue是如何通过diff算法做渲染更新

    渲染页面 图中框起来的部分,vue会根据响应式变化的通知生成一颗新的 Virtual Dom Tree,然后将新的Virtual Dom Tree 和之前的 Virtual Dom Tree 做 di ...

  10. 基于Spring MVC + Spring + MyBatis的【超市会员管理系统】

    资源下载: https://download.csdn.net/download/weixin_44893902/22035329 一. 语言和环境 实现语言:JAVA语言. 使用:MyEclipse ...