Java 简单爬取妹子图片

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

前言

==

使用的是Jsoup解析html

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

环境

==

eclipse jdk1.7

功能

==

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

开始

==

查看网站源码


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

7`5C}1J4FLEL7~`(]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 / 码云


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

你可能感兴趣的:(Java 简单爬取妹子图片)