Java 简单爬取妹子图片

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

前言

使用的是Jsoup解析html

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

环境

eclipse jdk1.7

功能

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

开始

查看网站源码

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

7<code>5C}1J4FLEL7~</code>(]JM_X79.png

再看网站结构 只要获取 class:main-image 就能根据 class 获取到img ,因为这个class里面只有一个img
标签,所以直接获取 img ,根据 img 标签 获取它的 src 属性 直接得到图片地址 顺便获取alt 标题 做分类

QQ截图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 / 码云


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

发表留言

人生在世,错别字在所难免,无需纠正。

icon_mrgreen.gificon_neutral.gificon_twisted.gificon_arrow.gificon_eek.gificon_smile.gificon_confused.gificon_cool.gificon_evil.gificon_biggrin.gificon_idea.gificon_redface.gificon_razz.gificon_rolleyes.gificon_wink.gificon_cry.gificon_surprised.gificon_lol.gificon_mad.gificon_sad.gificon_exclaim.gificon_question.gif