24 实现爬虫功能2

时间:2023-1-21    作者:老大夫    分类: 传智JAVA爬虫学习笔记


因为JD的商品页每页第一个是没有spu的,所以我把返回空串的跳过了

ItemTask

package cn.itcast.jd.task;

import cn.itcast.jd.pojo.Item;
import cn.itcast.jd.service.ItemService;
import cn.itcast.jd.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;

    //当下在任务完成后,间隔多长时间进行性下一次的任务
    @Scheduled(fixedDelay = 100*1000)
    public void IteamTask()throws Exception{
        //声明需要解析的初始地址
        String url ="https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&suggest=1.his.0.0&wq=%E6%89%8B%E6%9C%BA&pvid=35f2421906a34cf3b78de4ab68050965&s=56&click=0&page=";

        //按照页面对手机的搜索结果进行遍历
        for (int i = 1; i < 10; i=i+2) {
            String html = httpUtils.doGetHtml(url + i);
            //使用解析页面获取商品数据并存储
            this.parse(html);
        }

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

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

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

        for (Element spuEle : spuEles) {

            //如果spu为空就跳过,进入下一次循环
            if( spuEle.attr("data-spu") == null || spuEle.attr("data-spu") == "" ){
                continue;
            }

            //获取spu
            long spu = Long.parseLong(spuEle.attr("data-spu"));

            //获取sku信息
            Elements skuEles = spuEle.select("li.ps-item");

            for (Element skuEle : skuEles) {
                //获取sku
                long sku = Long.parseLong(skuEle.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 picUrl ="https:" + skuEle.select("img[data-sku]").first().attr("data-lazy-img");
                picUrl = picUrl.replace("/n7/","/n1/");

                //下载图片
                String picName = this.httpUtils.doGetImage(picUrl);

//                item.setPic();
//
//                //获取商品的价格
//                item.setPrice();
//
//                //获取商品的标题
//                item.setTitle();

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

            }
        }

    }
}


扫描二维码,在手机上阅读

推荐阅读: