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

来源:互联网 发布:jsp 循环调用java方法 编辑:程序博客网 时间:2024/04/29 23:53

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

前言
最近用Java写了一个爬取淘抢购的程序趁着写博客,整理一遍代码并将其制作成一个Json接口,下面记录一下这个过程。

  • 第一步,确定需要使用到的Jar包
Jar 描述 Edkitty 我制作的一个工具包,封装了一些常用方法 Gson Google解析Json的一个开源框架,在我们这个项目中用于将对象转化为Json

淘抢购网址 https://qiang.taobao.com/


  • 第二步,需求分析

    抢购分析图

    如图示,我们需要从网页源代码中抽取出这块所有的商品项,而后封装成一个类
    从图中我们可以分析出我们需要封装好这样一个类

名 对应类成员属性 商品名 title 商品描述 subtitle 商品图片 img 商品原价 originalPrice 抢购价 promoPrice 左上角图片抢购标志 mark 商品详情页URL url 抢购进度百分比 percent 已被抢购多少件 num
  • 第三步编写Item类
public class Item {    //商品名    private String title;    //商品描述    private String subtitle;    //原价    private String originalPrice;    //抢购价    private String promoPrice;    //抢购百分比    private String percent;    //抢购数量    private String num;    //左上角图片    private String mark;    //商品图片    private String img;    //详情页URL    private String url;}

为了节省版面这里省略get和set方法

  • 第四步,编写功能
import com.google.gson.Gson;import com.google.gson.GsonBuilder;import java.io.IOException;import java.net.URLDecoder;import java.util.ArrayList;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern;public class CheapShop {    public static void main(String[] args) throws IOException {        //第一步 拿到淘抢购网页HTML        String content = KitSet.getInstance().Get("https://qiang.taobao.com/");        /**         * 下面是为了提取这个网页中的信息需要用到的正则表达式         */        //从完整的HTML中提取出抢购商品的部分的正则        Pattern ITEMS = Pattern.compile("<div class=\"qg-limit-list\" data-spm=\"[\\d]+\">(.*)</div>.*<div class=\"trigger-btn\" style=\"display:none;\">");        //提取商品名的正则        Pattern ITEM_NAME = Pattern.compile("<p class=\"des\">(.*)</p>.*<p class=\"subtitle\">");        //提取商品详情页URL的正则        Pattern HREF = Pattern.compile("<a href=\"(.*)\" target=\"_blank\" class=\"qg-item qg-ing\">");        //提取左上角标志的正则        Pattern MARK = Pattern.compile("src=\"(.*\\.png)\" class=\"qg-img-tag\">");        //提取商品图片的正则        Pattern IMGS = Pattern.compile("data-ks-lazyload=\"(.*\\.[a-z]{3})\" src=.*");        //提取商品描述的正则        Pattern SUBTITLE = Pattern.compile("<p class=\"subtitle\">([[\\w]*[\\d]*[\\W]+[\\d]*]+)</p>");        //提取商品原价的正则        Pattern ORGPRICE = Pattern.compile("<i>[\\d]+[<span>\\.[\\d]+</span>]*</i>");        //提取商品抢购价的正则        Pattern PROPRICE = Pattern.compile("<em>[\\d]+[<span>\\.[\\d]+</span>]*</em>");        //提取抢购百分比的正则        Pattern PRENCENT = Pattern.compile("<span class=\"percent\">(已抢购[\\d]+%)</span>");        //提取已经被抢购的数量的正则        Pattern NUM = Pattern.compile("<span class=\"num\">(已抢[\\d]+件)</span>");        //正则部分完毕        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();        //最后一步 输出Json        System.out.println(gson.toJson(items));    }}

至此已经完成数据的抓取

返回值如下图所示 后续将继续做成接口

接口效果圖

原创粉丝点击