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操作之后,一定要清空缓冲区,因为忘记这个事浪费了好长时间,一直在报错

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

  • 相关阅读:
    lua协程一则报错解决“attempt to yield across metamethod/C-call boundary”
    web server && web framework角色区分
    throttle在程序中的作用
    如何将SVN patch的修改做成old&new文件
    lua 环境揭秘
    lua module package.seeall选项
    lua module环境探秘
    lua OOP实现对象的链式调用
    项目管理(一)任务分配
    项目管理(三)展望
  • 原文地址:https://www.cnblogs.com/duzhentong/p/7816591.html
Copyright © 2011-2022 走看看