【python爬虫】邮政包裹物流查询

2024-01-21 03:30

本文主要是介绍【python爬虫】邮政包裹物流查询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【python爬虫】邮政包裹物流查询

  • 目标网站 ems 邮政快递包裹查询:

https://www.ems.com.cn/

  • 截图

image-20230801214420758

  • 接口预览
    image-20230801215145340

    • getPic请求滑动验证码的背景图片和滑块图片,返回的是base64编码的图片

    • getLogisticsTestFlag发送验证码的验证信息

      image-20230801215455640

      • xpos为滑动的距离,本站没有验证轨迹一说,属于验证码简单的一类
      • waybillNoList为需要查询的单号
    • queryTrack为查询物流的api

    • 请求头的加密参数

      image-20230801215918222

      • tickettime必须校验
      • user-sign没有校验
  • 解决思路

    • 滑动验证码采取ddddocr识别
    • 逆向tickettime请求头参数即可
  • js调试

    image-20230801220459596

    • 上图显示了这两个加密参数的加密逻辑

    • h()跟进去看是MD5

    • p.encode()base64

    • 需要注意的是querytrack那个接口的l参数不一样,如下

      image-20230801220725904

    • 另外,请求前需要获取一个服务器时间,穿插在每次请求前,这个是为了让获取的信息更加实时

  • 代码实现

import requests
import base64
import ddddocr
import hashlib
import json
from loguru import logger
logger.info("技术交流qq群:{}",529528142)
det = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False)
headers = {'authority': 'www.ems.com.cn','accept': 'application/json, text/plain, */*','accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',# 'content-length': '0','origin': 'https://www.ems.com.cn','referer': 'https://www.ems.com.cn/','sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"','sec-fetch-dest': 'empty','sec-fetch-mode': 'cors','sec-fetch-site': 'same-origin','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
}def query_time():response = requests.post('https://www.ems.com.cn/ems-web/currentTime/queryTime', headers=headers)return response.json()["value"]def getPic():response = requests.post('https://www.ems.com.cn/ems-web/cutPic/getPic', headers=headers).json()return response["value"]["capcode"], response["value"]["backImage"], response["value"]["slidingImage"], \response["value"]["yHeight"]def verify(_ticket, _time, _xpos, _capcode):__headers = {'authority': 'www.ems.com.cn','accept': 'application/json, text/plain, */*','accept-language': 'zh-CN,zh;q=0.9,en;q=0.8','content-type': 'application/json;charset=UTF-8','origin': 'https://www.ems.com.cn','referer': 'https://www.ems.com.cn/','sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"','sec-fetch-dest': 'empty','sec-fetch-mode': 'cors','sec-fetch-site': 'same-origin','ticket': _ticket,'time': _time,'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',}json_data = {'value': {'customerIP': '你的ip','phoneNum': '','waybillNoList': [consult_code,],'xpos': _xpos,'capcode': _capcode,},}response = requests.post('https://www.ems.com.cn/ems-web/trackTestQuery/getLogisticsTestFlag', headers=__headers,json=json_data)# print(response.json())if response.json()["success"]:logger.info("验证成功")else:logger.error("验证失败")def ddocr_get_pos(_slide, _bg):_slide_bytes = base64.b64decode(_slide)_bg_bytes = base64.b64decode(_bg)with open('./slide.png', 'wb') as f:f.write(_slide_bytes)with open('./bg.jpg', 'wb') as f:f.write(_bg_bytes)_res = det.slide_match(_slide_bytes, _bg_bytes)return _resdef get_ticket_(_time, _capcode, _type):o = _timen = o[0:3]r = o[3:]l = ""if _type == "verify":l = "1163FA15CC9A425EA4B65B2A218FF5F8"elif _type == "track":l = "053B245CB1B74EBBB5FBB4A5889D66B8"else:passc = _capcodeu = consult_code + n + l + r + cg = hashlib.md5(u.encode('utf-8')).hexdigest().upper()d = hashlib.md5(g.encode('utf-8')).hexdigest().upper()m = base64.b64encode(d.encode('utf-8')).decode('utf-8')return mdef query_track(_ticket, _time, _xpos, _capcode):headers_ = {'authority': 'www.ems.com.cn','accept': 'application/json, text/plain, */*','accept-language': 'zh-CN,zh;q=0.9,en;q=0.8','content-type': 'application/json;charset=UTF-8','origin': 'https://www.ems.com.cn','referer': 'https://www.ems.com.cn/','sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"','sec-fetch-dest': 'empty','sec-fetch-mode': 'cors','sec-fetch-site': 'same-origin','ticket': _ticket,'time': _time,'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',}json_data = {'value': [{'ip': '你的ip','xpos': _xpos,'capcode': _capcode,'mailStatus': 'a','orderNum': [consult_code,],'orderType': '1','noRulesNum': [],'appleFlag': None,},],'list': [consult_code,],}response = requests.post('https://www.ems.com.cn/ems-web/mailTrack/queryTrack', headers=headers_, json=json_data)return response.json()if __name__ == "__main__":consult_code = "12121212121"capCode, bg, slide, yheight = getPic()time_ = query_time()xpos_ = ddocr_get_pos(slide, bg)['target'][0] - 3logger.info("ddddocr->{}", xpos_)ticket_ = get_ticket_(_time=str(time_), _capcode=capCode, _type="verify")verify(_ticket=ticket_, _time=str(time_), _xpos=xpos_, _capcode=capCode)time_ = query_time()ticket_ = get_ticket_(_time=str(time_), _capcode=capCode, _type="track")info = query_track(_ticket=ticket_, _time=str(time_), _xpos=xpos_, _capcode=capCode)logger.info(info)
  • 运行截图

image-20230801221156097

time=str(time), _capcode=capCode, _type=“track”)
info = query_track(ticket=ticket, time=str(time), xpos=xpos, _capcode=capCode)
logger.info(info)


- 运行截图[外链图片转存中...(img-ElMgBEOl-1690961672127)]技术交流群:`529528142`

这篇关于【python爬虫】邮政包裹物流查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628237

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优