目前有两个查询方式。

1. 通过 快递单号自动匹配快递公司 信息。
2. 通过 快递公司编码 和 快递单号 获取物流信息。

Code

ExpressSearchUtils - 快递查询工具类

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zhou.demo.ExpressReturnData;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;import java.nio.charset.Charset;
import java.util.ArrayList;/*** 快递查询工具类** @author zhou*/
public class ExpressSearchUtils {private static final Logger logger = LoggerFactory.getLogger(ExpressSearchUtils.class);/*** 根据 快递单号 自动获取快递公司的 URL*/private static final String AUTO_SEARCH_COMPANY_URL = "https://www.kuaidi100.com/autonumber/autoComNum";/*** 根据 快递公司编码 和 快递单号 查询物流信息 的 URL*/private static final String SEARCH_EXPRESS_INFO_URL = "https://m.kuaidi100.com/query";/*** 根据 【快递单号】 获取 【快递公司】 (90% 的正确率)* (由于接口返回的快递公司有时候会有多个, 第一个概率是最高的, 就直接返回第一家公司的)** @param number 快递单号* @return 快递公司*/public static String getCompanyCodeByNumber(String number) {if (StringUtils.isBlank(number)) {return null;}try {HttpPost httpPost = new HttpPost(AUTO_SEARCH_COMPANY_URL);// 必须携带 User-Agent 请求头信息 (参数是直接从浏览器请求中 copy 的)httpPost.setHeader(HttpHeaders.USER_AGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36");// 请求参数ArrayList<BasicNameValuePair> parameters = new ArrayList<>();parameters.add(new BasicNameValuePair("resultv2", "1"));parameters.add(new BasicNameValuePair("text", number));HttpEntity httpEntity = new UrlEncodedFormEntity(parameters);httpPost.setEntity(httpEntity);HttpClient httpClient = HttpClients.createDefault();HttpResponse httpResponse = httpClient.execute(httpPost);if (null == httpResponse) {return null;}if (null == httpResponse.getEntity()) {return null;}String responseText = EntityUtils.toString(httpResponse.getEntity(), Charset.forName("utf-8"));if (StringUtils.isBlank(responseText)) {return null;}JSONObject resultObject = JSONObject.parseObject(responseText);if (null == resultObject) {return null;}// 请求无效, 被阻拦了if ("301".equals(resultObject.get("returnCode"))) {logger.info("请求被拦截, number = [{}]", number);return null;}// 没有查询到相关的快递公司, 该情况为 快递单号 无效if ("[]".equals(String.valueOf(resultObject.get("auto")))) {logger.info("快递单号无效, number = [{}]", number);return null;}// 获取快递公司列表JSONArray jsonArray = JSONArray.parseArray(String.valueOf(resultObject.get("auto")));// 获取第一个JSONObject jsonObject = JSONObject.parseObject(String.valueOf(jsonArray.get(0)));return jsonObject.getString("comCode");} catch (Exception e) {logger.info("查询快递公司错误, number = [{}], errorMsg: {} ", number, e.getMessage(), e);}return null;}/*** 根据 快递公司编码 和 快递单号 查询物流信息** @param code 快递公司编码* @param number 快递单号* @return 快递物流信息*/public static ExpressReturnData getExpressInfoByCodeAndNumber(String code, String number){if (StringUtils.isBlank(code) || StringUtils.isBlank(number)) {return null;}try {HttpPost httpPost = new HttpPost(SEARCH_EXPRESS_INFO_URL);// 请求头信息httpPost.setHeader(HttpHeaders.USER_AGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36");httpPost.setHeader(HttpHeaders.COOKIE,"csrftoken=rq0RJ1s5Me6iLVBgEKr1z6zYXURo3QyiTth9vVgq; WWWID=WWW9AA328B0FD91F0096AEAD0A533959B31; Hm_lvt_22ea01af58ba2be0fec7c11b25e88e6c=1578103600,1578104194,1578105292,1578105357; Hm_lpvt_22ea01af58ba2be0fec7c11b25e88e6c=1578106770");httpPost.setHeader(HttpHeaders.HOST, "m.kuaidi100.com");httpPost.setHeader(HttpHeaders.ORIGIN, "https://m.kuaidi100.com");httpPost.setHeader(HttpHeaders.REFERER, "https://m.kuaidi100.com/result.jsp?nu=" + number);// 请求参数ArrayList<BasicNameValuePair> parameters = new ArrayList<>();parameters.add(new BasicNameValuePair("id", "1"));parameters.add(new BasicNameValuePair("type", code));parameters.add(new BasicNameValuePair("postid", number));parameters.add(new BasicNameValuePair("platform", "MWWW"));parameters.add(new BasicNameValuePair("temp", "0.860779312047079"));HttpEntity httpEntity = new UrlEncodedFormEntity(parameters);httpPost.setEntity(httpEntity);// 执行请求HttpClient httpClient = HttpClients.createDefault();HttpResponse httpResponse = httpClient.execute(httpPost);if (null == httpResponse) {return null;}if (null == httpResponse.getEntity()) {return null;}String responseText = EntityUtils.toString(httpResponse.getEntity(), Charset.forName("utf-8"));if (StringUtils.isBlank(responseText)) {return null;}return JSONObject.parseObject(responseText, ExpressReturnData.class);}catch (Exception e){logger.info("查询快递信息错误, code = [{}], number =[{}], errorMsg: {} ", code, number, e.getMessage(), e);}return null;}public static void main(String[] args) {// 查询物流公司// System.out.println(getCompanyCodeByNumber("快递单号"));// 查询物流信息// System.out.println(getExpressInfoByCodeAndNumber("快递公司编码", "快递单号"));}}
getExpressInfoByCodeAndNumber - 该方法需要注意的地方
  1. 这段代码可能会失效,因为他的 Token 可能会过期,你直接去 快递100 上 copy 下来,然后再查询试试。
httpPost.setHeader(HttpHeaders.COOKIE,"csrftoken=rq0RJ1s5Me6iLVBgEKr1z6zYXURo3QyiTth9vVgq; WWWID=WWW9AA328B0FD91F0096AEAD0A533959B31; Hm_lvt_22ea01af58ba2be0fec7c11b25e88e6c=1578103600,1578104194,1578105292,1578105357; Hm_lpvt_22ea01af58ba2be0fec7c11b25e88e6c=1578106770");
  1. 这个参数的数据是随机的,也会造成不可用,直接从 快递100 上 copy 下来即可。
parameters.add(new BasicNameValuePair("temp", "0.860779312047079"));

ExpressReturnData - 返回数据对象

import com.fasterxml.jackson.annotation.JsonFormat;import java.util.Date;
import java.util.List;/*** 快递 100 返回数据对象** @author zhou*/
public class ExpressReturnData {/*** 消息体*/private String message;/*** 单号*/private String nu;/*** 是否签收标记,请忽略,明细状态请参考state字段*/private Integer ischeck;/*** 快递单明细状态标记,暂未实现,请忽略*/private String condition;/*** 快递公司编码,一律用小写字母*/private String com;/*** 通讯状态, 请忽略*/private String status;/*** 快递单当前状态,* 包括0在途,1揽收,2疑难,3签收,4退签,5派件,6退回等7个状态*/private Integer state;/*** 最新查询结果,数组,包含多项,全量,倒序(即时间最新的在最前)*/private List<ExpressInfo> data;// Get / Setprivate class ExpressInfo {/*** 时间,原始格式*/private String time;/*** 内容*/private String context;/*** 格式化后时间*/@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date ftime;/*** 这个字段好像文档没给描述, 但是接口返回了*/private String location;// Get / Set}
}

SupportDeliveryEnums - 快递编码枚举

/*** 快递编码** @author zhou*/
public enum SupportDeliveryEnums {EMS("ems", "邮政快递"),SHUNFENG("shunfeng", "顺丰快递"),SHENTONG("shentong", "申通快递"),YUANTONG("yuantong", "圆通快递"),YUNDA("yunda", "韵达快递"),JD("jd", "京东快递"),HUITONGKUAIDI("huitongkuaidi", "百世汇通"),ZHONGTONG("zhongtong", "中通快递"),ZHAIJISONG("zhaijisong", "宅急送");SupportDeliveryEnums(String code, String name) {this.code = code;this.name = name;}/*** 快递编码*/private String code;/*** 快递名称*/private String name;public String getCode() {return code;}public String getName() {return name;}}

存在问题的请评论我及时改进,如果帮到了你请点个赞。

java 爬取快递100 快递信息相关推荐

