java爬虫抓取漫画,一二三部下载到本地

爬取的网站
在这里插入图片描述
记得很久以前,为了看武庚纪漫画,找了半天,当时找的盗版就是这个网站,没想到,还在哈哈。

首先添加jsoup依赖

      <!--解析html使用-->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.9.2</version>
        </dependency>

下面是所有代码

package com.pacong;


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

import javax.swing.filechooser.FileSystemView;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.LinkedHashMap;
import java.util.Map;

public class startMain {

    /**
     *代表的是每一章多少页:初始值1
     *returnUrl()方法第一次读取时会获取,
     *这一章有多少页,执行到最后一页时,
     *会把pubPage在赋值为1
     */
    public static int pubPage = 1;
    /**
     * 存放网址数据
     */
    public static Map<String, String> map = new LinkedHashMap<>();
    /*获取电脑桌面路径*/
    public static String top = FileSystemView.getFileSystemView().getHomeDirectory().getPath();


    public static void main(String[] args) throws IOException {
        /*什么都不用做运行即可 图片会自动下载电脑桌面 文件夹名:manHua*/
        getImg();
    }

    /**/
    public static void getImg() throws IOException {
        /*漫画所有章节的地址*/
        Document doc = GetHtml("http://m.ikkdm.com/comiclist/950/");
        /*获取章节地址*/
        Elements a = doc.select("#list>li>a[href]");
        /*解析数据存放在map中*/
        a.forEach(e -> {
            /**/
            String[] text = e.text().split(" ");
            String textNumber = text[1].indexOf("_") != -1 ? text[1].split("_")[1] : "38";
            String key = text[0] + "&" + textNumber;
            String value = e.attr("href");
            map.put(key, value);
        });


        map.forEach((key, value) -> {
            /*将url拼接一下就是 ,真正可以读取的网址*/
            String url = "http://m.ikkdm.com" + value.substring(0, value.lastIndexOf("/") + 1);
            /*漫画总共有三部 key中存放的是 第几部&第几章 如:第二部&2*/
            String[] bu = key.split("&");
            for (int i = 1; i <= pubPage; i++) {
                try {
                    setUrl(returnUrl(url + i + ".htm", pubPage, i), bu[0], bu[1], i);
                } catch (IOException e) {
                    e.printStackTrace();
                    System.err.println("=================================");
                }

            }
        });
    }

    /*获取图片连接与页数*/
    public static String returnUrl(String ur, int prPage, int i) throws IOException {
        System.err.println("获取url方法 =:" + "ur=:" + ur + "prPage=:" + prPage + "i=:" + i);

        Document doc = GetHtml(ur);

        String str = doc.select("script[language=\"javascript\"]").toString();

        /*得到位置 坐标*/
        int num = str.indexOf("document.write(");

        /*document.write("<a href='/comiclist/950/18504/4.htm'><IMG SRC='"+m2007+"kuku7comic7/201010/20101002/G001/cccc_0020AJ.jpg'></a><span style='display:none'><img src='"+m201304d+"kuku7comic7/201010/201010*/
        /*通过拆分得到我们想要的内容*/
        String img = str.substring(num, num + 150);
        /*网站图片后缀有点乱,要做一下判断*/
        int end = img.indexOf(".JPG") != -1 ? img.indexOf(".JPG") : img.indexOf(".jpg");
        /*再一次 拆分 拼装 才是我们想要的 图片url连接  最终的结果:https://s1.kukudm.com/kuku7comic7/201010/20101002/G001/cccc_0020AJ.jpg*/
        String cheng = "https://tu.kukudm.com/" + img.substring(img.indexOf("SRC=") + 14, end + 4);
        System.err.println("图片url===:" + cheng);

        if (prPage == 1) {
            String elspage = doc.select("ul[class=subNav]").toString();
            /*获取大概 包含 页数的标签*/
            int shPage = elspage.indexOf("<li>上一页</li>");
            //转换为整形 用于循环
            int page = Integer.valueOf(elspage
                    .substring(shPage + 12, shPage + 22)
                    //获取第二个数组 最终的结果 57~45,是个整数
                    .split("/")[1]
            );
            System.err.println("多少页===:" + page);
            pubPage = page;
        }
        if (i == pubPage) {
            pubPage = 1;
        }

        /**
         * 判断是否包含中文
         */
        boolean bool = cheng.getBytes("utf-8").length > cheng.length() ? true : false;

        if (bool) {
            StringBuffer buffer = new StringBuffer();
            for (int j = 0; j < cheng.length(); j++) {
                String cha = cheng.substring(j, j + 1);
                if (cha.getBytes("utf-8").length > 2) {
                    /*将中文编译为浏览器可以识别的*/
                    buffer.append(URLEncoder.encode(cha, "utf-8"));
                } else {
                    buffer.append(cha);
                }
            }
            System.err.println("有汉字编译后=:" + buffer.toString());
            /*有的网址中含有空格,将空格替换为 %20 */
            return buffer.toString().replace(" ", "%20");
        }

        return cheng.replace(" ", "%20");
    }

    /*下载图片方法    chapter代表几张 page第几页*/
    public static void setUrl(String url, String bu, String chapter, int page) throws IOException {
        System.err.println("下载图片方法 =:" + "url=:" + url + "chapter=:" + chapter + "page=:" + page);

        /*创建网络连接*/
        URL http = new URL(url);
        /*连接数据*/
        URLConnection tion = http.openConnection();
        /*读取数据*/
        InputStream reader = tion.getInputStream();
        /*存放图片文件夹 一级文件夹*/
        File file = new File(top + "\\manHua\\" + bu + "\\第" + chapter + "章");

        /*文件不存在*/
        if (!file.exists()) {
            /*创建文件*/
            file.mkdirs();
        }

        /*写*/
        OutputStream writer = new FileOutputStream(file + "\\第" + page + "页" + ".jpg");
        /*每次读取的字节长度*/
        int n = 0;
        /*存储每次读取的内容*/
        byte[] bb = new byte[1024];
        while ((n = reader.read(bb)) != -1) {
            /*将读取的内容,写入到输出流当中*/
            writer.write(bb, 0, n);
        }
        /*关闭流*/
        writer.close();
        reader.close();
    }

    /*爬取网页*/
    public static Document GetHtml(String url) throws IOException {
        Document doc = Jsoup.connect(url).timeout(500000).header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
                .header("Accept-Encoding", "gzip, deflate, sdch").header("Accept-Language", "zh-CN,zh;q=0.8")
                .header("Accept-Language", "zh-CN,zh;q=0.8")
                .header("User-Agent", "Mozilla/31.0 (compatible; MSIE 10.0; Windows NT; DigExt)")
                .header("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)")
                .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36").get();

        return doc;
    }

    
}

爬取后的结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
好了完成

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值