Jsoup解析获取品花社图片

emmmm,闲着没事,想起了之前一个学长做的品花社的APP,刚好之前有了解Jsoup这个Java解析HTML的库,便花了三四个小时写了这个东西,把网站上大大小小的MM的图片都一股脑的爬到本地并做了简单的分装。

项目只是学习一下Jsoup的使用和网页解析相关知识,没其他意思。

全部的图片体积大概会是4个多G,修改代码里的MAX_PAGES_NUM变量值即可。

项目地址:https://github.com/Ganart/SpiderMM36D

关于品花社是什么,自己点进去看吧:http://www.mm36d.com/

结果看图吧:

代码在这儿:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class SpiderMM36D {

    static class SmallImg {
        String id;
        String url;
    }
    //截止到2018年6月21,这个值最大为102,
    static int MAX_APGES_NUM = 1;
    static String url = "http://www.mm36d.com/home/0/";
    //eg:http://www.mm36d.com/belle/0/0/id/2
    static String detailUrl = "http://www.mm36d.com/belle/0/0/";
    static List<String> oneMMDetailUrls = new ArrayList<>();
    static List<SmallImg> allImgObjects = new ArrayList<>();

    public static void main(String[] args) throws IOException {

        for (int i =1; i<=MAX_APGES_NUM;i++){
            gainOnePageElement(i);
        }
        System.out.println("完成图片链接解析,开始下载图片");
        for (int i=0;i<allImgObjects.size();i++){
            downloadSmallImg(allImgObjects.get(i));
            System.out.println("任务进度:"+((float)(i+1)/allImgObjects.size()));
        }

    }

    //获取小图
    public static void gainOnePageElement(int index){
        Document document = null;
        Elements elements = null;
        try {
            document = Jsoup.connect(url+index).get();
            if (document != null) {
                elements = document.getElementsByClass("re-size1-img");
                for (Element element:elements){
                    allImgObjects.add
                            (subMMImgUrl(element.getElementsByTag("img").toString()));
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            document = null;
            elements = null;
        }
    }

    //剪辑出图片的URL和id
    public static SmallImg subMMImgUrl(String tag){
        String head = "<img class=\"lazy\" data-original=\"";
        String withoutHead = tag.substring(head.length());
        String cleanUrl = withoutHead.substring(0,withoutHead.indexOf("\""));
        SmallImg smallImg = new SmallImg();
        smallImg.url = cleanUrl;
        String id = tag.substring(tag.indexOf("(")+1,tag.indexOf(")"));
        smallImg.id = id;
        return smallImg;
    }

    //剪辑出图片的url
    public static String subDetailImgUlr(String tag){
        String head = "<img class=\"lazy\" data-original=\"";
        String withoutHead = tag.substring(head.length());
        String cleanUrl = withoutHead.substring(0,withoutHead.indexOf("\""));
        return cleanUrl;
    }

    //下载小图
    public static void downloadSmallImg(SmallImg smallImg){
        if (smallImg.url.equals("")){
            return;
        }
        try {
            URL imgUrl = new URL(smallImg.url);
            String url = smallImg.url;
            BufferedInputStream bis = new BufferedInputStream
                    (imgUrl.openConnection().getInputStream());
            byte[] imgArray = new byte[2048*2048];
            int len = 0;
            File file = new File("E:\\SpiderMM36D\\mmImgs\\"+smallImg.id);
            file.mkdir();
            BufferedOutputStream bos =
                    new BufferedOutputStream
                            (new FileOutputStream(file.getAbsolutePath()+"\\"
                                    +smallImg.id+url.substring(url.lastIndexOf("."))));
            while ((len=bis.read(imgArray))!=-1){
                bos.write(imgArray,0,len);
            }
            bos.flush();
            bos.close();
            bis.close();
            gainDetailPageElement(smallImg.id);
            oneMMDetailUrls.clear();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //下载大图
    public static void downloadBigImg(String id,String picUrl,int i){
        if (picUrl.equals("")){
            return;
        }
        try {
            URL imgUrl = new URL(picUrl);
            BufferedInputStream bis = new BufferedInputStream
                    (imgUrl.openConnection().getInputStream());
            byte[] imgArray = new byte[4096*4096];
            int len = 0;
            File file = new File("E:\\SpiderMM36D\\mmImgs\\"+id);
            file.mkdir();
            BufferedOutputStream bos =
                    new BufferedOutputStream
                            (new FileOutputStream
                                    (file.getAbsolutePath()+"\\"+id+"_"+i+
                                            picUrl.substring(picUrl.lastIndexOf("."))));
            while ((len=bis.read(imgArray))!=-1){
                bos.write(imgArray,0,len);
            }
            bos.flush();
            bos.close();
            bis.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //每个MM对应的详情页
    public static void gainDetailPageElement(String id){
        Document document = null;
        Elements elements = null;
        try {
            document = Jsoup.connect(detailUrl+id+"/2").get();
            if (document != null) {
                elements = document.getElementsByClass("re-sizemm");
                for (Element element:elements){
                    oneMMDetailUrls.add
                            (subDetailImgUlr
                                    (element.getElementsByTag
                                            ("img").toString()));
                }
                for (int j = 0;j<oneMMDetailUrls.size();j++){
                    downloadBigImg(id,oneMMDetailUrls.get(j),j);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            document = null;
            elements = null;
        }
    }

}

Jsoup解析获取品花社图片的更多相关文章

  1. Java解析word,获取文档中图片位置

    前言(背景介绍): Apache POI是Apache基金会下一个开源的项目,用来处理office系列的文档,能够创建和解析word.excel.ppt格式的文档. 其中对word文档的处理有两个技术 ...

  2. (java)Jsoup爬虫学习--获取网页所有的图片,链接和其他信息,并检查url和文本信息

    Jsoup爬虫学习--获取网页所有的图片,链接和其他信息,并检查url和文本信息 此例将页面图片和url全部输出,重点不太明确,可根据自己的需要输出和截取: import org.jsoup.Jsou ...

  3. [java] jsoup 解析网页获取省市区域信息

    到国家统计局抓取数据, 到该class下解析数据 /** * jsoup解析网页 * @author xwolf * @date 2016-12-13 18:11 * @since V1.0.0 */ ...

  4. Jsoup问题---获取http协议请求失败 org.jsoup.UnsupportedMimeTypeException: Unhandled content type. Must be text/*, application/xml, or application/xhtml+xml.

    Jsoup问题---获取http协议请求失败 1.问题:用Jsoup在获取一些网站的数据时,起初获取很顺利,但是在访问某浪的数据是Jsoup报错,应该是请求头里面的请求类型(ContextType)不 ...

  5. Android利用Jsoup解析html 开发网站客户端小记。

    这些天业余时间比较多,闲来无事,想起了以前看过开发任意网站客户端的一篇文章,就是利用jsoup解析网站网页,通过标签获取想要的内容.好了废话不多说,用到的工具为 jsoup-1.7.2.jar包,具体 ...

  6. jsoup解析HTML及简单实例

    jsoup 中文参考文献    http://www.open-open.com/jsoup/ 本文将利用jsoup,简单实现网络抓取的功能,并给出一个小实例,该实例效果为:获取作者本人在博客园写的所 ...

  7. jsoup解析HTML

    Connection conn = Jsoup.connect(String url); conn.data("txtBill", key);// 设置关键字查询字段 Docume ...

  8. 一步步教你为网站开发Android客户端---HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,动态更新ListView

    本文面向Android初级开发者,有一定的Java和Android知识即可. 文章覆盖知识点:HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,动态更新List ...

  9. Jsoup 解析 HTML

    Jsoup 文档 方法 要取得一个属性的值,可以使用Node.attr(String key) 方法 对于一个元素中的文本,可以使用Element.text()方法 对于要取得元素或属性中的HTML内 ...

随机推荐

  1. kafka学习-坑篇

    安装(滤过) 启动(滤过) 坑(开始)--- topic creat完成后准备使用console-produce发布一个topic,错误如下: [-- ::,] WARN [Producer clie ...

  2. Oracle 12c 单实例安装

    准备工作 实验环境:Redhat 6.6   Oracle 12c 12.2.0.1 1.官网下载 https://www.oracle.com/technetwork/database/enterp ...

  3. Django回顾

    Django简介 Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义we ...

  4. topcoder srm 575 div1

    problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...

  5. mybatis配置与使用

    一:Mybatis简介 1.名称由来 Mybatis原名叫ibatis.Mybatis一开始属于Apache,2010年从Apache转移到了GoogleCode这个组织中. 2.Mybatis概念 ...

  6. C#Razor模板引擎简单使用

    引用 install-package RazorEngine 使用 public class TestDemo { private string name; public int Age { get ...

  7. 论文笔记:Deeper and Wider Siamese Networks for Real-Time Visual Tracking

    Deeper and Wider Siamese Networks for Real-Time Visual TrackingUpdated on 2019-04-01 16:10:37 Paper ...

  8. Bytom Kit开发辅助工具介绍

    Bytom Kit是一款为了帮助开发者更简单地理解Bytom的开发辅助工具,集合了校验.标注.解码.测试水龙头等功能. 该工具用python语言封装了一套比原的API和7个工具方法,如果有开发需求可以 ...

  9. 历届试题 小数第n位 (求循环节)

    只要被除数出现重复,就表明循环节出现了.即使商不是循环小数,也可以补0作为循环节,这样就可以统一处理了. AC代码 #include <stdio.h> #include <vect ...

  10. ArcGIS Pro玩转BIM应用浅谈

    基于GIS和BIM的集成和融合能给人类带来的价值将是巨大的,方向也是明确的.在国际范围内,各国的专家学者对智慧城市多持有乐观态度,大力倡导建设.基于BIM和GIS结合的智能城市将是一个成熟技术的融合, ...