Python 小程序之查询快递信息

Tyrant 2019年01月12日 •  Python 326 •  1

最近刚找了个国企的工作,虽然挺稳定吧,也很轻松,但是不是自己想干的,果断跑路辞职,毕业设计也已经确定了题目,开始搞了起来,各方面工作都开始启动,希望能够完成自己的目标吧,好像有点扯远了,继续说一下今天的小程序,这是我闲的没事情干写了个小东西,毕竟我是个懒人嘛,查快递每次得打开浏览器,输入网址,输入快递单号,真是麻烦,这个事情能不能用命令行实现呢?有了这个想法之后,利用一小会时间实现了这个小玩意,下面就不多赘述,开始说一下自己的思路:

1.整体思路

我们在查快递的时候,其实在浏览器输入地址然后再输入快递单号本质就是向服务器发出了一个GET请求,只要去进行正确的参数请求即可,然而Python的requests库就可以实现所有常见的http请求,分析返回来的数据即可,把有用的东西留下,并展示在前台界面,这就实现了我们的需求,比较知名的快递查询网站就是快递100啦,接下来开始搞起

2.F12万能大法

有了思路要开始考虑写程序的事情了,对于这种请求一般都是网站有专门api去进行调用数据库返回json信息,这时候就开始我们的F12万能大法,打开快递100首页,如图所示,主页挺漂亮的:

按下F12,并在单号输入框中输入单号,这时候发现页面一直在向一个api请求:

返回的json字符串正是单号所对应的快递公司,一部分信息取到:

api:http://www.kuaidi100.com/autonumber/autoComNum

参数有:

resultv2:1

text:快递单号

接下来搜索:

又出现了一个新的请求,看来这个就是获取到物流信息的api呀,得来全不费功夫

api:http://www.kuaidi100.com/query

参数有:

type:快递公司名称

postid:快递单号

phone:手机号后四位

3.程序源码

得到两个重要的api之后,我们就可以很快速的写出这个程序来,下面是程序源码:

快递查询.py

import requests

'''获取快递编号所对应的快递公司名称'''
def get_type(headers, express_code):
    type_list = []
    type_url = "http://www.kuaidi100.com/autonumber/autoComNum"
    params = {
        'resultv2' : 1 ,
        'text' : express_code
    }
    r = requests.get(type_url, headers=headers, params=params)
    result = r.json()
    type_dicts = result['auto']
    for type_dict in type_dicts :
        type_list.append(type_dict['comCode'])
    return type_list

'''向用户展示查询到的快递公司'''
def show_type(type_list, type_name):
    print("该运单号可能为以下快递:")
    for express_type in type_list:
        print(type_name[express_type])
    express_type = input("请输入您的快递种类(请输入快递种类的简拼,例如'顺丰'为'shunfeng'):")
    return express_type

'''主函数,查询快递信息'''
def main():
    type_name = {
        'yuantong' : '圆通' ,
        'shunfeng' : '顺丰' ,
        'yunda' : '韵达' ,
        'baishihuitong' : '百事汇通' ,
        'shentong' : '申通' ,
        'zhogntong' : '中通' ,
        'tiantian' : '天天' ,
        'jingdong' : '京东'
    }
    express_code = input("请输入要查询的快递单号:")
    phone_num = input("请输入手机的后四位数字:")
    msg_url = "http://www.kuaidi100.com/query"
    headers = {
        'User-Agent' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    }
    type_list = get_type(headers, express_code)
    express_type = show_type(type_list,type_name)
    params = {
        'type' : express_type ,
        'postid' : express_code ,
        'phone' : phone_num
    }
    r = requests.get(msg_url, headers=headers, params=params)
    result = r.json()
    message = result['message']
    status_code = result['status']
    if status_code == '200':
        datas = result['data']
        print("您所查询的快递信息如下:")
        for data in datas:
            print(data['time'] + ":" + data['context'])
    else:
        print(message)

if __name__ == "__main__":
    while True:
        main()
        i = input("是否继续查询?(任意字符为继续,q为退出)")
        if i == "q":
            print("感谢使用,祝您生活愉快,再见!")
            break

4.运行效果

5.后记

其实快递100提供了很多api接口去为用户提供快递查询服务,本次是用了原生爬虫的思路,可能会有些啰嗦,但毕竟亲自实践得来的东西才是最爽的,这种分析思路是爬虫必须具备的,小程序只是具备查询type_name字典里面的快递类型,因为快递种类实在太多,懒得写了,小伙伴如果有兴趣的可以在type_name添加你想要查询的类型,在api返回的是简拼,为了让输出的更加好看一点,所以才有了type_name这个东西,如果你api返回的类型不在字典里,程序就会报错,想避免这个问题,就直接把程序中的print(type_name[express_type])修改为print(express_type),这样程序就不会报错,但是会显示快递公司的简拼,总之,东西技术含量不高,用来练练手就可以

6.Tips

QQ:770925351

Email:770925351@qq.com

Tags:none
上一篇
打赏
下一篇

添加新评论

已有 1 条评论

 枂下 3 个月前 • |

不错不错,有机会试一试