今天的小程序,是我闲的没事情干写了个小东西,毕竟我是个懒人嘛,查快递每次得打开浏览器,输入网址,输入快递单号,真是麻烦,这个事情能不能用命令行实现呢?有了这个想法之后,利用一小会时间实现了这个小玩意,下面就不多赘述,开始说一下自己的思路:
我们在查快递的时候,其实在浏览器输入地址然后再输入快递单号本质就是向服务器发出了一个
GET
请求,只要去进行正确的参数请求即可,然而Python的requests
库就可以实现所有常见的http
请求,分析返回来的数据即可,把有用的东西留下,并展示在前台界面,这就实现了我们的需求,比较知名的快递查询网站就是快递100
啦,接下来开始搞起
有了思路要开始考虑写程序的事情了,对于这种请求一般都是网站有专门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
: 手机号后四位
得到两个重要的 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
其实快递100提供了很多api接口去为用户提供快递查询服务,本次是用了原生爬虫的思路,可能会有些啰嗦,但毕竟亲自实践得来的东西才是最爽的,这种分析思路是爬虫必须具备的,小程序只是具备查询
type_name
字典里面的快递类型,因为快递种类实在太多,懒得写了,小伙伴如果有兴趣的可以在type_name
添加你想要查询的类型,在api返回的是简拼,为了让输出的更加好看一点,所以才有了type_name
这个东西,如果你api返回的类型不在字典里,程序就会报错,想避免这个问题,就直接把程序中的print(type_name[express_type])
修改为print(express_type)
,这样程序就不会报错,但是会显示快递公司的简拼,总之,东西技术含量不高,用来练练手就可以。
TyrantLucifer@linuxstudy.cn
本文分享自 Tyrant Lucifer 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!