如何把淘抢购做成JSON接口(一)
来源:互联网 发布:jsp 循环调用java方法 编辑:程序博客网 时间:2024/04/29 23:53
如何把淘抢购做成JSON接口(一)
前言
最近用Java写了一个爬取淘抢购的程序趁着写博客,整理一遍代码并将其制作成一个Json接口,下面记录一下这个过程。
- 第一步,确定需要使用到的Jar包
淘抢购网址 https://qiang.taobao.com/
- 第二步,需求分析
如图示,我们需要从网页源代码中抽取出这块所有的商品项,而后封装成一个类
从图中我们可以分析出我们需要封装好这样一个类
- 第三步编写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)); }}
至此已经完成数据的抓取
返回值如下图所示 后续将继续做成接口
阅读全文
0 0
- 如何把淘抢购做成JSON接口(一)
- 如何把淘抢购做成JSON接口(二)
- 如何把EXE文件做成windows服务
- 如何把表格做成热点图
- 把视频中的一小段做成GIF动图
- 如何能把垃圾网站做成专业网站
- 如何把自己做好的系统做成一个安装软件
- PS如何把图片做成圆角的
- 如何把一张照片用 Photoshop 做成动画背景效果?
- C#如何把可执行程序做成windows服务
- 如何把JAVA程序做成Windows服务,并开机运行
- 用PS如何把图片做成圆角的?
- 把PC做成CEPC
- 把uTorrent做成绿色版
- 把java做成绿色软件
- 把图标做成字体
- 把U盘做成系统盘
- 把C++类做成dll
- Java学习笔记-Compare
- Java--集合--Collection--概述
- 原生js实现拖拽与缩放等包含js设置样式与五子棋等
- 一个提升n倍效率的写作工具,我咋不知道?
- 浮点数的二进制表示
- 如何把淘抢购做成JSON接口(一)
- 八种排序方法(二)——冒泡排序
- 杭电acm P2008
- 财富自由?五年后为什么他月入十万,而我月入六千
- 宣传部视频编辑组孙诗月 2017.12.11-2017.12.15
- python3中使用GeoIP来查找IP信息
- HTML标签学习记录
- 实验3 路由器的基本配置和远程登录
- Cookies 和 Session的区别