如何把淘抢购做成JSON接口(二)
来源:互联网 发布:xyz域名的价值 编辑:程序博客网 时间:2024/04/29 16:14
如何把淘抢购做成JSON接口(二)
在上一篇博客中我们完成了对淘抢购数据的抓取和封装,现在我们继续完成制作成接口的部分
第一步,建立Web工程
第二步,建包
- 第三步,建立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上进行测试
阅读全文
0 0
- 如何把淘抢购做成JSON接口(二)
- 如何把淘抢购做成JSON接口(一)
- 如何把EXE文件做成windows服务
- 如何把表格做成热点图
- 如何能把垃圾网站做成专业网站
- 如何把自己做好的系统做成一个安装软件
- PS如何把图片做成圆角的
- 如何把一张照片用 Photoshop 做成动画背景效果?
- C#如何把可执行程序做成windows服务
- 如何把JAVA程序做成Windows服务,并开机运行
- 用PS如何把图片做成圆角的?
- 把PC做成CEPC
- 把uTorrent做成绿色版
- 把java做成绿色软件
- 把图标做成字体
- 把U盘做成系统盘
- 把C++类做成dll
- 把项目做成jar包
- Mac端 查看QQ下载的视频路径
- 2017_12_15 js获取项目路径,js调用问题,jsp获取js传递url中参数
- SpringCloud(第 052 篇)CentOS7 安装 Docker 以及常用操作命令讲解
- 使用react时的ajax传参问题
- this作用域
- 如何把淘抢购做成JSON接口(二)
- 呵护儿童安全——远离红黄蓝,远离七座伪MPV!
- 听见丨谷歌DeepMind科学家黄士杰:已离开AlphaGo团队AI芯片初创团队ThinkForce完成4.5亿元A轮融资
- 基于FMC接口的Xilinx Kintex-7 FPGA K7 XC7K325T PCIeX8 接口卡
- 矢量切片(Vector tile)
- 分音塔科技张明:智能翻译的路要怎么走
- Android那些坑
- ios-返回键侧滑实现
- thinkphp 文件上传保存错误!