查询快递信息了

时间:2019-07-03 08:00:01 来源:华东都市 当前位置:撒哈拉河床 > VR资源 > 手机阅读

Duang~~

天空一声巨响,你们喝咖啡都不放香菜的闪亮登场!作为一个注册了已经一个月,拥有5位粉丝的公众号,是时候发一篇文章了!

当我们花钱剁手买买买之后,就是等待快递的到来了。如果古时候也有网购,那么估计唐诗得有一半是描述作者等快递时焦急的心情的。有时候我们买的物品还没送到,但是我们想知道已经到哪里了,什么时候能送到,就要查询快递信息,这个可以在购物时使用的app上看到,或者在一些快递查询网站上进行查询。本来公众号接入了一个机器人,我看有快递查询的功能,于是试了一下


看来是还不够智能。。。

自己动手,丰衣足食。利用python的requests模块对快递查询网站的地址进行请求,得到我们想要的快递信息。

快递信息查询网站以快递100为例(https://www.kuaidi100.com/),只要在搜索框输入快递单号,在下方就会有不同快递公司可供选择,一般情况下第一个是最常用的,应该也是我们要选择的。点击搜索按钮后,会显示快递信息,包括时间和对应的进度。如果输入了错误的单号信息,或者查询不到,会显示暂无查询记录的提醒。


首先通过Chrome开发者工具对网站的工作方式进行分析。

在搜索框输入快递单号时,下方会自动显示可选的快递或者物流公司,通过Network可以看到是向一个网址发送了POST请求,参数有一个固定的参数(resultv2 )和快递单号(text ),返回的结果就包含快递公司的名称。


然后点击对应的快递公司,会显示查询结果。这个过程是以快递公司类型(type)、快递单号(postid)和一个随机的数(temp)为参数发送的GET请求,返回的结果中就包含了快递的时间和位置信息。

分析就到这里了,然后正式开始敲代码了。

首先导入我们需要的模块,确定要访问的网址的主体URL地址,请求头信息先暂时不写,如果有反爬,再加上去。

  import requests
url = "https://www.kuaidi100.com/"

第一步是根据快递单号查询可供选择的快递公司,也就是那个POST请求。其中resultv2的值固定为1,快递单号由输入获得,构造URL并发送POST请求。最终的请求地址为:https://www.kuaidi100.com/autonumber/autoComNum?resultv2=1&text=3390760708620

  postid = input("请输入快递单号:")
post_url = url + "autonumber/autoComNum?resultv2=1&text={}".format(postid)
response = requests.post(url=post_url)
res_str = response.content.decode()

print(res_str)

先进行一下测试,运行并输入快递单号,可以看到返回结果中包含快递公司的名称信息。

第二步从返回结果中提取出快递公司的名称,暂时保存在一个列表里。

  import json

res_dict = json.loads(res_str)
auto = res_dict.get("auto")
com_list = []
for i in auto:
   com_list.append(i.get("comCode"))

第三步构造对快递信息的请求。参数type是快递公司名称,从快递公司列表中取出,postid是上面的快递单号,最后要分析的就是temp,应该是经过 js 加密生成的,第一感觉就是:这个够我研究一天了。。。最终的请求地址为:https://www.kuaidi100.com/query?type=shentong&postid=3390760708620&temp=0.34334781054346664&phone=


接下来分析点击查询时触发的 js 事件。

搜索按钮所在的 a 标签对应的事件所触发的 js 文件在最右侧的Event Listeners一栏,先打开第一个 js 文件,搜索关键字temp,共有两处结果,而且就是我们需要的。

两处结果类似,上面的有phone参数(其实第一次看的时候还没有这个参数,最新的请求地址有phone参数但是没有值,该参数可有可无),而temp的值竟然是随机生成的,和其他参数都没有关系?!!

于是可以在浏览器试一下修改temp的值会怎么样?

查询结果和temp也没有半毛钱的关系,那么请求地址可以省略为:https://www.kuaidi100.com/query?type=shentong&postid=3390760708620

  for com in com_list:
   get_url = url+"query?type={}&postid={}".format(com, postid)
   response = requests.get(url=get_url)
   res_str = response.content.decode()
   print(res_str)

结果如下:

因为在输入快递单号时,下面的可选快递公司有多个,一般第一个是正确的,按照后面的快递公司查询是没有结果的,所以显示异常。在这里的处理办法是对第一个结果进行验证,如果是正常结果则显示,异常则提示错误。

  get_url = url + "query?type={}&postid={}".format(com_list[0], postid)
response = requests.get(url=get_url)
res_str = response.content.decode()
# print(res_str)
res_dict = json.loads(res_str)
if res_dict.get("message") == "ok":
   res_data = res_dict.get("data")
   for data in res_data:
       print(data["time"], "\t", data["context"])
else:
   print("暂无查询结果")

看一下最终效果:

结果还是很准确的啊

本公众号接入了图灵机器人,可以自动回复进行聊天,而且扩展技能里有星座运势、笑话大全、成语接龙、顺口溜等娱乐功能,也有快递查询、天气查询、列车查询等实用性的功能。不过我试了一下,有些功能实现不了的。比如快递查询,他只会重复一遍你的快递单号,其他功能大家可以试一试。

欢迎关注公众号,那个机器人不会查询快递,但是可以聊天,还可以玩玩成语接龙、顺口溜什么的~

名字起的有点长了。。。

上一篇教练,我不想学车了,我想跟你......

下一篇蘑菇信用查询

相关文章:

VR资源本月排行

VR资源精选