zoukankan      html  css  js  c++  java
  • 简单的小说网站爬虫爬小说

    现在好多的小说网站只提供阅读,并不提供下载服务,既然能够读,可以在网页上看,那么小说内容一定在网页的源代码中


    用浏览器,右键,查看元素,查看网页源代码,以及代码结构(火狐浏览器)


    依旧使用Jsoup技术获取网页源代码(Jsoup有个选择器,把带有某种属性的标签选择出来,可以指定属性值),之后进行解析提取出有用的内容

    过程:

    小说网站提供的阅读服务,一个供用户选择章节进行阅读的页面,用户点击章节超链接进去之后,进行阅读,这就是我们要打开的网址


    第一章:http://www.jingcaiyuedu.com/book/59396/0.html

    第二章:http://www.jingcaiyuedu.com/book/59396/1.html

    第三章:http://www.jingcaiyuedu.com/book/59396/2.html

    ………………………………………………………………

    查看每个链接地址,发现一个规律,链接地址前面都是一样的,后面有一个数字是递增的,从第一章到最后一章,知道第一章的链接地址和最后一掌的链接地址,剩下的就都知道了。利用一个循环依次打开每个链接。有个问题,就是他的链接并不是挨个递增排下去的,偶尔会空出一个来,后面的代码中会解决

    我们想要的东西都在代码里,标题,内容

    接下来就是提取出来就好了!!!

    利用io操作把获取到的内容写到文件中,由于都是汉字,利用字符流处理,避免乱码

    用到字符输出流,参数设置为true,设置为可追加,因为进行几百次操作都在向这个文件中写

    BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

    完整代码:有效的代码压缩之后也就几行

    package crawler;
    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    
    import java.io.BufferedWriter;
    import java.io.FileWriter;
    
    public class Main {
        public static void main(String[] args){
            for(int i=0;i<=542;i++) {
                Document doc = null;
                FileWriter fw=null;
                BufferedWriter bw=null;
                try {
                    doc = Jsoup.connect("http://www.jingcaiyuedu.com/book/59396/" + i + ".html").get();
                    fw = new FileWriter("E:\\邪王逼婚:抢来的宠妃.txt", true);
                    bw = new BufferedWriter(fw);
                    //提取出带class属性值为active的li标签。获取标题
                    String title = doc.select("li[class=active]").text();
    //                System.out.println(title);
                    //提取class属性值为panel-body content-body content-ext的div标签。获取内容
                    String text = doc.select("div[class=panel-body content-body content-ext]").text();
    //                System.out.println(text);
                    bw.write(title);//添加标题
                    bw.newLine();//换行
                    bw.write(text);//添加内容
                    bw.newLine();
                    bw.newLine();
                    bw.flush();//清空缓冲区
                } catch (Exception e) {
                    //不进行任何操作,只是捕获异常,跳出本次循环,执行下一次循环,由于链接编号中偶尔会空出一个,
                    e.printStackTrace();
                }finally {
                    try {
                        fw.close();
                        bw.close();
                    } catch (Exception e) {
                        //如果之前的网址打开出错,这里就会报错
                    }
                    continue;//跳出本次循环
                }
    
    
            }
    
        }
    }
    
    由于链接地址其中有不是挨个递增的,所以没有这个链接地址出现异常,捕获异常,最后执行finally中的continue跳出本次循环,接着执行下面的操作,不干扰程序的执行结果

    每次进行io操作之后,一定要清空缓冲区,因为忘记这个事浪费了好长时间,一直在报错

    其实自己从来不读小说的偷笑

  • 相关阅读:
    Eclipse / android studio 添加第三方jar包 步骤
    Android checkbox 自定义点击效果
    Android 程序打包和安装过程
    Android 基础
    (转)Genymotion安装virtual device的“unable to create virtual device, Server returned Http status code 0”的解决方法
    (转)eclipse 导入Android 项目 步骤
    微信开放平台注册 步骤
    Android Studio 初级安装
    数组
    作用域问题代码
  • 原文地址:https://www.cnblogs.com/duzhentong/p/7816591.html
Copyright © 2011-2022 走看看