前言 结果展示: 我在window上运行的结果 下面这一段说明我是抄的,哈哈,因为我自己再怎么写还不是同样的内容。 让我们先给这个小应用起个名字吧,既然及查询票务信息,那就tickets,其实 大家随意了,需要发布就需要起一个更好的名字,不然只要自己玩儿的懂,但是要有程序的特点,所以还是tickets相关的吧。方便阅读和自己记忆。 我们希望用户只要输入出发站,到达站以及日期就让就能获得想要的信息,比如要查看10月31号贵阳-遵义西的火车余票, 我们只需输入: python3.5 lnlr.py 贵阳 遵义西 2017-10-31 注意:上面的日期(包括后面的)是笔者写文章时确定的日期,当你在做这个项目的时候可能要根据当前时间做适当调整。 转化为程序语言就是: python3.5 lnlr.py from to date 另外,火车有各种类型,高铁、动车、特快、快速和直达,我们希望可以提供选项只查询特定的一种或几种的火车,所以,我们应该有下面这些选项: -g 高铁 -d 动车 -t 特快 -k 快速 -z 直达 这几个选项应该能被组合使用,所以,最终我们的接口应该是这个样子的: python3.5 lnlr.py [options] from to date 接口已经确定好了,剩下的就是实现它了。 环境 Centos 7 linux 系统 Python3.5.2 使用到的库 docopt------>命令行解释器(把我玩儿死) colorama--->一个文本着色器 requests --->爬虫必备,http请求库 prettytable->表格显示 安装库
安装库: pip3.5 install requests colorama docopt prettytble
ok,我们环境有了,库有了,那么应该干啥呢? 爬虫个人分析:
那么我们开始吧 第一步 当然是打开12306的官网了,然后进行一个余票查询,当然首先你得按一下f12,打开控制台面板哦。 我是查询的是:贵阳--遵义西 10-31号的车票 f12之后,查票页面 我先埋下一个伏笔: 我看到的贵阳-遵义 10-31的车次一共是11个班次。 第二步 首先在控制台找到Network按钮,点击。然后选择XHR ---》找到请求到后台的接口, 请求接口 那么我们先看一个三个接口的请求和返回的数据: 第三个接口返回的数据 哈哈,在里面我看到了贵阳,遵义,那么大胆的猜测这个接口有可能就是我们需要的。 我们继续点开看看有什么东西,这些数据都是以json的格式传递过来的。 展开结果 到这里我相信,聪明的人已经知道了这个就是我们所需要的接口了,而这些数据就绝对是车次信息的数据。 由上面的我f12查看到的数据是11条,那么你们就没有点小激动么? 说明这个接口就是我们所需要的接口无误。那么现在我们就要得到它的url咯。 靠,双十一快到了,被女朋友抓去看了一会儿衣服,可能今天就不写了,明天接着写。 那么这样:我就明天开始分析url,然后就coding 请求的接口URL: 分析参数的获取 leftTicketDTO.train_date=2017-10-31 时间 leftTicketDTO.from_station=GIW 出发地 leftTicketDTO.to_station=ZIW 目的地 同学们请注意:我们输入的是中文,出来的是地点代码,说明中间有一层转换,那么在常规的网站中,只有两种三种方式能这样处理?
ok经过上面的分析,我们就能很清楚的知道这个字典绝对是从js获取的,那么我们就也一样的使用发f12来检查到资源,找到该页面所引用的所有js,然后进行分析。 该页面所加载的js文件 上图中的矩形中的就是当前页面中的所有js,当然每个js的作用我就不一一的说了,各位需要帮助的可以email我,或者在下面留言。 那么我直接查看各个的内容,发现有一个是: 包含了地点,地点代码js 这样我们就得到了一个js的请求地址哦。 https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9028 浏览器中输入该URL看到的结果 我们还可以来一个测试: 我在查询的时候是输入了,贵阳-遵义,搜索一下看看吧。 搜索 同学们,看到这个你们觉得爽不爽,说明这个文件就是我们所需要的。 ok,到这里,编码前期准备工作,所有的都昨晚了,我从一步一步的分析,然后截图。给大家思路,方法,步骤。希望大家能够更明白,更多的是学习到其中的分析思路哈。 codingwars
新增一个stations字典名称 好的,到这里我们的地点-地点代码就得到了,那么我们就应该写那个爬取车次信息的py了。 处理输出的代码: 成果展示: 但是我在远端上使用xshell没有颜色,这个是什么鬼。最后发现是自己设置xshell而已。 好的,下面就是我们的程序执行的结果。 如果程序输入的地点在字典中查询不到,那么就不能查票。所以我们需要随时更新stations.py文件(地点-code字典表) 成果展示 ok,到这里的话,我们的所有的爬虫就抓取成功,并且输出成我们想要的结果了。我准备下一步就是搞那个抢票。试试吧。 |
|
来自: 昵称16619343 > 《办公技能》