物流轨迹抓取

package com.vanwell.module.util.express;

import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.URL;import java.text.SimpleDateFormat;import java.util.UUID;

import org.elasticsearch.common.lang3.StringUtils;import org.jsoup.Connection;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;import org.springframework.beans.BeansException;

import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;import com.vanwell.module.common.ErrorConstants;import com.vanwell.module.common.Result;import com.vanwell.module.common.util.CommonUtil;import com.vanwell.module.util.exception.StackTraceUtil;import com.vanwell.module.util.http.HttpUtils;import com.vanwell.module.util.spring.ServiceFactory;import com.vanwell.thirdparty.fedroad.api.QueryTrackApi;import com.vanwell.thirdparty.fedroad.pojo.QueryTrackReq;import com.vanwell.thirdparty.fedroad.pojo.QueryTrackRes;

/** * Created by aixiaofeng on 17/2/6. */public class FedroadSpider extends ExpressSpider {

private static final SimpleDateFormat FMT_COL_DATE = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");    private static final SimpleDateFormat FMT_DATE     = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

private static QueryTrackApi          queryTrackApi;

@Override    public Result<String> doQuery(String express, String expressNo, String attr) {        String deliveryNo = null;        if (StringUtils.isNotBlank(attr) || !StringUtils.lowerCase(expressNo).startsWith("ec")) {            deliveryNo = queryDeliveryNoByApi(express, expressNo, attr);        }        return queryByPage(express, StringUtils.isNotBlank(deliveryNo) ? deliveryNo : expressNo, attr);    }

private String queryDeliveryNoByApi(String express, String expressNo, String attr) {        if (queryTrackApi == null) {            try {                queryTrackApi = ServiceFactory.getBean(QueryTrackApi.class);            } catch (BeansException e) {                queryTrackApi = new QueryTrackApi();            }            if (queryTrackApi == null) {                queryTrackApi = new QueryTrackApi();            }        }        QueryTrackReq reqTrack = new QueryTrackReq();        reqTrack.getParameters().setPackageNo(expressNo);        Result<QueryTrackRes> res = queryTrackApi.doRequest(reqTrack);        if (res.isSuccess() && res.getData() != null && res.getData().getTrackList() != null                && CommonUtil.isNotEmpty(res.getData().getTrackList().getTrackList())) {            return res.getData().getTrackList().getTrackList().get(0).getDeliveryNo();        }        return null;    }

private Result<String> queryByPage(String express, String expressNo, String attr) {        Result<String> result = new Result<>();        String res = "";        String BOUNDARY = UUID.randomUUID().toString();        String urlStr = "https://www.fedroad.com";//访问页面        try {            StringBuilder strBuilder = new StringBuilder();            //请求链接,拿到document            HttpURLConnection conn = null;            Connection connection = HttpUtils.getConnection(urlStr);            Connection.Response response = connection.method(Connection.Method.GET).execute();            Document document = response.parse();            //定位到form表单            Elements formDocuments = document.select("#aspnetForm");

//获取conn连接            URL url = new URL(urlStr);            conn = (HttpURLConnection) url.openConnection();            conn.setConnectTimeout(5000);            conn.setReadTimeout(30000);            conn.setDoOutput(true);            conn.setDoInput(true);            conn.setUseCaches(false);            conn.setRequestMethod("POST");            conn.setRequestProperty("Connection", "Keep-Alive");            conn.setRequestProperty("User-Agent",                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36");            conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);

OutputStream out = new DataOutputStream(conn.getOutputStream());            //拼POST装请求参数            for (int i = 0; i < formDocuments.select("input").size(); i++) {                if (formDocuments.select("input").get(i).attr("class").contains("user_loginout")) {                    continue;                }                strBuilder.append("--" + BOUNDARY + "\r\n");                strBuilder.append("Content-Disposition: form-data; name=\"" + formDocuments.select("input").get(i).attr("name") + "\"" + "\r\n\r\n");

if (formDocuments.select("input").get(i).attr("name").contains("search_shippingorder")) {                    strBuilder.append(expressNo + "\r\n");                } else {                    strBuilder.append(formDocuments.select("input").get(i).val() + "\r\n");                }            }            strBuilder.append("--" + BOUNDARY + "--");            out.write(strBuilder.toString().getBytes());            byte[] endData = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();            out.write(endData);            out.flush();            out.close();

// 读取返回数据            strBuilder = new StringBuilder();            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));            String line;            while ((line = reader.readLine()) != null) {                strBuilder.append(line).append("\n");            }            res = strBuilder.toString();            //关闭            reader.close();            //获取返回的document(就是你需要的)            document = Jsoup.parse(res);            Elements trackinfo = document.select(".trackinfo tr");            JSONObject json = new JSONObject();            JSONArray arr = new JSONArray();             通过Jsoup 获取相应的字段 进行组装            for (Element trElement : trackinfo) {                if (trElement.select("td").attr("class").contains("title")) {                    continue;                }                Elements tdElement = trElement.getElementsByTag("td");                JSONObject item = new JSONObject();                if (tdElement.get(0).text().trim().isEmpty()) {                    continue;                } else {                    item.put("time", FMT_DATE.format(FMT_COL_DATE.parse(tdElement.get(0).text().trim())));                }                item.put("context", tdElement.get(1).text().trim());                arr.add(item);            }            json.put("data", arr);             //成功返回            return result.setSuccess(true).setCode(ErrorConstants.SUCCESS).setData(json.toString());        } catch (Exception e) {            result.setCode(ErrorConstants.HTTP_ERR).setMessage(StackTraceUtil.getStackTrace(e));            LOGGER.error(" - doQuery error,express = " + express + "," + expressNo, e);            waitRandom();        }        //拿到抓取到的参数        return result;    }

// 测试    public static void main(String[] args) {        FedroadSpider spider = new FedroadSpider();        Result<String> ret = spider.doQuery(null, "EC000021436MY", null);        System.out.print(ret);    }}
时间: 2024-08-12 04:47:50

物流轨迹抓取的相关文章

淘宝商品列表以及商品详情数据抓取

前段时间老师让我爬取淘宝的商品列表以及其商品详情数据,期间遇到了很多问题.最困难的就是淘宝的价格数据是以Ajax异步加载的,这些数据暂时还没有能力获取到. 下面介绍一下基本思路. 首先,通过抓取商品列表的商品ID获取商品的身份标识,然后根据商品ID跳转到具体的商品列表,对其他属性进行抓取. 观察两条商品列表的URL: https://s.taobao.com/search?q=帽子&imgfile=&commend=all&ssid=s5-e&search_type=ite

分析越来越多的IT开发者热衷开发这一款手机/QQ号抓取软件系统

为什么要使用手机号抓取软件系统 中国共有11.46亿移动通信服务用户 根据中国工信部统计数据,截至2013年3月底,中国共有11.46亿移动通信服务用户,11.46亿移动通信服务用户当中,有2.7727亿是3G用户,占全部用户的24.20%,有8.1739亿用户接入移动互联网,占全部用户的71.34%.目前,移动通信服务用户数占全国人口的84.9%.只要客户使用手机登陆您的网站,您就可以得到客户的手机号码,了解手机客户的详细需求,提高公司业绩等. 为什么要使用手机号抓取系统 提高30%手机竞价转

抓取快递100数据,进行快递查询

8月份换了份工作,是做物流行业相关系统的,有时会需要查询外部快递接口,进行快递跟踪查询,这里就抓取快递100数据进行简单介绍. 需要的朋友可以参考下. 先上效果图: 下面我们一步一步来讨论如何实现这样的功能. 1.准备工作:获取快递100 Json数据 由上图我们发现 快递100的查询路劲为:http://www.kuaidi100.com/query?type=yuantong&postid=5714113854&id=1&valicode=&temp=0.1968950

细说物流轨迹跟踪之订阅推单的意义

在讲订阅推送之前,我们需要先回顾一下前面提到的物流轨迹查询功能,我们用2种不同的获取物流轨迹的方式做一个对比.有对比才有差距. 先讲一个生活中的小案例,我们都有去商场购买过商品,也遇到过想要买的商品缺货的情况,比如隔壁王阿姨要买的口罩断货了,没有买到,并且这样的口罩只有这家商场卖,王阿姨首先会问商家大概什么时候有货,商家不会给她一个承若,可能会给王阿姨一个大概时间,比如说3天内可能会到货,因为阿姨急着要货,3天内王阿姨多次去商场询问到货情况,去的次数多了,都失去信心了. 好不容易告知已经到货了,

一个实用的C#网页抓取类代码分享

一个实用的C# 网页抓取类 模拟蜘蛛,类中定义了超多的C#采集文章.网页抓取文章的基础技巧,下面分享代码: using System; using System.Data; using System.Configuration; using System.Net; using System.IO; using System.Text; using System.Collections.Generic; using System.Text.RegularExpressions; using Sys

fiddler抓取手机端的数据流量包

1.首先下载安装fiddler 2.然后打开fiddler,进入到tools-->options-->connections 3.然后进入到https 4.设置完成后,查找本机ip 然后打开手机的wifi,进行代理设置,手动输入本机ip地址,端口号就是8888 5.最重要的一点就是要手机端安装证书,要不然就会报tunnel to 443,抓取不到https的数据包 6.安装证书步骤 手机浏览器输入:http://你挂代理的ip:8888/FiddlerRoot.cer,然后安装成功就能抓取ht

使用Wireshark mac下抓取分析iphone数据包 --IOS端

mac系统版本:mac 10.10 Yosemite xcode版本:6.3.1 在追踪bug或者分析借鉴其他公司的app通讯思路时,抓包这件事是非常有必要的.下面说说Wireshark怎么截获iphone的数据包. 安装wireshark wireshark是依赖x11的,所以首先确认安装了x11,mac自带,可以打开升级一下.前往-实用工具-x11,打开后点击菜单栏上的x11,检查更新 即可.中间提取包内容过程比较长,耐心等待. 下载Wireshark最新版,尽量去官网下载:https://

关于curl跳转抓取

今天在公司碰到了一个bug,就是以前一直用curl下载的MP3录音文件为空了,但是浏览器去get请求是有文件的,并且大小还不是0kb,但是我用curl下载下来就是0K,百思不得其解.终于功夫不负有心人,得到了方法,原来我一直要去第三方的接口拿到录音数据,但是今天的录音数据中地址跳转了,也就是第一次请求的地址返回的是302, 这是以前的代码 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); // curl_setopt($ch, CUR

ngrep环回接口数据抓取方法,使用-d lo参数

ngrep环回接口数据抓取方法,使用-d lo参数,注意顺序: ngrep -W byline -d lo port 80