分享

神级程序员用Python3抓取12306车次信息!超详细的新手案例教学!

 昵称16619343 2017-11-03

前言

结果展示:

我在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->表格显示

安装库

  1. 未安装之前

    Linux上面目前的库

安装库:

pip3.5 install requests colorama docopt prettytble

  1. 安装之后

    安装完成之后的库列表

ok,我们环境有了,库有了,那么应该干啥呢?

爬虫个人分析:

  1. 制定爬取内容

  2. 选取目标

  3. 准备环境,上面就提前说了,因为这个本来就是在搞爬虫,所以...

  4. 分析该网站的html结构,得到url

  5. 爬取数据

  6. 分析数据

  7. 封装数据(组装数据),弄成自己想要的样子

  8. coding......

那么我们开始吧

第一步

当然是打开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 目的地

同学们请注意:我们输入的是中文,出来的是地点代码,说明中间有一层转换,那么在常规的网站中,只有两种三种方式能这样处理?

  1. 将这个地点-地点代码字典写入js中,这个地方不可能,因为国内的地点太多。

  2. 将地点-地点代码字典写入本地文件,然后使用。

  3. 从远端服务器进行获取,在这里也没必要,因为每次都要去请求后台,增加服务器的压力,这个是没必要的,因为这个字典的话是基本不会变化的。

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

  1. 首先爬取地点-代码code字典。

新增一个stations字典名称

好的,到这里我们的地点-地点代码就得到了,那么我们就应该写那个爬取车次信息的py了。

处理输出的代码:

成果展示:

但是我在远端上使用xshell没有颜色,这个是什么鬼。最后发现是自己设置xshell而已。

好的,下面就是我们的程序执行的结果。

如果程序输入的地点在字典中查询不到,那么就不能查票。所以我们需要随时更新stations.py文件(地点-code字典表)

成果展示

ok,到这里的话,我们的所有的爬虫就抓取成功,并且输出成我们想要的结果了。我准备下一步就是搞那个抢票。试试吧。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多