无缺i 发表于 2021-12-30 12:41

使用Java爬取小说网站的小说



> 示例网址:http://www.qibookw.com/book/7/7132/

## 网页分析

- 通过审查元素发现所有的章节目录都在元素ID为:`chapterlist`的<ul>标签下面

​        !(http://ftp.25wz.cn/study/image-20211230123429400.png)

- 此时我们需要获取`<li>`标签是数量,然后循环遍历获取到每一章的的URL链接
- 打开获取到的URL链接发现每章的内容都是在`ID`为`novel_content`的`div`下面

​                !(http://ftp.25wz.cn/study/image-20211230123606759.png)

- 此时我们只需要获取到这个ID下面的text值就能获取到文章的内容



## 代码实现

### 依赖

```xml
<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.15</version>
      </dependency>
      <dependency>
            <!-- jsoup HTML parser library @ https://jsoup.org/ -->
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.14.3</version>
      </dependency>
```



### Java代码

```java
/**
* @AuThor 无缺
* @ClassName test01
* @date 2021/12/30 9:57
* @Description TODO
*/
public class test01 {

    public static void main(String[] args) {
      //向这个篇小说所在的主页发送请求,并获取到HTML文档
      String body = HttpRequest.get("http://www.qibookw.com/book/7/7132/").execute().body();
      //使用jsoup解析得到的html
      Documentparse = Jsoup.parse(body);
      //使用select查询出所有的li标签
      Elements li = parse.select("#chapterlist > li");
      //根据li的数量循环遍历
      for (int i = 1; i < li.size(); i++) {
            //根据遍历的i值获取href标签中的url
            String href = parse.select("#chapterlist > li:nth-child(" + i + ") > a").attr("href");
            StaticLog.info("{}",href);
            //获取每章的标题
            String title = parse.select("#chapterlist > li:nth-child(" + i + ") > a").text();
            //拼接URL
            String url = "http://www.qibookw.com" + href;
            StaticLog.info("url:{}",url);
            //根据得到的URL发送get请求
            String body1 = HttpRequest.get(url).execute().body();
            //解析请求得到的HTML
            Document parse1 = Jsoup.parse(body1);
            //获取文章正文
            String content = parse1.select("#novel_content").text();
            StaticLog.info("当前爬取的文章标题是:{},内容是:{}",title,content);
            //构建文章保存的路径
            FileWriter fileWriter = new FileWriter("E:\\文档\\xs\\" + title + ".txt");
            //写入文章的内容
            fileWriter.write(content);
      }
    }

}
```

无缺i 发表于 2022-11-21 10:51

aojiancandao 发表于 2022-11-12 13:26
实验了一下,title包含特殊符号创建文件失败,IORuntimeException: IOException: 文件名、目录名或卷标语法 ...

如果包含有空格的话,可能就会出现这个问题

msy123 发表于 2023-3-15 16:45

怎么说呢,写的还可以,我也写了一个类似的,但是现在小说源都被垄断了,盗版小说源都是错别字,看的特别闹心,以前还可以,现在不行了,下载下来也没法看。

yj1009 发表于 2022-10-17 09:43

有点东西

jzx111 发表于 2022-11-8 17:18

终于看到一个用java写的了

aojiancandao 发表于 2022-11-12 13:26

实验了一下,title包含特殊符号创建文件失败,IORuntimeException: IOException: 文件名、目录名或卷标语法不正确。 title需要处理一下。

无缺i 发表于 2022-11-21 10:50

wwccz 发表于 2022-11-19 09:40
爬取成功,什么网站都可以爬吗

这里只是提供一个思路

aojiancandao 发表于 2022-11-21 22:21

无缺i 发表于 2022-11-21 10:51
如果包含有空格的话,可能就会出现这个问题

我测试的时候是遇到包含 ?符号 ,测试的就是楼主发的这个小说链接

6400108 发表于 2022-11-21 22:49

学习学习学习

sangkou 发表于 2022-11-30 11:33

原来如此
页: [1] 2
查看完整版本: 使用Java爬取小说网站的小说