爬取的网站
记得很久以前,为了看武庚纪漫画,找了半天,当时找的盗版就是这个网站,没想到,还在哈哈。
首先添加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;
}
}
爬取后的结果:
好了完成