  1. java 爬取京东商品详细信息 价格

    java 爬取京东商品详细信息 价格 获取图中的价格,因为京东的价格有反扒机制,价格通过js加载的,直接通过页面标签是获取不到的,所以我们要去要相应的js. http://p.3.cn/prices/ ...

  2. java爬取闲鱼商品信息(一)

    闲鱼真是一个很神奇的地方,= =能让我等学生狗不用花很多钱就能体验科技的乐趣,当然,前提是别翻车. 好了,这当然是题外话,这阵子总结了自己学习的一些技能,就写一个对闲鱼的数据抓取来练练手. 预计达到的 ...

  3. java爬取闲鱼商品信息(三)_java爬取闲鱼商品信息(二)

    有了需要爬取的起点队列. 接下来就可以细看一下源码中html的规则. 上面这一段就是一个商品在html源码中的结构. 这里面包含了,卖家头像,ID,vip等级,主页,各种图片,商品基本信息,地址等等东 ...

  4. java爬取闲鱼商品信息(三)

    这一篇距离前两篇更新的时间有点久了,最近忙着刷题- -. 好了,上次说到没办法获取到动态加载的部分. 我用了phantomjs尝试了一下,多获取到的部分是复杂的js代码,代码量太大了,没找到我们需要的 ...

