12306车站信息的爬取是一个比较复杂的系统,爬取需要的信息不是很难,但是要将最终的结果做的完善和美观却不是那么容易。作为一个学习Python的新手,我想把练习和整理结合起来,希望大家可以相互交流和探讨。

这个项目准备花如下几个部分完成:

  1. 输入条件的判断,包括出发站,到达站,和出发的时间,获取车次信息的链接;
  2. 在上一步的基础上,获取输入出发站,到达站,和出发时间的车次信息;
  3. 将输出的结果美化,使用prettytable模块和colorama模块完成美化;
  4. 添加车票的票价信息;
  5. 在进行学习;

12306车站信息爬取(1)——输入条件的判断,包括出发站,到达站,和出发时间,并获取车次信息的链接

12306车站信息爬取(2)——输入出发站,到达站和出发时间,获取车次信息的列表

12306车站信息爬取(3)——使用prettytable模块和colorama模块使输出结果美化

12306车站信息爬取(4)——添加车票的票价的信息

在这篇文章中,我要实现的就是第一步的功能, 输入条件的判断,包括出发站,到达站,和出发的时间,获取车次信息的链接;

1. 出发站,到达站的判断:

在判断之前,我们需要对我们最终要获取的链接进行分析:我们最终要获取的这个链接也就是直接可以爬取车次的信息的链接。我们可以看出链接中有出发时间,出发站的代码,和到达站的代码,所以,我们就需要获取这几个信息。

首先,我们进入12306的官网,点击右键——>查看网页源代码——>按Ctrl+F进行搜索——>搜索version——>找到station version的那个信息,打开。

进入那个页面后,我们可以看到许多的车站信息,其中就包括全拼,简拼,代码等信息。找到这个页面后,我们就是要获取这个页面的信息,然后将我们需要的部分信息获取出来。如下如所示。

将获取的数据进行分析可以发现,以@进行分析之后,第一项不是我们需要的信息,还有最后一项的两个字符,我们应该对字符串进行整齐化的处理,将我们需要的信息筛选出来。

如下代码为获取车站信息的全拼,简拼,汉字和代码信息:

import requests
url='https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9090'
html_text=requests.get(url).text
#去掉文本总最后多余的两个符号,并以@符号进行分割,第一项不是有用的信息
infos=html_text[:-2].split("@")[1:]
stations={}
for info in infos:station_list=info.split("|")#将车站的代码作为键,汉字,全拼,简拼作为值stations[station_list[2]]={'cn':station_list[1],'qp':station_list[3],'jp':station_list[4]}
for k,v in stations.items():print(k,v)

结果如下:

VAP {'cn': '北京北', 'qp': 'beijingbei', 'jp': 'bjb'}
BOP {'cn': '北京东', 'qp': 'beijingdong', 'jp': 'bjd'}
BJP {'cn': '北京', 'qp': 'beijing', 'jp': 'bj'}
VNP {'cn': '北京南', 'qp': 'beijingnan', 'jp': 'bjn'}
BXP {'cn': '北京西', 'qp': 'beijingxi', 'jp': 'bjx'}
IZQ {'cn': '广州南', 'qp': 'guangzhounan', 'jp': 'gzn'}
CUW {'cn': '重庆北', 'qp': 'chongqingbei', 'jp': 'cqb'}
CQW {'cn': '重庆', 'qp': 'chongqing', 'jp': 'cq'}
CRW {'cn': '重庆南', 'qp': 'chongqingnan', 'jp': 'cqn'}
CXW {'cn': '重庆西', 'qp': 'chongqingxi', 'jp': 'cqx'}
GGQ {'cn': '广州东', 'qp': 'guangzhoudong', 'jp': 'gzd'}
......

接下来,我们就需要输入出发站和到达站,可以以全拼,简拼,和汉字进行输入,最后返回车站的代码,为车次信息的链接做好铺垫。

import requests
url='https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9090'
html_text=requests.get(url).text
#去掉文本总最后多余的两个符号,并以@符号进行分割,第一项不是有用的信息
infos=html_text[:-2].split("@")[1:]
stations={}
for info in infos:station_list=info.split("|")#将车站的代码作为键,汉字,全拼,简拼作为值stations[station_list[2]]={'cn':station_list[1],'qp':station_list[3],'jp':station_list[4]}def station_info(input_station):while 1:index = 0results = []station_results = []for k,v in stations.items():if input_station in v.values():index += 1station_results.append([k,v])results.append([index, k, v['cn']])if index == 0:input_station = input("您输入的车站不存在,请重新输入站点:").strip()#输入的信息唯一elif index == 1:print(station_results[0])station_code = station_results[0][0]return station_codebreak#输入的信息模糊,不能直接判断出你想输入的站点,需要作出一个选择else:for result in results:print(result[0], result[1], result[2])select = int(input("请输入你的选择(序号):"))for i in range(1, len(results)):if select == i:print(results[i-1])station_code = station_results[i - 1][0]return station_codebreak#strip()用于去除前后的空格,害怕输入多写空格
chufa_station=input("请输入出发站:").strip()
from_code=station_info(chufa_station)
daoda_station=input("请输入到达站:").strip()
daoda_code=station_info(daoda_station)fin_url='https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2019-01-14&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(from_code,daoda_code)
print("获取的链接为:",fin_url)

