网上关于python爬虫抓取网络小说的教程和代码已经很多了,下文主要的内容不是教程,而是从一个阅读者的角度出发,谈谈如何实现更舒服的阅读。
之所以要写本文,是因为实现抓取小说很容易,但多日来就“要实现怎样的功能”,我一直在迷惑,直到最后确定了自己想要的是什么,即“普通阅读者”要方便的追书、阅读

本文所想所写基本出发点是”方便”,做了以下功能:

  • 管理(添加删除)想看的书;
  • 自动创建书名文件夹保存清理干净的小说正文内容;
  • 自动发送想看的内容到阅读器app

实现了:基本实现打开就看,尽量减少任何其它操作的目标。

无论是在网上还是手机上通过web页面,还是通过某些追书app看,总会遇到一些不方便甚至是严重干扰阅读的因素,比如广告,比如更新不及时,比如没有自己想追的书。

所以自己动手,丰衣足食,要实现以下功能:

  • 没有干扰因素,纯净的阅读;
  • 追书更新及时,第一时间得到最新章节;
  • 管理要追的书

强调一下,本文是作为个人阅读者的定位的思索和代码构建,不是要爬取网站上所有的书。

1. 来源网站的选择

小说来源网站的好坏,是能否长期稳定得到高质量内容的基础,所以在众多来源小说网站中,先做一下筛选是有必要的。

上图中,“网站的html标签”完整符合规范,有利于定位并解析出想要的内容。

一个例子,某网站的小说章节页面的<div>标签不配对,<br> </br> < \br>等乱用,在用BeautifulSoup解析时,不能方便准确解析。当然,如果非要用substring()或写一个复杂的正则去匹配,也能做到,但是,substring()定位网站稍有变化就出错;为了一个不规范网站源码写个专门的复杂正则不必要,我想要的是简单方便,代码易维护,最好能通用。
后来,我发现该网站的移动版页面,干净清爽,源码清晰规范,所以实际上我爬取的移动端页面。电脑版页面为“https://www.afdadfa.com/......”,移动端页面网址为“https://m.afdadfa.com/......”
大家也可以试试

上图中另外几点,每个人根据观察经验,再多试一下,不再赘言。

2. 阅读方法

困扰了自己不少时间的事:
对个人“追书”阅读者,爬虫抓取小说适合的方式是:先抓取已有所有章节,保存成一个文件(如txt格式等),随后更新的章节,按单章分别及时抓取。

阅读方法与代码构建互为基础,下面是个人认为比较好的流程。

本人最终选择的是全用pocket阅读,没有用代码或程序把txt获取到本地,是因本文主题所说的,方便。

  • 给pocket的URL可以是TXT文件地址,而不仅是html页面的地址;与pocket同样的服务instapaper不能获取txt文件URL的内容;
  • pocket能缓存txt文件的内容,没有网络也可以阅读;

2018.03.12 临门一脚了,发现pocket并不能打开很大的txt文件(我试的是10M); Amazon Drive也暂时关闭了,所以发邮件同步到kindle也没成功。现最好的方法是用网盘app同步到本地,在网盘app中分享到阅读app(苹果设备的用法)。

2018.03.13 实际我现在采用的是方案是:所有章节内容保存为TXT文件,并将TXT压缩为zip文件;有更新就追加写入TXT,重新压缩;同步到Google Dirve,本地Google Drive上将txt或zip分享到Anyview(Anyview可以直接打开zip阅读);一直在追的书有更新,会将新的章节发到Instapaper。–需要自己动手操作的只有”分享到Anyview”这一步骤。

2018.4.9 弃用Google Drive了,因为gdrive这个命令行程序不好用,且Google drive某些情况同步会卡住,或同步失败.根据以往的经验Dropbox可以用,且很好用.

3. 内容的获取和管理

确定了从哪个(些)网站爬取小说内容,以及阅读方式,下面就用代码实现它。

3.1 代码主要实现以下几点:

  • 检查是否有更新;
  • 获取内容解析出正文并保存;
  • 能提供编辑所追的书列表的功能

3.2 是否有更新的判断

  1. 读取文件中保存的“要追的书“的列表;
  2. 获取一本书的“所有章节”URL地址(通常是6~9位数字.html);
  3. 读取另一个文件中保存的“已抓取过的书,及最后一次下载的章节的地址”的列表
  4. 看要追的书是否存在于已抓取过的书中,如果没有,则根据上面已获取的URL地址顺序抓取并解析出想要的正文内容,保存;
  5. 要追的书如果在已抓取过的书中已有信息,再按章节URL数字顺序(从小到大)比较章节与最后抓取的章节相比是否更新,如果是,则抓取正文,保存;
  6. 重复以上2~5项步骤,处理“要追的书“的列表中下一本书。

3.4 代码

确定好了阅读方法,才可以决定写哪些功能代码

3.5 追书列表管理

我用的一个txt文件保存的要追的书的列表,格是是下面这样的:

小说名A,2342/848432
小说名B,6637/823424

逗号后的数字是小说网址的中的数字,如某小说网址是https://m.piaotian.com/html/7/7438_1/, 文件中的数字字符串即为”7/7438_1″

爬虫代码是放一般在服务器上,一直不停运行,所以需要添加删除要追的书时,在本地编辑这个列表文件,现再放到服务器上,有点麻烦。
解决方法1:
本地和服务器上同时运行网盘程序,如dropbox,google drive等,本编辑好追书列表文件后,即自动同步到服务器上。
该方法缺点:不能随时随地编辑管理,没安装网盘程序时还是得手动上传;dropbox、google drive需XX才能用,不需XX用的网盘(国内网盘)是不是只有服务器是windows系统的才行?我不太清楚。
解决方法2:
做一个运行在服务器上的能添加/删除书单的管理系统,对小说列表的txt文件增删。我用PHP简单做了,只需3个功能代码即可:显示、增加、删除txt文件。

增加一本小说的PHP主要代码如下:

<?php
$add_book = $_POST['book_info'];
$filename="bookslist.txt";
$fcontent = file($filename);
$fp  = fopen("$filename","a");
$str = "\n".$add_book;
fwrite($fp, $str);
?>  

注意$str = "\n".$add_book;这句的换行符”\n”的位置。

删除要追的书的PHP主要代码如下:

<?php
$DELETE = $_GET['bookname'];
$data = file("bookslist.txt");
$out = array();
 
foreach($data as $line) {
    if(trim($line) != $DELETE) {
        $out[] = $line;
    }
}
$fp = fopen("bookslist.txt", "w+");
flock($fp, LOCK_EX);
foreach($out as $line) {
    fwrite($fp, $line);
}
flock($fp, LOCK_UN);
fclose($fp);

#删除txt文件中的空行
$file_arr = file("bookslist.txt",FILE_SKIP_EMPTY_LINES|FILE_IGNORE_NEW_LINES);
file_put_contents("bookslist.txt",implode("\n",$file_arr));
?>

注意:PHP代码和服务器的的安全性在这里暂不涉及,但如果想做,请一定重视。

4. 可更完善之处

  • 多来源获取—想看的某书一个网站上没有,那另一个网站上有。实现可以在书单管理中添加来源项和内容获取代码中添加另一网站的解析规则;
  • 增加代码增强容错性。

5. 参考:

  1. 使用Python自动抓取更新的小说,并发送到Instapaper上
  2. Python爬虫利器二之Beautiful Soup的用法
  3. Python爬虫系列:爬取小说并写入txt文件
  4. 网络上网友贡献的代码

发表评论

电子邮件地址不会被公开。 必填项已用*标注