分享

Java|分页爬取表情包图片

 算法与编程之美 2020-08-08

1 前提简介

前面讲过了如何对文章小说的分目录,分章节爬取保存,下面将讲述对当前热门的表情包进行分页,分类爬取。

2 简单查看

下面是一个表情包网站的首页,并且分了很多类别。

图2.1 表情包首页

而且有很多页数。

图2.2 不同页

经过观察,每一页的url只有最后代表页数的数字变了,那就可以从这里下手,多页爬取。

图2.3 区别

3 代码及注释

下面就来看看详细的代码和注释吧,还是温馨提醒注意xpth以及url书写正确哦。

//引入的包,略

public  class GetPicture1 implements PageProcessor {

    //定义一个变量用来表示需要下载的总页数

    private static int size = 3;

    //定义一个变量用来表示起始页

    private static int number = 1;

    //声明一个用来存储需要下载的url路径的集合

    private static List<String> listUrl  = new ArrayList<String>();

    //对所要爬取的页面进行相关设置

    private Site site = Site.me()

            .setCharset("utf-8")

            .setSleepTime(1000)//休眠时间

            .setTimeOut(1000);//超时时间

    @Override

    public Site getSite() { return site; }

    //爬取数据的逻辑

    @Override

    public void process(Page page) {

        //获取url

        Selectable url = page.getUrl();

        //url匹配

         if(url.regex("https://www./article/list/\\?page=\\d*").match()){//列表页

            //获取页面

            Html html = page.getHtml();

            //解析页面获取相关信息(获取所有的标题url)

            List<String> urls =  html.xpath("[@class='container_']/div[1]/div[1]/div[2]/a").links().all();

            if(number > size + 1){

                return;

            }

            urls.add(listUrl.get(number -  1));

            //下一页

            number++;

            //将连接放入待爬取序列

            page.addTargetRequests(urls);

        }else{

            //爬取图片   获取页面

            Html html = page.getHtml();

            //获取表情包组的名称

            String title =  html.xpath("[@class='container_']/div[1]/div[1]/div[2]/li/div[1]/h1/a/text()").toString();

            //获取表情包图片的链接//

            List<String> pictureUrl =  html.xpath("[@class='container_']/div[1]/div[1]/div[2]/li/div[2]/div/table/tbody/tr/td[1]/a/img/@src").all();

            //下载到本地

            downPicture(pictureUrl,title);

        }

    }

    //将图片下载到本地

    private void  downPicture(List<String> pictureUrl, String title) {

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

            //获取每一张图片连接

            String link = pictureUrl.get(i);

            //做一个非空判断

            if(link == null || link ==  ""){

                return;//结束

            }

            try {

                //将连接字符串封装成一个URL对象

                URL url = new URL(link);

                //获取网络连接

                HttpURLConnection conn =  (HttpURLConnection)url.openConnection();

                //获取一个输入流

                InputStream in =  conn.getInputStream();

                //指定图片目录存储的位置

                File file = new  File("D:\\doutula\\" + title);

                //判断目录是否存在

                if(! file.exists()){

                    //创建多级目录

                    file.mkdirs();

                }

                //自定图片的位置

                File file2 = new File("D:\\doutula\\"  + title + "\\" + i + ".jpg");

                //输出流

                FileOutputStream fos = new  FileOutputStream(file2);

                ByteArrayOutputStream  outStream = new ByteArrayOutputStream();

                //定义一个缓冲区

                byte[] buf = new byte[1024];

                //定义一个标记用于判断有没有读完

                int len = 0;

                //循环读取

                while((len = in.read(buf)) !=  -1){

                     outStream.write(buf,0,len);

                }

                System.out.println("下载完毕");

                //写出到本地

                 fos.write(outStream.toByteArray());

                //关闭资源

                in.close();

                outStream.close();

                fos.close();

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    }

    //生成所有下载页的url列表,通过size控制的页数

    public static List<String>  listUrl(int num){

        List<String> list = new  ArrayList<String>();

        //循环往列表中添加url

        for(int i=1;i<=num;i++){

             list.add("https://www./article/list/?page=" +  (i+1));

        }

        return list;

    }

    //主程序的入口、线程

    public static void main(String[] args) {

        //获取所有需要下载页的url

        listUrl = listUrl(size);

        Spider.create(new  GetPicture1()).thread(1).addUrl("https://www./article/list/?page=1").run();

    }

}

这样,就能拿到大量的热门表情包了,只要敢去“new”,“Java”都能感想敢做。


END

主  编   |   张祯悦

责  编   |   黄晓锋

 where2go 团队


微信号:算法与编程之美          

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多