美文网首页
Java 简单爬取妹子图片

Java 简单爬取妹子图片

作者: nameless_ | 来源:发表于2018-09-19 14:33 被阅读0次

    闲来无事想爬点图片来测试,结果网上找不到有效的Java爬妹子图的,那就没办法了 只好自己写个自己玩

    前言

    ==

    使用的是Jsoup解析html

    Jsoup是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据

    环境

    ==

    eclipse jdk1.7

    功能

    ==

    • 根据每个大分类进行全部下载 自动翻页
    • 根据每个分类页面下载 自动翻页
    • 根据每个图片组下载这一组的所有图片 自动翻页
    • 根据标题分类文件夹

    开始

    ==

    查看网站源码


    打开妹子图 网站,点开一组图片,F12 可以看到 图片地址是直接以明文方式传到前台,直接根据地址就能拿到图片

    7`5C}1J4FLEL7~`(]JM_X79.png7`5C}1J4FLEL7~`(]JM_X79.png

    再看网站结构 只要获取 class:main-image 就能根据 class 获取到img ,因为这个class里面只有一个img

    标签,所以直接获取 img ,根据 img 标签 获取它的 src 属性 直接得到图片地址 顺便获取alt 标题 做分类

    QQ截图20180904164322.pngQQ截图20180904164322.png

    代码部分

    --

    /**
    
    * @Title: getImgTotalNumber
    
    * @Description: 获取每组图片总数,并获取每个图片地址
    
    * @param url    参数
    
    * void  返回类型
    
    * @throws
    
    */
    
    public static void getEachGroup(String url){
    
    Document doc = meizitu.getDocument(url);
    
    Elements pageNumberHtml = doc.select("[class=pagenavi]");
    
    Elements a = pageNumberHtml.select("a");
    
    int pageNumber = Integer.parseInt(a.get(a.size()-2).select("span").text());
    
    for (int i = 1; i <= pageNumber; i++) {
    
    String groupingurl = url+"/"+i;
    
    Document imgdoc = meizitu.getDocument(groupingurl);
    
    Elements select = imgdoc.select("[class=main-image]");
    
    Elements img = select.select("img");
    
    String imgurl = img.attr("src"); //下载图片地址
    
    String Suffix = imgurl.substring(imgurl.lastIndexOf("."));
    
    String title = img.attr("alt");//标题
    
    String name = title+"_"+i+Suffix; //文件名
    
    String savePath = path+title; //保存文件地址
    
    try {
    
    DownloadImage.download(imgurl, name, savePath,restTime);
    
    } catch (Exception e) {
    
    e.printStackTrace();
    
    }
    
    }
    
    }
    

    同理,在获取大分类页数、每页的个数 然后逐一下载

    import java.io.IOException;
    
    import org.jsoup.Jsoup;
    
    import org.jsoup.nodes.Document;
    
    import org.jsoup.select.Elements;
    
    public class meizitu {
    

    private static meizitu meizitu = new meizitu();

    public static String path = "F:/meizitu/"; //存放文件地址

    public static long restTime = 3000; //休眠时间 (豪秒)不能太快

    public static void main(String[] args) {

    //获取大分类下全部 如:http://www.mzitu.com/xinggan/
    
    getClassification("http://www.mzitu.com/xinggan/");
    
    //获取指定页数 如://http://www.mzitu.com/mm/page/2/
    
    // getEachpage("http://www.mzitu.com/mm/page/2/");
    
    //获取每组图片 如:http://www.mzitu.com/148600
    
    // getEachGroup("http://www.mzitu.com/148600");
    

    }

    /**
    
    * @Title: getClassification
    
    * @Description: 大分类 
    
    * @param url    参数
    
    * void  返回类型
    
    * @throws
    
    */
    
    public static void getClassification(String url){
    
    Document doc = meizitu.getDocument(url);
    
    // 获取总页数html
    
    Elements PageCountHtml = doc.select("[class=page-numbers]");
    
    //当前大分类总页数
    
    int PageCount = Integer.parseInt(PageCountHtml.get(PageCountHtml.size()-1).text());
    
    for (int i = 1; i <= PageCount; i++) {
    
    getEachpage(url+"/page/"+i+"/");
    
    }
    
    }
    
    /**
    
    *
    
    * @Title: getEachpage
    
    * @Description: 获取每页组总数,并获取每个图片地址
    
    * @param url    参数
    
    * void  返回类型
    
    * @throws
    
    */
    
    public static void getEachpage(String url){
    
    Document doc = meizitu.getDocument(url);
    
    Elements postlist = doc.select("[class=postlist]");
    
    Elements liCount = postlist.select("li");
    
    for (int i = 0; i < liCount.size(); i++) {
    
    Elements a = liCount.get(i).select("span").select("a");
    
    String aurl = a.attr("href");
    
    getEachGroup(aurl);
    
    }
    
    }
    

    /**

    • @param url

    •        访问路径
      
    • @return

    */

    public Document getDocument(String url) {

    try {

    // 5000是设置连接超时时间,单位ms

    return Jsoup.connect(url).timeout(5000).get();

    } catch (IOException e) {

    e.printStackTrace();

    }

    return null;

    }

      }
    

    获取到图片地址后 进行下载

    import java.io.File; 
    
    import java.io.FileOutputStream; 
    
    import java.io.InputStream; 
    
    import java.io.OutputStream; 
    
    import java.net.URL; 
    
    import java.net.URLConnection; 
    
    public class DownloadImage { 
    
        public static void download(String urlString, String filename,String savePath,long restTime) throws Exception { 
    
        Thread.sleep(restTime);
    
            // 构造URL 
    
            URL url = new URL(urlString); 
    
            // 打开连接 
    
            URLConnection con = url.openConnection(); 
    
            //设置请求超时为5s 
    
            con.setConnectTimeout(5*1000); 
    
            //防止简单反扒
    
            String referer = url.getProtocol()+"://"+url.getHost();
    
            con.setRequestProperty("Referer", referer);
    
            // 输入流 
    
            InputStream is = con.getInputStream(); 
    
            // 1K的数据缓冲 
    
            byte[] bs = new byte[1024]; 
    
            // 读取到的数据长度 
    
            int len; 
    
            // 输出的文件流 
    
          File sf=new File(savePath); 
    
          if(!sf.exists()){ 
    
              sf.mkdirs(); 
    
          } 
    
          OutputStream os = new FileOutputStream(sf.getPath()+"\\"+filename); 
    
            // 开始读取 
    
            while ((len = is.read(bs)) != -1) { 
    
              os.write(bs, 0, len); 
    
            } 
    
            System.out.println(sf.getPath()+"\\"+filename+"下载完成");
    
            // 完毕,关闭所有链接 
    
            os.close(); 
    
            is.close(); 
    
        }     
    
    } 
    

    完成

    ==

    想了解更多更多请关注 我的博客

    源码已上传至 github / 码云


      版权声明:本文为原创文章,版权归本站所有,欢迎分享本文,转载请保留出处!
    

    相关文章

      网友评论

          本文标题:Java 简单爬取妹子图片

          本文链接:https://www.haomeiwen.com/subject/vcdinftx.html