Java爬虫案例(一)——5)实现数据抓取

Java爬虫案例(一)——5)实现数据抓取

这是该案例中的最后一步,爬取数据并进行解析获取自己所要的数据
Java爬虫案例(一)——5)实现数据抓取_第1张图片

package com.zzdreamz.task;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.zzdreamz.pojo.Item;
import com.zzdreamz.service.ItemService;
import com.zzdreamz.util.HttpUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;

@Component
public class ItemTask {

    @Autowired
    private HttpUtils httpUtils;

    @Autowired
    private ItemService itemService;

    private static final ObjectMapper MAPPER = new ObjectMapper();

    //当下载任务完成后,间隔多长时间进行下一次的任务
    //查看搜索页面的地址,会发现有page参数来实现页码的控制
    @Scheduled(fixedDelay = 100*1000)
    public void itemTask() throws Exception {
        String url = "https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc" +
                "=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=%E6%89%8B%E6%9C%BA&s=57&click=0&page=";

        //按照页码对手机的搜索结果进行遍历
        for (int i = 1; i < 10; i +=2) {
            String html = httpUtils.doGetHtml(url + i);

            //解析页面,获取商品数据并储存
            this.parse(html);

        }

        System.out.println("手机数据抓取成功");
    }

    //解析页面,获取商品数据并储存
    private void parse(String html) throws Exception {
        //解析html获取Document对象
        Document doc = Jsoup.parse(html);

        //获取spu
        Elements spuEles = doc.select("div#J_goodsList > ul > li");

        for (Element spuEle : spuEles) {
            //获取sku
            long spu = Long.parseLong(spuEle.attr("data-spu"));

            //获取sku集合
            Elements skuElems = spuEle.select("li.ps-item");

            for (Element skuElem : skuElems) {
                //获取sku
                long sku = Long.parseLong(skuElem.select("[data-sku]").attr("data-sku"));

                //根据sku查询商品数据
                Item item = new Item();
                item.setSku(sku);

                List<Item> list = this.itemService.findAll(item);

                if (list.size() > 0) {
                    //如果商品存在,就进行下一个循环,该商品不保存,因为已存在
                    continue;
                }

                //设置商品的spu
                item.setSpu(spu);

                //获取商品的详情url
                String itemUrl = "https://item.jd.com/"+sku+".html";
                item.setUrl(itemUrl);

                //获取商品图片
                String picUrlStr = skuElem.select("img[data-sku]").first().attr("data-lazy-img");
                //部分商品图片规则不一样,不想查日志找那部分不一样,就直接跳过了
                if (picUrlStr == null || "".equals(picUrlStr)) {
                    continue;
                }
                String picUrl = "https:" + picUrlStr;
                picUrl = picUrl.replace("/n9/","/n1/");
                String picName = this.httpUtils.doGetImage(picUrl);
                item.setPic(picName);

                //获取商品价格
                String priceJson = this.httpUtils.doGetHtml("https://p.3.cn/prices/mgets?skuIds=J_" + sku);
                double price = MAPPER.readTree(priceJson).get(0).get("p").asDouble();
                item.setPrice(price);


                //获取商品标题
                String itemInfo = this.httpUtils.doGetHtml(itemUrl);
                String title = Jsoup.parse(itemInfo).select("div.sku-name").text();
                item.setTitle(title);

                item.setCreated(new Date());
                item.setUpdated(item.getCreated());

                //保存商品到数据库中
                this.itemService.save(item);

            }
        }

    }
}

将该程序完成之后就可以启动项目抓取数据啦,可以看自己的数据库或者保存图片的目录判断是否成功。

你可能感兴趣的:(Java爬虫入门到精通)