专栏首页算法与编程之美Java|“ Java”来爬取小说章节

Java|“ Java”来爬取小说章节

1 前提简介

在上一篇Java|使用WebMagic进行电话爬取“的文章里就已经介绍了如何主要使用Pageprocessor去爬取电话号码,接下来将要学习到的是去爬取起点中文网的小说,并且按照小说名和章节分别保存。

2 简单查看

下面就是需要去爬取的小说页面以及内容,但保存下来的文件只需要章节内容,像第一章的开头就不需要,于是需要注意去判断。

图2.1 起点中文网

图2.2 玄幻新书

图2.3 反派强无敌

图2.4 章节内容

3 代码及注释

话不多说,需要的解释都以注释的形式写在代码里,下面就来看看详细的代码,值得注意的是内容的是xpath不要写错,否则可能会导致失败:

package com.yellow.java_pachong.book;

 

import us.codecraft.webmagic.Page;

import us.codecraft.webmagic.Site;

import us.codecraft.webmagic.Spider;

import us.codecraft.webmagic.processor.PageProcessor;

import  us.codecraft.webmagic.selector.Html;

import  us.codecraft.webmagic.selector.Selectable;

 

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.PrintWriter;

import java.util.ArrayList;

import java.util.List;

 

/**

 *  爬取起点小说

 */

 

public class GetQidianBook implements  PageProcessor {

     //设置带爬取文件的相关配置

     private Site site = Site.me()

            .setCharset("utf-8")//设置字符集

            .setTimeOut(1000)//设置超时时间

            .setSleepTime(1000);//设置休眠时间

     //书的名字

String bookName1 = "";

 

     @Override

     public Site getSite() {return site;}

     //爬取数据逻辑

     //第一级URL     https://www.qidian.com/xuanhuan     获取书栏目录

     //第二级    https://book.qidian.com/info/1019251979#Catalog    章节目录

     //第三级    https://read.qidian.com/chapter/SaT8jsiJD54smgY_yC2imA2/oQbX6YtwB_NOBDFlr9quQA2    章节内容

     @Override

     public void process(Page page) {

         //获取URL

         Selectable table = page.getUrl();

         //System.out.println(table);

         //URL匹配     用.{23}去代替字符匹配,每个章节的后缀不一样

         if  (table.regex("https://read.qidian.com/chapter/.{23}/.{23}").match())  {//文章章节页面

            //获取html页面信息

            Html html = page.getHtml();

             //打印html

            //System.out.println(html);

            //章节标题

            String title = "";

            //内容集合

            List<String> content = new  ArrayList<String>();

            //抓取有用信息

            //判断是否是第一章

            if  (html.xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div[1]/div[1]/div[1]/h1/text()").toString()  != null) {//是第一章

                //获取书名

                bookName1 =  html.xpath("/html/body/div[2]/div[3]/div[2]/div[1]/div[1]/div[1]/div[1]/h1/text()").toString();

                 //System.out.println(bookName);

                //获取章节名

                title =  html.xpath("[@class='main-text-wrap']/div[1]/h3/span/text()").toString();

                //System.out.println(title);

                //获取文章内容

                content =  html.xpath("[@class='main-text-wrap']/div[2]/p/text()").all();

            } else {//不是第一章

                //获取章节名

                title =  html.xpath("[@id='j_chapterBox']/div[1]/div[1]/div[1]/h3/span/text()").toString();

                 //获取文章内容

                content =  html.xpath("[@id='j_chapterBox']/div[1]/div[1]/div[2]/p/text()").all();

            }

            //存到本地

            downBook(bookName1, title,  content);

         }else if(table.regex("https://book.qidian.com/info/\\d{10}#Catalog").match()){//书的章节目录

            //获取每一章节的地址,在章节目录里每一章的xpath

            List<String> url =  page.getHtml().xpath("[@class='volume-wrap']/div[1]/ul/li/a/@href").all();

            //加入待爬取序列

             page.addTargetRequests(url);

         }else{//一级url

            //获取Html页面

            Html html = page.getHtml();

            //解析出每本书的url

            List<String> url =  html.xpath("[@id='new-book-list']/div/ul/li/div[2]/h4/a/@href").all();

            //拼接成完整的路径

            List<String> url2 = new  ArrayList<String>();

            for (String string : url) {

                url2.add(string +  "#Catalog");

            }

            //加入待爬取序列

            page.addTargetRequests(url2);

         }

    }

     //将书存入本地

     private void downBook(String bookName2, String title,  List<String> content) {

         //判断目录存不存在

         File file = new File("D:/book.xuanhuan/" + bookName2);

         if(!file.exists()){

            //如果不存在目录,则创建目录

            file.mkdirs();

         }

         PrintWriter pw = null; //使用IO流

         try {

            //存为txt文件及其路径

            FileOutputStream fos = new  FileOutputStream("D:/book.xuanhuan/" + bookName2 + "/" +  title + ".txt");

            pw = new PrintWriter(fos,true);

            for (String string : content) {

                pw.println(string);

            }

            //爬完一章打印

            System.out.println(title + "  " + "爬取完毕");

         } catch (FileNotFoundException e) {

            e.printStackTrace();

         } finally {//关流

            pw.close();

         }

     }

     //创建线程

     public static void main(String[] args) {//爬取了玄幻类的书

         Spider.create(new  GetQidianBook()).thread(1).addUrl("https://www.qidian.com/xuanhuan").run();

     }

}

4结果展示

首先是控制台的的打印:

图4.1 控制台打印

然后是保存文件路径:

图4.2 文件路径

最后是章节内容:

图4.3 章节内容

这样就自动规整地爬取到了书籍。

END

主 编 | 张祯悦

责 编 | 黄晓锋

where2go 团队

本文分享自微信公众号 - 算法与编程之美(algo_coding),作者:黄晓锋

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 网页|利用Zepto框架实现宝箱开启效果

    Zepto简单来说是一个轻量级的JS库。它的优势在于能减少下载和与运行时间,兼容大多数移动浏览器和主流桌面现代浏览器。而传统的js框架,为了兼容低级、高级浏览器...

    算法与编程之美
  • 网页|css中的匹配问题

    众所周知在写css的时候,会根据html中类的定义或者id的定义来写相应的css代码。给不同的类定义不同的样式,当然为了能够少写一些代码,大家就会在css中引用...

    算法与编程之美
  • Python|简单爬取豆瓣网电影信息

    在掌握一些基础的爬虫知识后,就可以尝试做一些简单的爬虫来练一练手。今天要做的是利用xpath库来进行简单的数据的爬取。我们爬取的目标是电影的名字、导演和演员的信...

    算法与编程之美
  • jquery 选中某一行

    Dream城堡
  • css实现左右两个div等高

    现在有两个div,但是两个div里面内容多少不确定,可能左边多,可能右边多,css要如何设置可以保证左右两边的div等高呢?

    Daotin
  • 滚动视差让你不相信“眼见为实”

    视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果。

    前端森林
  • 如何清除浮动

    如何清除浮动 大家都知道,浮动会对文档产生影响,具体来看看会对文档产生什么影响? 清除浮动后的效果: ? 未清除浮动后的效果: ? 实例代码(未清除浮动): ...

    HTML5学堂
  • html5打开摄像头

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta content="text/html...

    李海彬
  • Bug or Feature?藏在 requests_html 中的陷阱

    在写爬虫的过程中,我们经常使用 XPath 来从 HTML 中提取数据。例如给出下面这个 HTML:

    青南
  • ajax请求解析json数据渲染在前端界面

    祈澈菇凉

扫码关注云+社区

领取腾讯云代金券