前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >老司机教你用Python查询快递,时刻跟踪自己的快递信息(手动狗头)

老司机教你用Python查询快递,时刻跟踪自己的快递信息(手动狗头)

作者头像
tyrantlucifer
发布2022-03-23 14:53:35
1.6K0
发布2022-03-23 14:53:35
举报
文章被收录于专栏:Tyrant Lucifer

今天的小程序,是我闲的没事情干写了个小东西,毕竟我是个懒人嘛,查快递每次得打开浏览器,输入网址,输入快递单号,真是麻烦,这个事情能不能用命令行实现呢?有了这个想法之后,利用一小会时间实现了这个小玩意,下面就不多赘述,开始说一下自己的思路:

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

代码语言:javascript
复制
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

Email: TyrantLucifer@linuxstudy.cn

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Tyrant Lucifer 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.整体思路
  • 2.F12万能大法
  • 3.程序源码
  • 4.运行效果
  • 5.后记
  • 6.Tips
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档