  5. java爬取闲鱼商品信息(三)_java爬取闲鱼商品信息(三)

    这一篇距离前两篇更新的时间有点久了,最近忙着刷题- -.又笔试了两轮猪厂一轮鹅厂,结果还没出来,不过感觉都凉了. 好了,上次说到没办法获取到动态加载的部分. 我用了phantomjs尝试了一下,多获取 ...

  6. java爬取当当网所有分类的图书信息(ISBN,作者,出版社,价格,所属分类等)

    java爬取当当网所有分类的图书信息(ISBN,作者,出版社,价格,所属分类等) 顺手写的,没有建立新项目,放我自己的项目的一个文件夹里了,有兴趣的朋友可以拉下来试试 https://gitee.co ...

  7. Java爬取解析去哪儿景点信息

    前言:这两周在做 Web 课的大作业,顺便琢磨了一下如何使用 Java 从网上获取一些数据,现在写这篇博客记录一下. PS:这里仅限交流学习用,如利用代码进行恶意攻击他网站,和作者无关!!! Java ...

  8. java爬取论坛信息_Java爬取校内论坛新帖

    Java爬取校内论坛新帖 为了保持消息灵通,博主没事会上上校内论坛看看新帖,作为爬虫爱好者,博主萌生了写个爬虫自动下载的想法. 嗯,这次就选Java. 第三方库准备 Jsoup Jsoup是一款比较好 ...

  9. Java 爬虫:是时候 Get 新技能了,使用 Java 爬取网页信息

    如果你想利用自己的技术做出一点有意思的产品来,那么爬虫.算法和 AI 等技术可能是一个不错的突破口.今天,我们就来介绍下使用 Java 爬取页面信息的几种思路. 说起爬虫,自从 Python 兴起之后 ...

  10. 是时候 Get 新技能了:使用 Java 爬取网页信息

    如果你想利用自己的技术做出一点有意思的产品来,那么爬虫.算法和 AI 等技术可能是一个不错的突破口.今天,我们就来介绍下使用 Java 爬取页面信息的几种思路. 说起爬虫,自从 Python 兴起之后 ...

最新文章

  1. 【BZOJ3527】【ZJOI2014】力
  2. Python中操作MySQL/Oracle
  3. 使用FtpWebRequest 类操作(上传、下载和删除)FTP上的XML文件
  4. 百度万亿流量的转发引擎BFE开源了!华为折叠屏曝光,采用传统翻盖式手机折叠方案;微软将关闭安卓iOS平台Cortana……...
  5. 容器技术Docker K8s 10 入门实践集群创建
  6. java自己写的网络爬虫
  7. requests-BeautifulSoup爬取美女贴吧图片
  8. Qt 之 QQ系统表情(一)
  9. wps页眉怎么设置不同页码_如何设置 页眉页脚和页码
  10. netron工具简单使用
  11. mysql左连接查询举例_mysql左右连接查询(有示例图)
  12. 三星a5009Android6.0,三星A5009 6.0 root教程及获取6.0的root权限
  13. 试试这几个简单好用的手机小技巧吧
  14. php 完成时钟,PHP 绘制时钟 高洛峰 细说PHP
  15. python正则表达式匹配字符串中的电话号码_Python正则表达式匹配字符串中的数字...
  16. 小米note2不上Android9吗,我的第二部小米手机,小米9简单到不能再简单的简单体会...
  17. 二维码编码库qrencode
  18. Java开发岗位面试题归类---怎么好好的准备面试,也算是发展学习方向
  19. Python内置函数—vars的具体使用方法
  20. tl494c封装区别_详解TL494的性能特点参数 TL494引脚图与功能

热门文章

  1. L5W2作业1 Emojify!
  2. TDog的科研(求毕业)之路——多任务图像超分辨率(一)
  3. python用三重引号_python三引号
  4. 通过git上传个人项目代码到coding.net
  5. 扬州旅游app(五)
  6. 密码打马赛克已经不安全了!这款开源的去“马赛克”工具一秒还原
  7. c刊计算机领域见刊快的期刊,想集合大家的经历,列出一些见刊较快的期刊,以供参考!...
  8. css 实现圆环进度条
  9. 莱布尼兹懂得超实数吗?
  10. Plexus——Spring之外的IoC容器