美文网首页大数据 爬虫Python AI Sql
春运渡劫?Python 帮你 12306 抢回家的火车票!

春运渡劫?Python 帮你 12306 抢回家的火车票!

作者: 1a076099f916 | 来源:发表于2018-12-24 15:53 被阅读35次
    image

    前言

    年味越来越淡,但我对过年的期待一直没变。为了理想,离开家乡。这一路,背上行囊,穿过人潮,千里迢迢。疲惫也好,激动也罢,总有家乡值得牵挂。

    进群进群:943752371可以获取Python各类入门学习资料!

    这是我的微信公众号【Python编程之家】各位大佬用空可以关注下,每天更新Python学习方法,感谢!

    111111111111.png

    但是,所有的乡愁和感伤,最好的解药就是一张火车票。每当万事俱备,总是只欠东风,我依然是被一张 5mm 厚的火车票拦在了门外。隐隐约约在我眼前出现,然后又悄无声息的走掉,说的就是你,我花钱加速都抢不到的火车票。所以阿广今天教大家如何用 Python 抢火车票!解决你的乡情、爱情、友情,说不定还有基情?

    数据介绍

    12306 官方部分数据如下:

    image

    实现过程

    注:具有自然语言识别处理功能

    (1) 加载头文件

    <pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; background-image: none; background-color: initial; overflow-wrap: break-word !important;">

    from distutils.log import warn as printf
    import sys
    from bosonnlp import BosonNLP
    import yaml
    from os.path import expanduser
    import os
    import collections
    import subprocess
    import datetime

    </pre>

    (2) 加载配置文件

    <pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; background-image: none; background-color: initial; overflow-wrap: break-word !important;">

    home = expanduser("~")
    with open(os.path.join(home,".ibot.yml")) as f:
    config = yaml.load(f)
    bosonnlp_token = config["token"]

    </pre>

    (3) 解析字符串

    <pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; background-image: none; background-color: initial; overflow-wrap: break-word !important;">

    def parse(self, query_string):
    """
    input:
    1月12号 济南到兖州的高铁票
    output:
    [{'entity': [[0, 3, 'time'], [3, 4, 'location'], [5, 6, 'location']], # 需要理解实体出现的模式,这块需要理解上下文
    'tag': ['t', 'm', 'q', 'ns', 'p', 'ns', 'ude', 'n', 'n'],
    'word': ['1月', '12', '号', '济南', '到', '兖州', '的', '硬座', '票']}]
    """
    result = self.nlp.ner(query_string)[0]
    words = result['word']
    tags = result['tag']
    entities = result['entity']
    return (words,entities,tags)

    </pre>

    (4) 获得已识别的实体

    <pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; background-image: none; background-color: initial; overflow-wrap: break-word !important;">

    def get_entity(self,parsed_words,index_tuple):
    """
    获取已识别的实体
    采用filter
    参考 python cookbook部分
    input:
    entities : 二元组
    parsed_words : 解析好的词组
    """
    return parsed_words[index_tuple[0]:index_tuple[1]]

    </pre>

    (5) 元组重新命名

    <pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; background-image: none; background-color: initial; overflow-wrap: break-word !important;">

    def format_entities(self,entities):
    """
    给元组命名
    """
    namedentity = collections.namedtuple('namedentity','index_begin index_end entity_name')
    return [namedentity(entity[0],entity[1],entity[2]) for entity in entities]

    </pre>

    (6) 获取解析时间戳

    <pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; background-image: none; background-color: initial; overflow-wrap: break-word !important;">

    def get_format_time(self,time_entity):
    """
    output
    {'timestamp': '2018-12-20 23:30:29', 'type': 'timestamp'}
    """
    basetime = datetime.datetime.today()
    result = self.nlp.convert_time(
    time_entity,
    basetime)
    #print(result)
    timestamp = result["timestamp"]
    return timestamp.split(" ")[0]

    </pre>

    查看源码:https://github.com/zandaoguang/MissHome

    如何调用?

    <pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important; background-image: none; background-color: initial; overflow-wrap: break-word !important;">

    iquery 济南 兖州 20190112
    ibot 本周天从济南回老家兖州,帮我看下
    ibot 本周五从兖州出发,打算去北京捡垃圾,帮我看下有没有车票
    ib 这周六从南京回武夷山老家,帮我看下车票
    ...

    </pre>

    查询结果并抢票

    image

    写在最后

    自从学了计算机,每逢思乡之情冉冉升起,只能通过加快敲击键盘的速度来忘记此时此刻的烽火三月、家书万金。

    盼望着,盼望着,寒假来了,春天的脚步近了。在我们童颜尚驻时,过年缺少不了的部分就是走亲戚,有鱼肉之果腹,亦有无案牍之劳形。可后来的后来,我们长大了,走亲戚在无形之中成了一种“烦恼”。

    明生活不止眼前的苟且,还有往后余生的苟且,可碍于面子,我们依然装作不但有诗和远方,还要有钱途的样子。

    果把过年比作爱情,那岂是:长街长,烟花繁,你挑灯回看;短亭短,红尘辗,我把萧再叹?通俗点讲,我愿用三生烟火,换你一张通往家乡的火车票。

    ——致此刻远在他乡奋斗的你们

    相关文章

      网友评论

        本文标题:春运渡劫?Python 帮你 12306 抢回家的火车票!

        本文链接:https://www.haomeiwen.com/subject/lqyzkqtx.html