如何把淘抢购做成JSON接口(二)

来源:互联网 发布:xyz域名的价值 编辑:程序博客网 时间:2024/04/29 16:14

如何把淘抢购做成JSON接口(二)

在上一篇博客中我们完成了对淘抢购数据的抓取和封装,现在我们继续完成制作成接口的部分

  • 第一步,建立Web工程

    建立工程

  • 第二步,建包

包名 内容 com.disver.filter 放置过滤器 com.disver.service 放置Servlet com.disver.bean 放置Bean对象
  • 第三步,建立ContentFilter
package com.disver.filter;import javax.servlet.*;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/** * * @author 4everlynn * @date 2017/12/15 */public class ContentFilter implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {    }    @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        //解决乱码问题        servletRequest.setCharacterEncoding("UTF-8");        servletResponse.setCharacterEncoding("UTF-8");        HttpServletResponse resp = (HttpServletResponse) servletResponse;        //强转为HttpServletResponse后设置Content-type为Json        resp.setHeader("Content-type","application/json");        //执行过滤        filterChain.doFilter(servletRequest,resp);    }    @Override    public void destroy() {    }}
  • 这一步走完后,我们在web.xml中对Filter进行配置
    <filter>        <!--name属性可自定义-->        <filter-name>content</filter-name>        <filter-class>com.disver.filter.ContentFilter</filter-class>    </filter>    <filter-mapping>        <!--与上一个name保持一致-->        <filter-name>content</filter-name>        <!--路径-->        <url-pattern>/api/*</url-pattern>    </filter-mapping>
  • 第四步,在service包下建立GetDataServlet并在这个类中放入在如何把淘抢购做成JSON接口(一)中完成的功能
package com.disver.service;import com.disver.bean.Item;import com.disware.KitSet;import com.google.gson.Gson;import com.google.gson.GsonBuilder;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.net.URLDecoder;import java.util.ArrayList;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * * @author 4everlynn * @date 2017/12/15 */public class GetDataServlet extends HttpServlet {    /**     * 第一步 拿到淘抢购网页HTML     */   private final String content = KitSet.getInstance().Get("https://qiang.taobao.com/");    /**     * 下面是为了提取这个网页中的信息需要用到的正则表达式     * 预编译提高性能     */    //从完整的HTML中提取出抢购商品的部分的正则    private  Pattern ITEMS = Pattern.compile("<div class=\"qg-limit-list\" data-spm=\"[\\d]+\">(.*)</div>.*<div class=\"trigger-btn\" style=\"display:none;\">");    //提取商品名的正则    private  Pattern ITEM_NAME = Pattern.compile("<p class=\"des\">(.*)</p>.*<p class=\"subtitle\">");    //提取商品详情页URL的正则    private  Pattern HREF = Pattern.compile("<a href=\"(.*)\" target=\"_blank\" class=\"qg-item qg-ing\">");    //提取左上角标志的正则    private Pattern MARK = Pattern.compile("src=\"(.*\\.png)\" class=\"qg-img-tag\">");    //提取商品图片的正则    private  Pattern IMGS = Pattern.compile("data-ks-lazyload=\"(.*\\.[a-z]{3})\" src=.*");    //提取商品描述的正则    private Pattern SUBTITLE = Pattern.compile("<p class=\"subtitle\">([[\\w]*[\\d]*[\\W]+[\\d]*]+)</p>");    //提取商品原价的正则    private  Pattern ORGPRICE = Pattern.compile("<i>[\\d]+[<span>\\.[\\d]+</span>]*</i>");    //提取商品抢购价的正则    private  Pattern PROPRICE = Pattern.compile("<em>[\\d]+[<span>\\.[\\d]+</span>]*</em>");    //提取抢购百分比的正则    private  Pattern PRENCENT = Pattern.compile("<span class=\"percent\">(已抢购[\\d]+%)</span>");    //提取已经被抢购的数量的正则    private  Pattern NUM = Pattern.compile("<span class=\"num\">(已抢[\\d]+件)</span>");    //正则部分完毕    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        Item item;        //声明一个List 用于存放解析出的所有Item        List<Item> items = new ArrayList<>();        Matcher matcher = ITEMS.matcher(content);        //第一次匹配 找出抢购项的部分 并做分割        if (matcher.find()) {            String id = matcher.group(1);            // 通过尾标签分割出Item数组            String[] array = id.split("</a>");            /**             * 这里循环次数为 数组长度 - 1 原因为分割出的最后一项是无效的 非商品项             * 遍历这个数组 然后最终封装出 List             */            for (int i = 0; i < array.length - 1; i++) {                //qg-done 淘抢购中表示这个商品已经售罄 所以不作处理                if (array[i].indexOf("qg-done") == -1) {                    item = new Item();                    //在循环中的第一次匹配 取出商品详情页URL                    matcher = HREF.matcher(array[i]);                    if (matcher.find()) {                        //匹配成功则将URL放入Item对象                        item.setUrl("http:" + URLDecoder.decode(matcher.group(1),"UTF-8"));                    }                    //在循环中的第二次匹配 取出左上角图片URL                    matcher = MARK.matcher(array[i]);                    if (matcher.find()) {                        String mark = matcher.group(1);                        //做图片URL的前缀处理                        item.setMark(!mark.startsWith("http") ? "http:" + mark : mark);                    } else {                        //为保持后面生成的JSON格式的一直 对找不到的情况做默认处理                        item.setMark("No data");                    }                    //在循环中的第三次匹配 取出商品URL                    matcher = IMGS.matcher(array[i]);                    if (matcher.find()) {                        String img = matcher.group(1);                        //做图片URL的前缀处理                        item.setImg("http:" + img);                    }                    //在循环中的第四次匹配 取出商品名                    matcher = ITEM_NAME.matcher(array[i]);                    if (matcher.find()) {                        item.setTitle(matcher.group(1));                    }                    //在循环中的第四次匹配 取出商品描述                    matcher = SUBTITLE.matcher(array[i]);                    if (matcher.find()) {                        item.setSubtitle(matcher.group(1));                    }                    //在循环中的第五次匹配 取出商品原价                    matcher = ORGPRICE.matcher(array[i]);                    if (matcher.find()) {                        item.setOriginalPrice(KitSet.getInstance().celarWebTabs(matcher.group()));                    }                    //在循环中的第六次匹配 取出商品抢购价                    matcher = PROPRICE.matcher(array[i]);                    if (matcher.find()) {                        item.setPromoPrice(KitSet.getInstance().celarWebTabs(matcher.group()));                    }                    //在循环中的第七次匹配 取出商品抢购百分比                    matcher = PRENCENT.matcher(array[i]);                    if (matcher.find()) {                        String group = matcher.group(1);                        item.setPercent(group);                    }                    //在循环中的第最后一次匹配 取出商品被抢购的数量                    matcher = NUM.matcher(array[i]);                    if (matcher.find()) {                        item.setNum(matcher.group(1));                    }                    //全部取出后将带属性的item 放入到 List                    items.add(item);                }            }        }        //初始化Gson        Gson gson = new GsonBuilder().disableHtmlEscaping().create();        PrintWriter writer = resp.getWriter();        //最后一步 输出Json        writer.write(gson.toJson(items));    }}
  • 同样地,我们需要在web.xml中进行配置
    <servlet>        <servlet-name>datas</servlet-name>        <servlet-class>com.disver.service.GetDataServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>datas</servlet-name>        <url-pattern>/api/datas</url-pattern>    </servlet-mapping>
  • 到此我们的接口已经可以使用

    接口地址 localhost:8080/api/datas

  • 我们开启Tomcat 并到DHC上进行测试

测试接口

原创粉丝点击