结果如下:将链接中的出发站,到达站的代码信息添加到了链接中;

请输入出发站:jingzhou
1 JEQ 靖州
2 JBN 荆州
3 JEP 景州
请输入你的选择(序号):2
[2, 'JBN', '荆州']
请输入到达站:西安
['XAY', {'cn': '西安', 'qp': 'xian', 'jp': 'xa'}]
获取的链接为: https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2019-01-14&leftTicketDTO.from_station=JBN&leftTicketDTO.to_station=XAY&purpose_codes=ADULT

2. 出发时间(输入日期正确性)的判断:

对于出发日期,一般火车站可以查询15天的车票,所以,我们需要做出一个简单的判断,让用户输入日期的合理范围。

代码如下所示,我将合理的日期范围放在了一个列表里,然后判断输入的日期是否在列表内,如果在,则输入的日期合理,否则重新输入。

import datetimetoday_riqi=datetime.date.today()
print(today_riqi)#用一个列表去存放可以查出车票的日期
riqi_list=[]
for i in range(15):tianshu=datetime.timedelta(days=i)riqi_list.append(str(today_riqi+tianshu))
print(riqi_list)while 1:chufa_riqi = input("请输入出发的日期(2019-01-01):")if chufa_riqi in riqi_list:breakelse:print("您输入的日期有误,请输入未来十五天内的日期进行查询!")

结果如下:

2019-01-15
['2019-01-15', '2019-01-16', '2019-01-17', '2019-01-18', '2019-01-19', '2019-01-20', '2019-01-21', '2019-01-22', '2019-01-23', '2019-01-24', '2019-01-25', '2019-01-26', '2019-01-27', '2019-01-28', '2019-01-29']
请输入出发的日期(2019-01-01):2019-01-08
您输入的日期有误,请输入未来十五天内的日期进行查询!
请输入出发的日期(2019-01-01):2019-01-30
您输入的日期有误,请输入未来十五天内的日期进行查询!
请输入出发的日期(2019-01-01):2019-01-16

3. 获取车次信息的链接:

将如上两个代码结合起来,去掉一些提示的信息。

import requests
import datetime
url='https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9090'
html_text=requests.get(url).text
#去掉文本总最后多余的两个符号,并以@符号进行分割,第一项不是有用的信息
infos=html_text[:-2].split("@")[1:]
stations={}
for info in infos:station_list=info.split("|")#将车站的代码作为键,汉字,全拼,简拼作为值stations[station_list[2]]={'cn':station_list[1],'qp':station_list[3],'jp':station_list[4]}#出发站,到达站的判断
def station_info(input_station):while 1:index = 0results = []station_results = []for k,v in stations.items():if input_station in v.values():index += 1station_results.append([k,v])results.append([index, k, v['cn']])if index == 0:input_station = input("您输入的车站不存在,请重新输入站点:").strip()#输入的信息唯一elif index == 1:#print(station_results[0])station_code = station_results[0][0]return station_codebreak#输入的信息模糊,不能直接判断出你想输入的站点,需要作出一个选择else:for result in results:print(result[0], result[1], result[2])select = int(input("请输入你的选择(序号):"))for i in range(1, len(results)):if select == i:print(results[i-1])station_code = station_results[i - 1][0]return station_codebreak
#出发日期的判断
def riqi_info(input_riqi):# 用一个列表去存放可以查出车票的日期riqi_list = []today_riqi = datetime.date.today()for i in range(15):tianshu = datetime.timedelta(days=i)riqi_list.append(str(today_riqi + tianshu))#输入合理的日期则跳出,否则一直输入while 1:if input_riqi in riqi_list:return input_riqibreakelse:print("您输入的日期有误,请输入未来十五天内的日期进行查询!")input_riqi = input("请输入出发的日期(2019-01-01):").strip()chufa_station=input("请输入出发站:").strip()
from_code=station_info(chufa_station)
daoda_station=input("请输入到达站:").strip()
daoda_code=station_info(daoda_station)
input_riqi=input("请输入出发的日期(2019-01-01):").strip()
chufa_riqi=riqi_info(input_riqi)fin_url='https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(chufa_riqi,from_code,daoda_code)
print("获取的链接为:",fin_url)

结果如下:

请输入出发站:jingzhou
1 JEQ 靖州
2 JBN 荆州
3 JEP 景州
请输入你的选择(序号):2
[2, 'JBN', '荆州']
请输入到达站:西安
请输入出发的日期(2019-01-01):2019-01-16
获取的链接为: https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2019-01-16&leftTicketDTO.from_station=JBN&leftTicketDTO.to_station=XAY&purpose_codes=ADULT

获取了链接之后,我们就需要爬取链接中的车次信息。

