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. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  2. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  3. MySQL复制表-INSERT INTO SELECT

    基础table为: mysql> select * from staff; +----+----------+-------+ | id | name | slary | +----+----- ...

  4. 大量的rcuob进程

    环境: OS:Centos 7 问题,今天采购了一台dell R430机器,启动发现大量的如下进程[root@localhost opt]# toptop - 02:07:57 up 6:39, 2 ...

  5. UI自动化(十四)yaml配置文件

    import yamlimport jsonf = open('config.yaml','rb')data = yaml.load(f)print(json.dumps(data,indent=4) ...

  6. phtyon

    https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014316399410395 ...

  7. Java基础学习-Eclipse综述和运算符的使用

    1.Eclipse的概述(磨刀不误砍柴工)       -Eclipse是一个IDE(集成开发环境)         -IDE(Intergrated Development Environment) ...

  8. HDU 2665 Kth number(主席树静态区间第K大)题解

    题意:问你区间第k大是谁 思路:主席树就是可持久化线段树,他是由多个历史版本的权值线段树(不是普通线段树)组成的. 具体可以看q学姐的B站视频 代码: #include<cmath> #i ...

  9. 部署springboot项目时 打包成jar时包中html,js,css文件缺失

    问题 打包出来的jar包里面没有html,js,css文件 解决方案 在pom.xml文件下的build选项中的src/main/resources的目录下 添加配置 <build> &l ...

  10. 常见的JavaWeb安全问题及修复

    1.SQL注入:程序向后台数据库传递SQL时,用户提交的数据直接拼接到SQL语句中并执行,从而导入SQL注入攻击. 字符型注入:黑色部分为拼接的问题参数 select * from t_user wh ...