我喜欢你眼中的星辰,喜欢你轻唤我的名字

图片小爬虫


申明:以下爬虫只是作为学习技术记录,其目的只是了解相关技术,并未将其作为工具进行使用

引言:这些爬虫只是单纯的通过图片链接进行爬取,因此这些图片都是经过处理过的,图片一般很小,像素点和清晰度都是我不能接受的,因此对于图片,在下一般是通过提供下载功能的图片网站进行收集,遇到喜欢的随手下一下。

因为以前写过一点点,因此这份小代码就直接搬运了以前的代码进行了修改,花费的时间不多。

这些代码还有很多地方可以完善,同时有很多东西是可以深入学习的,比如jsoup的selector,css选择器,java中Map,Map的升级,集合等等,以及模块化编程,代码优化,算法思考等等,都说略懂皮毛,一想到这些就知道连皮都还没懂

唯美女生网站

唯美女生

  • 主要代码

    public static void main(String[] args) throws IOException, InterruptedException {
            Document pagedocu = requestDoc(request("https://www.wmgirl.com/"));
            // Classification-->分类
            Elements Classifications1 = pagedocu.select(".nav.navbar-nav.fright.nav-cate-pc.navbar-nav-box>li");
            Elements Classifications2 = pagedocu.select(".row>.col-md-2");
            LinkedHashMap<String,String> ClassificationMap = new LinkedHashMap<>();
            // 获取小姐姐分类 添加至Map字典之中
            for(Element Classification:Classifications1) {
                ClassificationMap.put(Classification.select("a").text(),Classification.select("a").attr("href"));
            }
            for(Element Classification:Classifications2) {
                ClassificationMap.put(Classification.select("a").text(),Classification.select("a").attr("href"));
            }
            // 从字典中去除无关选项
            ClassificationMap.remove("首页");
            ClassificationMap.remove("关于");
            ClassificationMap.remove("浏览历史");
            ClassificationMap.remove("周杰伦新歌");
            // System.out.println(ClassificationMap);
            // 选择下载的类型
            int i = 0;
            ArrayList<String> TypeData = new ArrayList<>();
            for(String key:ClassificationMap.keySet()) {
                i++;
                System.out.println("类型"+i+": "+key);
                TypeData.add(ClassificationMap.get(key));
            }
            System.out.print("请选择小姐姐类型(输入标号):");
            Scanner in = new Scanner(System.in);
            int choice = in.nextInt();
    
            // 访问类型对应的网址
            String ClassificationUrl = "https://www.wmgirl.com"+TypeData.get(choice-1);
            //System.out.println(ClassificationUrl);
            pagedocu = requestDoc(request(ClassificationUrl));
            // 提取网址中的每一组小姐姐对应的网址
            Elements GroupUrls = pagedocu.select(".waterfall.waterfall .item");
            ArrayList<String> GroupUrlsList = new ArrayList<>();
            // 得到每组图片的标题图片的Url
            /*for(Element PictureUrl :PictureUrls) {
                Urls.add(PictureUrl.select(".item-content.tab-content a img").attr("src"));
            }*/
            ArrayList<String> GroupUrlsList2 = new ArrayList<>();
            for (Element GroupUrl:GroupUrls) {
                GroupUrlsList.add(GroupUrl.select(".item-content.tab-content a").attr("href"));
            }
            int j = 0;
            for(String data : GroupUrlsList) {
                String GroupUrl = "https://www.wmgirl.com"+data;
                System.out.println("请求目标主页Url:"+GroupUrl);
                pagedocu = requestDoc(request(GroupUrl));
                // 获取最终图片下载地址
                Elements FinalUrls = pagedocu.select(".picbox>div");
                ArrayList<String> FinalUrlsList =  new ArrayList<>();
                System.out.println("第"+(j+1)+"组图片:");
                int numflag = 1;
                for(Element FinalUrl : FinalUrls) {
                    FinalUrlsList.add(FinalUrl.select("img").attr("src"));
                    System.out.println("下载的第"+numflag+"张图片网址:"+FinalUrl.select("img").attr("src"));
                    numflag++;
                }
                j++;
                //下载
                System.out.println("--------------------------------------------------------------------------------");
                System.out.println("开始下载.....");
                Download(FinalUrlsList,TypeData.get(choice-1),j);
                System.out.println("--------------------------------------------------------------------------------");
            }
        }
    
  • 演示画面

    JDK环境:jdk-14

    JDK1.8环境可能无法运行,可以下载上面的jdk-14然后修改环境变量