下一篇:12306车站信息爬取(2)——输入出发站,到达站和出发时间,获取车次信息的列表

12306车站信息爬取(1)——输入条件的判断,包括出发站,到达站,和出发时间,并获取车次信息的链接相关推荐

  1. 12306车站信息爬取(4)——添加车票的票价信息

    在前三篇文章的基础上: 12306车站信息爬取(1)--输入条件的判断,包括出发站,到达站,和出发时间,并获取车次信息的链接 12306车站信息爬取(2)--输入出发站,到达站和出发时间,获取车次信息 ...

  2. 12306车站信息爬取(3)——余票信息的查询(内含prettytable和colorama模块)

    12306车站信息定向爬虫-可实现查询功能 这个程序可实现由键盘输入出发站.到达站.出发日期以及需要查询的天数,首先将全部代码给出,然后我会分块对该代码进行讲解.在此之前,先说一下思路: 1.首先从1 ...

  3. 广西人才网实习信息爬取与数据库存储实战

    广西人才网实习信息爬取与数据库存储实战 https://www.gxrc.com/ 大家好,我是W 项目介绍:本项目为CrawlSpider结合MySQL.MongoDB爬取求职网站信息的项目,目标是 ...

  4. Scrapy框架爬虫项目:京东商城笔记本电脑信息爬取

    一.创建Scrapy项目 在cmd中输入一下指令创建一个新的scrapy项目及一个爬虫 scrapy startproject JD_Goodscd JD_Goodsscrapy genspider ...

  5. 利用动态渲染页面对京东笔记本电脑信息爬取

    写在前面 之前写过一个爬取京东商品的Scrapy爬虫项目,但是里面价格及评论数是通过逆向工程法获得的,在不使用代理ip的情况下,在爬取一定数量的商品后会被持续要求输入验证码.所以这里写出利用动态页面渲 ...

  6. 超星系统登录,信息爬取

    超星系统登录,信息爬取 经历过上一年的疫情的大学生,一部分大学生可能对超星有一个深刻的认识,而我写这个项目的想法来自我的导师,做一个可以爬取超星课程学生成绩,可以随机组卷(前提是自己题库里有题),该项 ...

  7. QQ群信息爬取-------抓包破解接口(2)

    QQ群信息爬取-------使用模拟登陆(1) 这个比之前的爬取效率更高,爬取的网站https://qun.qq.com/member.html,简单说一下思路 首先首先使用模拟登陆获取cookie ...

  8. 爬虫入门—requests模块基础之药监企业信息爬取

    爬虫入门-requests模块基础之药监企业信息爬取 Author: Labyrinthine Leo   Init_time: 2021.02.22 Key Words: Spider.reques ...

  9. python爬虫 京东,苏宁,小米众筹网站信息爬取

    可代写python爬虫,收费可协商,用途需提前说明. 下面爬虫爬到的数据有100天左右,100家众筹的完整数据,需要的或者有写爬虫需求的同学可发邮件至starinsunriseabovesea@ali ...

最新文章

  1. 记录Linux下的钓鱼提权思路
  2. Bagging与随机森林算法原理小结
  3. oracle 快速备份表数据
  4. 《高性能javascript》读书笔记
  5. 两个onCreate方法?你真的了解onCreate()么?
  6. Learn About Service Cloud for Agents
  7. Linux kernel crypto的介绍
  8. C++ Primer 第六章 语句
  9. 全面战争:战锤II-概念艺术设计
  10. CV之 HOG特征描述算子-行人检测
  11. CCIE学习(4)——VLAN基础
  12. java判断一个字符串是否为空,isEmpty和isBlank的区别
  13. 为了面试阿里大数据岗位,我花了半年总结了这些干货内容
  14. Android天天数钱游戏源码
  15. access更新查询非汉族加分_Access更新查询
  16. vue下载所有格式的文件
  17. 23种设计模式之软件设计模式的概念与意义
  18. JS实现图片上传并显示
  19. 对偶理论与灵敏度分析
  20. Android压缩Apk

热门文章

  1. 智能网联之TBox、ECall、BCall、ICall是什么?
  2. Excel 是您最容易被忽视的设计工具 设计师对世界排名第一的电子表格工具的看法——如何构建信息图表、仪表板、演示文稿等
  3. Flink之处理函数 (ProcessFunction)
  4. 区块链重构零售价值体系 | 苏宁区块链技术应用论坛
  5. 电脑怎么格式化?跟着这2步就可以啦!
  6. 金九银十,Java 程序员面试历程(附字节,阿里,百度,网易,美团等面经)
  7. 全国税收调查数据 (1)涵盖范围 全国税收调查数据收录了与税务相关的年度数据,时间跨度为2007年至2016年。该数据库具体涵盖增值税、增值税出口退税、消费税、营业税、房产税、城镇土地使用税、车船
  8. 用C语言操作MySQL数据库-通用版
  9. HBuilderX开发app实现自动更新版本
  10. 2016年自动修复综述——自动程序修复方法研究进展 [软件学报 Journal of Software 2016]