闲来无事想爬点图片来测试,结果网上找不到有效的Java爬妹子图的,那就没办法了 只好自己写个自己玩
前言
使用的是Jsoup解析html
Jsoup是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据
环境
eclipse jdk1.7
功能
- 根据每个大分类进行全部下载 自动翻页
- 根据每个分类页面下载 自动翻页
- 根据每个图片组下载这一组的所有图片 自动翻页
- 根据标题分类文件夹
开始
查看网站源码
打开妹子图 网站,点开一组图片,F12 可以看到 图片地址是直接以明文方式传到前台,直接根据地址就能拿到图片
再看网站结构 只要获取 class:main-image 就能根据 class 获取到img ,因为这个class里面只有一个img
标签,所以直接获取 img ,根据 img 标签 获取它的 src 属性 直接得到图片地址 顺便获取alt 标题 做分类
代码部分
/**
* @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();
}
}
完成
版权声明:本文为原创文章,版权归本站所有,欢迎分享本文,转载请保留出处!