文章目录

  • 爬取漫画网址的并生产一个在线阅读器
    • 代码分析
    • 实现代码

爬取漫画网址的并生产一个在线阅读器

代码分析

如果要做一个爬虫的话,一定要会看网页的源代码,看有没有自己想要的数据,

http://m.kkkkdm.com/ 爬取这个网站需要使用的爬取工具只有 jsoup

当我们在这个输入框中输入了《一拳超人》和《灌篮高手》

我们发现只有 https://so.kukudm.com/m_search.asp?kw= 以后的东西不一样 这个只是把我们输入的东西变成了GBK码,

我们只需要使用 URLEncoder.encode();这个方法将我们出入的文字编程GBK码在将我们获取到的GBK码放在https://so.kukudm.com/m_search.asp?kw=后面就可以找到我们想要搜索的漫画

我们发现使用 URLEncoder.encode();这个方法可以获取我们向实现的内容

让后我们使用f12进行源代码查看 ctrl+shift+c点击这个图片我们会发现这个小说的链接路径是在一个li中存储的

我们只需要使用jsoup 获取到这个链接即可

import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Test{public static void main(String[] args) throws Exception {// 用于存储搜索到漫画名字的集合List<String> CartoonName=new ArrayList<String>(); // 用于存储搜索到漫画链接地址的集合List<String> CartoonUrl=new ArrayList<String>();//将我们输入的文字变成gbk编码String  tail= URLEncoder.encode("一拳超人","gbk");//向这个网址发送请求Document document=Jsoup.connect("http://so.kukudm.com/m_search.asp?kw="+tail).get();//这里我们只获取标签id为classify_container下的li标签下的a标签Elements  str1= document.select("#classify_container>li>a[class=txtA]");//这里我们只获取标签id为classify_container下的li标签下的a标签Elements  str2= document.select("#classify_container>li>a[href]");//获取到漫画的名字for(Element li1:str1) {CartoonName.add(li1.text());System.out.println(li1.text());}//获取循环获取小说链接for(Element li2:str2) {CartoonUrl.add(li2.attr("href"));System.out.println(li2.attr("href"));}}
}

输出结果为:

一拳超人
http://m.kkkkdm.com/comiclist/2035/

现在我们就可以直接使用这个http://m.kkkkdm.com/comiclist/2035/链接复制到

这里进行回车会找到会发现我们进去到了下面这个网址

现在我们再进行f12进行源代码查看,

我们会发现他的所有章节链接都存放在id为list的一个div下的il下的a标签属性中的href中存放我们只需要获取这个链接就可以进入本章节

//向获取到的这个一拳超人网址发送请求Document documentsImgs=Jsoup.connect("http://m.kkkkdm.com/comiclist/2035/").get();
//获取到这个网址中的id为list下li下a标签元素中有的href的a标签Elements  str3= documentsImgs.select("#list>li>a[href]");//只获取href中的内容,并将这些内容循环添加进集合for(Element li3: str3) {ImageUrl.add(li3.attr("href"));}System.out.println(ImageUrl);

输出结果为:

我们发现只使用这个获取到的链接是打不开网址的获取到的这些链接前面必须加上http://m.kkkkdm.com这个开头才可以打开 就向这样 http://m.kkkkdm.com加上/http://m.kkkkdm.com/就可以正常打开了

当我们打开一张漫画进行观看时会发现他们的

当跳转到下一张的时候

发现只是数字换了一下

那么这样就更简单了我们可以使用循环访问这个网址每次访问的时候只需要变一下这个网址中间的数字就可以进行全部访问,并在访问的时候将图片添加到一个集合中

Document documentsUrl=Jsoup.connect("http://m.kkkkdm.com/comiclist/2035/89000/1.htm").get();//只获取这个网址的.subNav下的li内容Elements  page= documentsUrl.select(".subNav>li");//转成String类型String pages=""+page;//使用indexOf()方法获取<li>1/在这个字符串中第一出现的位置int temp=pages.indexOf("<li>1/");//使用indexOf()方法获取<li class=\"last\">在这个字符串中第一出现的位置int temps=pages.indexOf("<li class=\"last\">");//获取本章一共多少多少页数int tempPage=Integer.parseInt(pages.substring(temp+6,temps-6));for(int i=1;i<=tempPage;i++) {//获取这个字符串String a="/comiclist/2035/89000/1.htm";//将这个字符串里的页数改为iString html=a.replaceFirst ("1.htm", i+".htm");//向这个网页发出请求Document documentsImgUrl=Jsoup.connect("http://m.kkkkdm.com"+html).get();//获取这个页面的所有内容并且转为字符串String box=""+documentsImgUrl;String u="<IMG SRC='\"+m2007+\"";//获取<IMG SRC='\"+m2007+\"在box字符串中第一次出现的位置int num = box.indexOf(u)+u.length();//获取.jpg在box中第一次出现的位置;int nums=box.indexOf(".jpg");//截取box,num到nums+4中间的字符串String url=box.substring(num,nums+4);//将"https://tu.kukudm.com/"和url相加添加到CartoonImageUrl集合中CartoonImageUrl.add("https://tu.kukudm.com/"+url);

以上代码将是将获取到的图片添加到一个集合中

当我们做到这一步时只需要将这个代码整合一些添加到一个简陋的GUI中即可

实现代码

import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;public class CartoonGUI extends Application{// 用于存储搜索到漫画名字的集合List<String> CartoonName=new ArrayList<String>(); // 用于存储搜索到漫画链接地址的集合List<String> CartoonUrl=new ArrayList<String>();// 用于存储图片连接List<String> ImageUrl=new ArrayList<String>();//定义两个成员变量用于获取一些值int temp1;int temp2;public void start(Stage primaryStage) throws Exception{//创建两个文本TextArea textArea=new TextArea();TextArea textArea1=new TextArea();//创建一个垂直布局 vbox对象的控件VBox vbox=new VBox();BorderPane root=new BorderPane();//输入框TextField text1=new TextField();TextField text2=new TextField();TextField text3=new TextField();//创建竖向布局的控件对象HBox hen=new HBox();HBox hen1=new HBox();HBox hen2=new HBox();//按钮Button chaxun=new Button("搜索");Button chaxun1=new Button("进入");Button chaxun2=new Button("打开");//在root窗口中上面添加一个vbox控件root.setTop(vbox);//在vbox控件中添加控件vbox.getChildren().addAll(hen,textArea,hen1,textArea1,hen2);//设置第一个文本框的大小textArea.setPrefHeight(40);//给横向布局的控件添加控件hen.getChildren().addAll(text1,chaxun);hen1.getChildren().addAll(text2,chaxun1);hen2.getChildren().addAll(text3,chaxun2);//将root添加到scene里并设置初始大小Scene scene = new Scene(root,500,600);//设置标题primaryStage.setTitle("super漫画");//将添加的东西加入窗口primaryStage.setScene(scene);//显示窗口primaryStage.show();//当点击chaxun按钮的时候出发的代码chaxun.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent event) {//点击的时候清空该列表CartoonName.removeAll(CartoonName);CartoonUrl.removeAll(CartoonUrl);textArea.setText("");//捕获异常try {//调用obtain()方法obtain(text1.getText());//循环向textArea集合中追加字符串for(int i=CartoonName.size()-1;i>=0;i--) {textArea.appendText(i+"-"+CartoonName.get(i)+"\n");}//抛出异常} catch (IOException e) {e.printStackTrace();}}});//点击这个按钮时的出发这块代码chaxun1.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent event) {// 捕获异常try {// 获取文本 将文本内容,将内容转换为Integt类型在拆箱为inttemp1=Integer.parseInt(text2.getText());// 获取到choice中的nb下标对应的字符串(网址),向这个网址发送请求Document documents=Jsoup.connect(CartoonUrl.get(temp1)).get();// 获取到这个网址页面中id元素list下的li下的a标签的href内容Elements  cartoons= documents.select("#list>li>a[href]");//循环遍历for (Element element : cartoons) {//将获取到的标签循环添加到list集合中,并且值获取标签中的href中的字符串ImageUrl.add(element.attr("href"));}// 获取list集合的长度int lon = ImageUrl.size();for(int i=ImageUrl.size()-1;i>=0;i--) {//用来计数lon--;// 满足条件时进行换行if((lon+1)%10==0) {textArea1.appendText(lon+"\n");}else {textArea1.appendText(lon+"\t");}}//抛出异常}catch (IOException e) {e.printStackTrace();}}});//点击此按钮的时候执行的代码chaxun2.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent event) {try {// 获取文本 中的内容,将内容转换为Integt类型在拆箱为inttemp2=Integer.parseInt(text3.getText());//将list.get(ns)的字符串传入MyWindow()对象中,打开另一个窗口new MyWindow(ImageUrl.get(temp2));}//抛出异常 catch (Exception e) {e.printStackTrace();}}});}public static void main(String[] args) {launch(args);}// 创建一个obtain方法用来获取搜索的关键字找出来的漫画链接public  void obtain(String name) throws IOException {//将文本输入我文本修改为gbk格式的文本String  tail= URLEncoder.encode(name,"gbk");//获取要搜索的漫画网址 并且发起请求Document document=Jsoup.connect("http://so.kukudm.com/m_search.asp?kw="+tail).get();//获取这个网址中搜索到的小说名字Elements  cartoono= document.select("#classify_container>li>a[class=txtA]");//获取这个网址中搜索到的小说路径Elements  cartoon= document.select("#classify_container>li>a[href]");//经这个路径转为字符串String cartoonUrl=""+cartoon;//将获取到的漫画链接循环放入choice对象集合中for(Element li:cartoon) {CartoonUrl.add(li.attr("href"));}//获取到漫画的名字for(Element lil:cartoono) {CartoonName.add(lil.text());}}
}
//创建一个MyWindow类继承一个线程类
class MyWindow extends Thread{//创建一个窗口对象private final Stage stage = new Stage();//创建一个用于储存图片路径的集合List<String> tup=new ArrayList();//创建一个Image数组Image[] image=new Image[999];//创建一个imageView控件用于在窗口显示图片ImageView imageView=new ImageView();//计数的一个成员变量int sum;String str;int currentIndex=0;//创建按钮控件Button upper=new Button("上一张");Button lower=new Button("下一张");//创建一个有参构造public MyWindow(String list2) throws Exception{//向Document documentsImgs=Jsoup.connect("http://m.kkkkdm.com"+list2).get();Elements  page= documentsImgs.select(".subNav>li");String pages=""+page;int temp=pages.indexOf("<li>1/");int temps=pages.indexOf("<li class=\"last\">");//获取本章一共多少多少页数int tempPage=Integer.parseInt(pages.substring(temp+6,temps-6));//将这个数字赋值给成员变量sumsum=tempPage;//将这个字符串赋值给成员变量strstr=list2;//开启线程start();//创建一个文本对象Label text=new Label();//布局创建窗口对象;BorderPane bor = new BorderPane();//添加背景颜色bor.setStyle("-fx-background-color:#FFF0F5");//在bor中间添加一个图片控件,imageViewbor.setCenter(imageView);//在bor左边添加一个上一页按钮bor.setLeft(upper);//在bor右边添加一个下一页按钮bor.setRight(lower);//在bor这个底部添加一个文本bor.setBottom(text);//添加一个图片在imageView中imageView.setImage(image[currentIndex]);//保存缩放比例imageView.setPreserveRatio(true);//设置图片初始大小imageView.setFitWidth(700);text.setText(currentIndex+"/"+tempPage);//设置文本大小text.setFont(new Font("Cambria", 40));//给文本添加边距text.setStyle("-fx-padding: 40 20 20 800");Scene scene = new Scene(bor);stage.setScene(scene);//窗口宽高stage.setHeight(500);//高stage.setWidth(500);//宽//设置窗口初始值为最大化stage.setMaximized(true);//显示窗口stage.show();//点击upper按钮时执行的代码upper.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent event) {//用来轮播图片的代码的方法upperbtn();//在窗口上显示当前页数text.setText(currentIndex+"/"+tempPage);}});lower.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent event) {//用来轮播图片的代码的方法lowerbtn();//在窗口上显示当前页数text.setText(currentIndex+"/"+tempPage);}});}//每当这个方法被调用时都会执行这个代码 下一页public void upperbtn() {currentIndex--;//判断当前页数有没有超出范围if(currentIndex<0) currentIndex=tup.size()-1;imageView.setImage(image[currentIndex]);}//每当这个方法被调用时都会执行这个代码 下一页public void lowerbtn() {currentIndex++;//判断当前页数有没有超出范围if(currentIndex>=tup.size()) currentIndex=0;imageView.setImage(image[currentIndex]);}//重写run方法public void run() {//捕获异常try {//循环sum次for(int i=1; i<=sum;i++) {//将str的字符串赋值给aString a=str;// 使用字符串指定修改某个字符来获取不同的页面String html=a.replaceFirst ("1.htm", i+".htm");//向这些页面发出请求Document kk = Jsoup.connect("http://m.kkkkdm.com"+html).get();String box=""+kk;String u="<IMG SRC='\"+m2007+\"";//获取字符的长度和u字符串在box中出现的位置,并相加并使用num接收这个值;int num = box.indexOf(u)+u.length();//获取.jpg在box中出现的位置,并用nums接收这个值int nums=box.indexOf(".jpg")+4; //使用num,nums这两个值来截取取这个字符串String url=box.substring(num,nums);//将这些截取到的字符串添加到tup这个集合中tup.add("https://tu.kukudm.com/"+url);// 使用image数组来获取这个集合里的东西image[i-1]=new Image(tup.get(i-1));//输出这个图片System.out.println(image[i-1]);}}catch (Exception e) {e.printStackTrace();}}}

程序可能有考虑不全面,或者有bug,欢迎大家指正

爬取漫画网址的并生产一个在线阅读器相关推荐

  1. 用python爬取漫画,代入感太强了

    导语: 哈喽,哈喽~当有人给你安利了一部超级好看的漫画时. 你点进去看了一下,这画风,这剧情,代入感太强我现在宣布我就是女主了. 但是看着看着,要vip你又没有,这是什么人间疾苦啊!我的女主光环呢? ...

  2. Aardio做的一个小说在线阅读器

    这是一片没有diao用的文章,没有任何技术含量. 看小说,因为太多广告,不过路由器拦截了大部分广告,其实体验也还好,不过还是想着自己做一个在线阅读器. 在线阅读器采用的是web.form.以及jq取文 ...

  3. python写一个爬虫、爬取网站漫画信息_python爬取漫画

    原博文 2017-05-31 00:56 − 抓取漫画的网址是:sf互动传媒 抓取漫画的由来也是看了知乎上有人说用爬取漫画,然后自己也玩玩 首页中每个漫画的url是类似这样存储的: 相关推荐 2019 ...

  4. python-selenium模块爬取动态网址实例---------【下载漫画码上面的漫画】

    原标题 :运用Python爬虫下载漫画码上面的漫画 前言 看过小编博客的读者应该知道,小编写的这篇博客:Python爬虫经常爬不到数据,或许你可以看一下小编的这篇文章 有一点不足,就是最后讲到的那个动 ...

  5. js function如何传入参数未字符串_Python爬虫 JS 案例讲解:爬取漫画

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于Python爬虫案例,作者麦自香 转载地址 https://blo ...

  6. js rsa解密中文乱码_python解析JS爬取漫画网站--动态爬虫

    我前两天无聊,鬼灭之刃第一季完结了,我暂时没啥动漫看,就想着看看鬼灭之刃的漫画,找了半天,找一个叫漫画堆的网站 鬼灭之刃​www.manhuadui.com 网页版的还可以,但是我当时拿手机在看,翻一 ...

  7. Python3网络爬虫:爬取漫画

    因为疫情在家里闲着没事做,学习python写了一个爬虫如下 代理ip列表文件:AgencyIP.txt 138.197.165.239:8080 142.93.126.22:8080 142.93.0 ...

  8. python网页爬虫漫画案例_Python爬虫 JS 案例讲解:爬取漫画

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于Python爬虫案例,作者麦自香 转载地址 https://blo ...

  9. python 爬取漫画《黑鹭尸体宅配便》

    想看<黑鹭尸体宅配便>这部漫画,全网找了一圈,资源特别少,手机资源上很少,虽然网页能看,但是想用手机看比较耗费流量.就想把漫画下载下来,能放在手机上看 用requests+re访问漫画网站 ...

最新文章

  1. activity 生命周期_死磕Android_App 启动过程(含 Activity 启动过程)
  2. RocketMQ集群特点
  3. 巧用计算机辅助培智生,计算机辅助设计答案
  4. hdu 2089 数位dp入门
  5. 【js与jquery】导航下拉菜单效果
  6. python面向对象——类(上)
  7. vue之elementui表单验证最基本实例
  8. 【裂痕识别】基于matlab阈值裂痕+划痕检测【含Matlab源码 467期】
  9. Java生成随机常用汉字或姓名
  10. F. Fitness Baker
  11. 判断是不是数字 Java_java如何判断是不是数字
  12. 总结在mac电脑上安装brew
  13. JDK8的介绍下载和安装(附网盘地址)
  14. 小程序实现滚动加载(懒加载)
  15. win7开始菜单不见了怎么恢复?
  16. 【手撕算法】FMM图像修复算法C++实现
  17. bzoj3252 攻略
  18. 2018-Self-Attention with Relative Position Representations
  19. [BOI2003]团伙
  20. 一个清华学生留学香港后对人生的思考(转)

热门文章

  1. 腾讯X5内核 在线视频播放 使用说明 By Terry
  2. 02、处于不同局域网下的Socket通信(网络部分理论知识)
  3. object picker 微信小程序_七夕地图导航微信小程序
  4. 中国金融集成电路(IC)卡规范(PBOC3.0)简单介绍
  5. Unity瓦片地图解决无法占满格的问题
  6. 基于webrtc的视频聊天室(五)之服务端设计
  7. ga android,pvz_ga最新版
  8. Python学习坑——init
  9. Unity 接入百度AI - 货币识别
  10. 能不用电视显示器接电脑就不用电视显示器接电脑