前言

小说网站-笔趣阁:URL:https://www.qu.la/

笔趣阁是一个盗版小说网站,这里有很多起点中文网的小说,该网站小说的更新速度稍滞后于起点中文网正版小说的更新速度。并且该网站只支持在线浏览,不支持小说打包下载。因此,本次实战就是从该网站爬取并保存一本名为《终极斗罗》的小说,该小说是唐家三少正在连载中的一部玄幻小说。

PS:本实例仅为交流学习,支持唐三大大,请上起点中文网订阅。


正文

一、开发环境

运行平台: Windows 10
Python版本: Python3.6
IDE: PyCharm

二、爬取思路

  1. 抓取单章内容
  2. 提取有用信息,并进行清理
  3. 获取每一章名字和对应的URL
  4. 下载每一章小说内容并整合保存成txt文档
爬取单章内容

首先打开Chrome浏览器,打开笔趣阁(https://www.qu.la/) 找到需要爬取的小说《终极斗罗》(https://www.qu.la/book/101104/ ) 然后找到第一章点击打开。

然后通过requests库将整个HTML代码获取下来:

# -*- coding:UTF-8 -*-
import requestsif __name__ == '__main__':target = 'https://www.qu.la/book/101104/5281139.html'req = requests.get(url=target)req.encoding = req.apparent_encoding  # 因为网站头部没有指定编码,因此需要requests自己去判断html = req.textprint(html)

运行代码,可以看到如下结果:

可以看到,我们很轻松地获取了HTML信息。但是,很显然,很多信息是我们不想看到的,我们只想获得如右侧所示的正文内容,我们不关心div、br这些html标签。如何把正文内容从这些众多的html标签中提取出来呢?这就是本次实战的主要内容。

提取有用的信息并进行清理

我们利用beautiful soup库进行提取想要的内容

import requests
from bs4 import BeautifulSoupif __name__ == '__main__':target = 'https://www.qu.la/book/101104/5281139.html'req = requests.get(url=target)req.encoding = req.apparent_encoding  # 因为网站头部没有指定编码,因此需要requests自己去判断html = req.textbf = BeautifulSoup(html, "html5lib")texts = bf.find_all('div', id='content')print(texts)

然后我们可以看到,我们提取了想要的正文部分,但是里面有许多空格和< br/ >标签,我们需要将其清洗出去:

# -*- coding:UTF-8 -*-
import requests,re
from bs4 import BeautifulSoupif __name__ == '__main__':target = 'https://www.qu.la/book/101104/5281139.html'req = requests.get(url=target)req.encoding = req.apparent_encoding  # 因为网站头部没有指定编码,因此需要requests自己去判断html = req.textbf = BeautifulSoup(html, "html5lib")texts = bf.find_all('div', id='content')print(texts)texts = str(texts[0])pattern = re.compile('.*?<br/>')  # 选出所有以<br/>为结尾的conts = re.findall(pattern, texts)conts[0] = conts[0].lstrip()conts[0] = '  ' + conts[0]  # 第一行行首会有多余的空格for i in range(len(conts)):conts[i] = conts[i].replace('<br/>', '\n') # 去掉<br/>print(conts)
获取每一章名字和URL

我们已经顺利获得了一个章节的内容,要想下载正本小说,我们就要获取每个章节的链接。我们先分析下小说目录:

通过审查元素,我们发现可以发现,这些章节都存放在了id属性为list的div标签下,选取部分html代码如下:

<div id="list">
<dl>
<dt>《终极斗罗》最新章节(提示:已启用缓存技术,最新章节可能会延时显示,登录书架即可实时查看。)</dt>
<dd> <a href="5290362.html" style="">第189章 冰天梁</a></dd>
<dd> <a href="5290361.html" style="">第188章 计划</a></dd>
<dd> <a href="5290360.html" style="">第187章 蓝轩宇的抉择</a></dd>
<dd> <a href="5290359.html" style="">第186章 背叛</a></dd>
<dd> <a href="5290358.html" style="">第185章 光明神附体</a></dd>
<dd> <a href="5290357.html" style="">第184章 动手</a></dd>
<dd> <a href="5290356.html" style="">第183章 凌天学院三人组</a></dd>
<dd> <a href="5290355.html" style="">第182章 我想哭,怎么办</a></dd>
<dd> <a href="5290354.html" style="">第181章 金眼豹头部魂骨</a></dd>
<dd> <a href="5290353.html" style="">第180章 金丝魔猿的敌人</a></dd>
<dd> <a href="5290352.html" style="">第179章 初步联合</a></dd>
<dd> <a href="5290351.html" style="">第178章 合作</a></dd>
<dt>《终极斗罗》正文卷</dt>
<dd> <a href="/book/101104/5281139.html" style="">第一章 那是什么?</a></dd>
<dd> <a href="/book/101104/5281153.html" style="">第二章 解冻复生</a></dd>
<dd> <a href="/book/101104/5281250.html" style="">第三章 落难的明星?</a></dd>
<dd> <a href="/book/101104/5281299.html" style="">第四章 蛋生的孩子</a></dd>
<dd> <a href="/book/101104/5281408.html" style="">第五章 这只是个普通的孩子?</a></dd>
<dd> <a href="/book/101104/5281466.html" style="">第六章 再无痕迹</a></dd>
<dd> <a href="/book/101104/5281572.html" style="">第七章 蓝轩宇</a></dd>
<dd> <a href="/book/101104/5281623.html" style="">第八章 六年后</a></dd>

代码实现如下:

# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requestsif __name__ == "__main__":target = 'https://www.qu.la/book/101104/'req = requests.get(url = target)html = req.textdiv_bf = BeautifulSoup(html)div = div_bf.find_all('div', id = 'list')print(div[0])

对Beautiful Soup返回的匹配结果a,使用a.get(‘href’)方法就能获取href的属性值,使用a.string就能获取章节名,编写代码如下:

# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requestsif __name__ == "__main__":server = 'https://www.qu.la/'target = 'https://www.qu.la/book/101104/'req = requests.get(url = target)html = req.textdiv_bf = BeautifulSoup(html, "html5lib")div = div_bf.find_all('div', id = 'list')a_bf = BeautifulSoup(str(div[0]), "html5lib")a = a_bf.find_all('a')for each in a:print(each.string, server + each.get('href'))

因为find_all返回的是一个列表,里边存放了很多的标签,所以使用for循环遍历每个标签并打印出来,运行结果如下

前面内容是最新更新的12章节的链接。这12章内容会和下面的重复,所以我们要滤除,我们也不想要。这些都简单地剔除就好。

下载并保存成一个txt文档

整合代码

# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests,re
"""
类说明:下载《笔趣阁》网小说《终极斗罗》
Parameters:无
Returns:无
Modify:2019-02-28
"""
class downloader(object):def __init__(self):self.server = 'https://www.qu.la/'self.target = 'https://www.qu.la/book/101104/'self.names = []            #存放章节名self.urls = []            #存放章节链接self.nums = 0            #章节数"""函数说明:获取下载链接Parameters:无Returns:无Modify:2019-02-28"""def get_download_url(self):req = requests.get(url=self.target)html = req.textdiv_bf = BeautifulSoup(html, "html5lib")div = div_bf.find_all('div', id = 'list')a_bf = BeautifulSoup(str(div[0]), "html5lib")a = a_bf.find_all('a')self.nums = len(a[12:])                                #剔除不必要的章节,并统计章节数for each in a[12:]:self.names.append(each.string)self.urls.append(self.server + each.get('href'))"""函数说明:获取章节内容Parameters:target - 下载连接(string)Returns:texts - 章节内容(string)Modify:2019-02-28"""def get_contents(self,target):req = requests.get( url = target )req.encoding = req.apparent_encoding  # 因为网站头部没有指定编码,因此需要requests自己去判断html = req.textbf = BeautifulSoup(html,"html5lib")texts = bf.find_all('div', id='content')texts = str(texts[0])pattern = re.compile('.*?<br/>')  # 选出所有以<br/>为结尾的conts = re.findall(pattern, texts)conts[0] = conts[0].lstrip()conts[0] = '  ' + conts[0]  # 第一行行首会有多余的空格for i in range(len(conts)):conts[i] = conts[i].replace('<br/>', '\n') # 去掉<br/>return conts"""函数说明:将爬取的文章内容写入文件Parameters:name - 章节名称(string)path - 当前路径下,小说保存名称(string)text - 章节内容(string)Returns:无Modify:2019-02-28"""def writer(self, name, path, text):write_flag = Truewith open(path, 'a', encoding='utf-8') as f:f.write(name + '\n')f.writelines(text)f.write('\n\n')if __name__ == "__main__":dl = downloader()dl.get_download_url()print('《终极斗罗》开始下载:')for i in range(dl.nums):dl.writer(dl.names[i], '终极斗罗.txt', dl.get_contents(dl.urls[i]))print('\r', '已下载:  %.3f%%' % float(i / dl.nums * 100), end='', flush=True)print('\r', '已下载:  100%', end='', flush=True)print('\n下载完成!')

结果

运行上面的代码,未使用多线程,耐心等待一会就好了

Python 爬虫复习之爬取笔趣阁小说网站(不用正则)相关推荐

  1. 爬取笔趣阁小说网站上的所有小说(二)

    爬取笔趣阁小说网站上的所有小说(二) 网址为:https://www.biqukan.cc/topallvisit/1.html 我们已经拿到了所有小说的地址爬取笔趣阁小说网站上的所有小说(一),现在 ...

  2. 爬取笔趣阁小说网站上的所有小说(一)

    爬取笔趣阁小说网站上的所有小说(一) 网址为:https://www.biqukan.cc/topallvisit/1.html 反反爬虫 爬虫首先要做的就是看看目标网址有没有反爬虫手段,一般网站都是 ...

  3. Python学习笔记,爬取笔趣阁小说

    学习了基础的语法,然后网上看到有人分享利用python爬取小说,自己拷贝了代码尝试了一下. 1. 环境准备 安装 BeautifulSoup4 和 lxml & C:/Python39/pyt ...

  4. Python爬虫之爬取笔趣阁小说下载到本地文件并且存储到数据库

    学习了python之后,接触到了爬虫,加上我又喜欢看小说,所以就做了一个爬虫的小程序,爬取笔趣阁小说. 程序中一共引入了以下几个库: import requests import mysql.conn ...

  5. python爬取笔趣阁小说(附源码)

    python爬取笔趣阁小说 文章目录 python爬取笔趣阁小说 前言 一.获取小说目录结构 获取目录连接 请求代码 解析目录 XPath tqdm 解析 二.获取小说章节结构 请求代码 解析章节 代 ...

  6. python3+正则(re)增量爬虫爬取笔趣阁小说( 斗罗大陆IV终极斗罗)

    python3+re 爬虫爬取笔趣阁小说 斗罗大陆IV终极斗罗 爬取前准备 导入的模块 分析 正则的贪婪与非贪婪 附完整代码示例 爬取前准备 导入的模块 import redis #redis数据库 ...

  7. python爬取小说爬取_用python爬取笔趣阁小说

    原标题:用python爬取笔趣阁小说 首先打开笔趣阁网址,链接,搜索自己想要的小说. 在网站内单击右键,点击检查,会出现如下界面! 我们需要的章节信息就在我划的这块, 可以将每个标签点一下,它对应的内 ...

  8. java爬虫爬取笔趣阁小说

    java爬虫爬取笔趣阁小说 package novelCrawler;import org.jsoup.Connection; import org.jsoup.HttpStatusException ...

  9. 1.python爬取笔趣阁小说

    前一阵无聊想学习python,就有了以下代码,选取了笔趣阁这个大众化的网站,百度发现以笔趣阁为名的小说网站很多,本段代码只在百度结果里选取前五条,并选取了三个叫笔趣阁的网站,前五条里包含笔趣阁的任意一 ...

最新文章

  1. 微软开源数据处理引擎 Trill,每天可分析万亿次事件
  2. 开发日记-20190829 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 5
  3. Idea中实战Git
  4. [NewLife.XCode]增量累加
  5. Linux 高性能服务器编程——多线程编程
  6. 手把手教你用Python搭建一个AI智能问答系统
  7. mysql 两张大表关联_MySQL的DropTable影响分析和最佳实践
  8. Python+tensorflow计算整数阶乘的方法与局限性
  9. 搜狗营收创新高,股价却跌7%,对话王·玄奘·小川
  10. 裘慧明:跟世界上最聪明的人博弈
  11. web前端面试过程流程和建议
  12. 《战神》全剧情对话超详尽攻略
  13. foxmail 登陆gmail报密码错误
  14. 《GPU编程与CG语言之阳春白雪下里巴人》 读书笔记3 漫反射与Lambert光照模型
  15. 云消防大数据_2020年刚需系列专题之智慧消防大数据平台建设方案 智慧消防云平台项目 解决方案,一查就有...
  16. Python办公自动化:制作报表并发送到邮箱
  17. 群晖NAS加AD域时提示用户名或密码错误,但域管理员帐号和密码是对的,并且在电脑上可以正常加域。
  18. JS -制作随机点名册案例
  19. 开车遇暴雨请戴墨镜!快转起,很多人会感激你的!
  20. [20][05][01] ASM介绍

热门文章

  1. Centos7中DNS的安装与配置(失败)
  2. 三思终结长贴:八年抗战!我被我的学生打败了——我要做一个“合格”的计算机老师
  3. 英文文献阅读1-基于灰色关联熵分析的电子商务背景下农村终端配送模式评价
  4. c# 如何让textbox 只能输入十六进制
  5. SQL注入-整型注入实例
  6. 自定义SharpDevelop5.1/5.2的代码智能提示(代码完成)快捷键
  7. 【C、C++、Windows API、 boost】多种方式判断文件、目录是否存在
  8. 长寿公司模式(转载)
  9. WPA-PSK无线网络密码破解原理
  10. 方方:歼-10观察(续)