image-20210428213227425

  • 代码存在的问题(有时间的可以自己改一下)

    • 1)未设置代理ip和代理池—>因此采用了延时爬取,每一次爬取过后会停止十秒左右
    • 2)下载的图片是被处理过的
    • 3)对于爬虫异常未作处理,健壮性弱
      1. 代码是怎么方便怎么来,菜鸡鸡中鸡水平,图一乐呵
  • 测试爬取结果(注意图片大小)

    image-20210428214841591

  • 百度云盘

    已经打包成jar文件,可以下载jar文件查看完整代码,其中使用到的jar依赖包也可以看到

必应壁纸

这份代码和上面是一样的,准确来讲上面的代码是将下面的代码改了一下,下面的代码要更早一点面世

必应壁纸是提供了下载功能的,所以如果是学习的话采用上面的代码学习即可,感谢必应作者(攻城狮小哥一枚)为我们提供的必应壁纸,下面的代码仅仅学习使用,不用做爬取工具。

image-20210429004444571

  • 部分代码
        String StrUrl = "https://bing.ioliu.cn";
        for (int i = startNum; i < startNum + NumNum; i++) {
            //请求主页时候挂起5s
            System.out.println("正在请求主页中...." + "请等待5s");
            sleep(5000);
            HttpEntity PageHome = request("https://bing.ioliu.cn/?p=" + i);
            System.out.println("请求成功,接下来开始下载这一页图片...");
            //请求的html文档
            String Pagehtml = EntityUtils.toString(PageHome, "utf-8");
            Document pagedocu = Jsoup.parse(Pagehtml);

            //拿取请求页面的图片相关数量信息
            String Numdiv = pagedocu.select(".page span").first().text();//结果是1 / 133 字符串
            String[] num = Numdiv.split(" ");//以空格分割成字符串数组

            //拿取图片的相关其他信息存储在数组Names中
            ArrayList<String> Names = new ArrayList<String>();
            Elements Namedivs = pagedocu.getElementsByClass("description");
            for (Element Namediv : Namedivs) {
                String name = Namediv.select("h3").text();
                String[] Name = name.split("\\(");
                Names.add(Name[0]);
            }
            //设置动态数组存储url
            ArrayList<String> Urls = new ArrayList<String>();
            //获取url所在的所有列表
            Elements containers = pagedocu.getElementsByClass("item");
            for (Element container : containers) {
                Elements item = container.select(".card.progressive");
                Urls.add(item.select("a").attr("href"));
            }

            //写入文件中 //父路径
            File file = new File("C:\\Users\\31327\\Desktop", "必应壁纸");
            //判断文件夹是否存在
            if (!file.exists()) {
                file.mkdir();
            }
            int cnt = 1;
            for (String str : Urls) {
                 //url中需要替换的目标字符串
                String strobeNam = "home_" + i;
                str = str.replace(strobeNam, "download");
                System.out.println("图片网址是:" + StrUrl + str);

                //文件子路径
                String ChildFile = i + "-" + cnt + "(" + num[2] + ")-" + Names.get(cnt - 1) + ".jpg";
                //时间间隔
                int time = ran();

                File Fileuser = new File(file, ChildFile);
                //判断图片是否存在
                if (!Fileuser.exists()) {
                    //第一种请求 Httpclient请求
                    HttpEntity httpEntity1 = request(StrUrl + str);
                    //写入文件夹
                    InputStream in = httpEntity1.getContent();
                    FileUtils.copyInputStreamToFile(in, Fileuser);

                    //打印下载信息
                    System.out.println("第" + num[0] +"页"+i+"-"+cnt+"下载成功,总计有" +num[2] + "页,下次时间间隔是" + time + "s");
                    sleep(time * 1000);
                } else {
                    System.out.println("第" + num[0] + "页" + i + "-" + cnt + "张图片已存在"/*+",本次时间间隔是"+(time*1000)*/);
                }
                cnt++;
            }
        }
        System.out.println("下载完成!");
  • 测试结果

image-20210429004258127

  • 附:jar文件我就不公布了,代码差不多已经全部放出来了。

其他

  • 另外推荐几个壁纸网站

别问,问就是没爬过,只是简单测试过,

  • 全景壁纸

  • 我最常逛的壁纸网站

  • 知乎

    • 知乎的话,要复杂一点,但是也更好玩一点
    • 需要携带cookies,同时直接使用网址是无法拿到图片的,必须去js文件里面结合网页源代码然后进行处理才能拿到图片网址
    • 好玩的点就在于知乎的每一篇回答的网址都只有一串数字不同,因此写完一个爬虫后,可以弄出来一个模板,当需要访问哪篇回答里的图片时只需要将那串数字输入即可

代码不发出来了,和上面整体思路是一样的。


文章作者: RemMeiko
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 RemMeiko !
评论
  目录