java爬虫入门实战

网络爬虫

     网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫

     爬虫的实质,就是获取静态数据,并对此进行分析从而获取对我们有价值的数据或者做保存展示所用。数据的格式有json,xml,html等等,在此我们就分析某东的html数据!

爬取的任务

 

操作流程

首先我们根据某东的分类首页1.获取全部的三级分类菜单的url--2.获取每个商品每个页面的url--3.获取每个商品的信息

1.我们分析分类首页会发现所有的分类菜单的url都在  .items dl dd a 标签中 

利用jsoup跨域请求获取url加载的Document对象.使用选择器语法来选择页面元素(其实和jquery选择器规则相同)

//1.获取全部三级分类菜单
    public static List <String> getItemCat3List(String url) {

        List <String> itemCat3List = new ArrayList <String>();
        try {
            //获取页面对象和数据
            Elements elements = Jsoup.connect(url).get().select(".items dl dd a");
            for (Element element : elements) {
                String href = element.attr("href");
                if (href.startsWith("//list.jd.com/list.html?cat=")) {   //该链接才满足个数
                    String item3Url = "https:" + href;
                    itemCat3List.add(item3Url);  //https://list.jd.com/list.html?cat=
                    logger.info("获取的数据为" + item3Url);
                }
            }
        } catch (Exception e) {
            //目的放爬虫程序正常的执行
            e.printStackTrace();
            logger.info(e.getMessage() + url);
        }
        logger.info("获取有效连接数为:" + itemCat3List.size());
        return itemCat3List;
    }
    //测试代码
    public static void main(String[] args) {
        String url = "https://www.jd.com/allSort.aspx";        //某东分类首页
        //获取全部的三级分类菜单
        List <String> itemCat3List = getItemCat3List(url);

    }

2.我们得拿到每个商品的页数,分析发现在  #J_topPage span i 标签中有页数,拼接上页数就是每页的具体的url

 //2.获取每个分类商品每一页商品的url
    //先获取每页的总数
    //https://list.jd.com/list.html?cat=1319,6313,11235
    //https://list.jd.com/list.html?cat=1713,4855,4859&page=3

    public static List <String> itemCat3ListByPage(List <String> itemCat3List) {
        List <String> itemCat3ListByPage = new ArrayList <String>();

        //获取每一个三级商品分类的url
        for (String itemCat3Url : itemCat3List) {

            try {
                Element element = Jsoup.connect(itemCat3Url).get().select("#J_topPage span i").get(0);

                //表示获取每个连接下的总页面
                int pageCount = Integer.parseInt(element.text());
                for (int i = 1; i <= pageCount; i++) {
                    String pageUrl = itemCat3Url + "&page=" + i;

                    logger.info("获取每页url:" + pageUrl);
                    itemCat3ListByPage.add(pageUrl);
                }
            } catch (Exception e) {
                logger.info(e.getMessage());
                logger.info("有问题的链接为:" + itemCat3Url);
            }
        }
        logger.info("总记录数:" + itemCat3ListByPage.size());
        return itemCat3ListByPage;
    }

扫描二维码关注公众号,回复: 3309027 查看本文章

3.根据每个页面的url获取每个商品的URL

 //3.获取每页中全部商品的url
    public static List <String> getItemUrl(List <String> itemCat3ListByPage) {
        ArrayList <String> itemListUrl = new ArrayList <String>();

        for (int i = 0; i < itemCat3ListByPage.size(); i++) {       

            try {
                Elements elements = Jsoup.connect(itemCat3ListByPage.get(i)).get().select("#plist ul li .p-img a");

                //循环遍历每一个商品信息
                for (Element element : elements) {
                    String itemHref = "https:" + element.attr("href");  //获取url

                    logger.info("商品的url:" + itemHref);
                    itemListUrl.add(itemHref);
                }
            } catch (Exception e) {
                logger.info(e.getMessage());
                logger.info("错误的url为:" + itemCat3ListByPage.get(i));
            }
        }

        logger.info("商品的总数为:" + itemListUrl.size());
        return itemListUrl;

    }

4.拿到具体商品的url 继续同上面的操作即可拿到价格,卖点,库存,图片等商品具体信息.具体代码文后链接有提供.当然你也可以截取ajax请求拿到价格,商品id等相关信息.

 //获取商品的价格信息
    public static Long getItemPrice(String url) {
        Long itemId = getItemId(url);    //url:https://item.jd.com/12324671522.html
        String priceUrl = "https://p.3.cn/prices/mgets?callback=jQuery6661675&type=1&area=1_72_2799_0&pdtk=&pduid=1476773839&pdpin=&pin=null&pdbp=0&skuIds=J_" + itemId + "&ext=11000000&source=item-pc";

        try {
            String JSON = Jsoup.connect(url).ignoreContentType(true).execute().body();
            String jsonTemp = JSON.substring(JSON.indexOf("{"), JSON.lastIndexOf("}") + 1);
            JsonNode jsonNode = objectMapper.readTree(jsonTemp);
            Long price = jsonNode.get("op").asLong();
            return price;
        } catch (Exception e) {
            logger.info(e.getMessage());
            return 0L;
        }
    }

好啦,到此大功告成,来看看我们的成果吧!代码中还附加某电影平台的爬取哦!

作者简介:就职于甜橙金融信息技术部,负责java后端开发工作,喜欢研究新的技术服务于业务需求,保证服务的高并发,高可用,高性能.

完整代码:https://download.csdn.net/download/qq_28953809/10598665

猜你喜欢

转载自blog.csdn.net/qq_28953809/article/details/81605762