简单的小说网站爬虫--爬小说

来源:互联网 发布:淘宝云客服抢班技巧 编辑:程序博客网 时间:2024/05/01 08:14

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


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


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

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

原创粉丝点击