大家好,我是欧K。本期给大家带来如何一键下载N部小说,以后再也不用一章一章,一部一部的下载小说了,希望对你有所帮助。
闲言少叙,直入主题
1. 网页分析
打开136书屋网址:https://www.136book.com/,可以看到分类小说排行榜:
1.1 榜单信息 选择任意分类小说,这里我们以第一类--情感小说排行榜为例:
按F12或者右键选择审查元素查看网页结构:
右键选择审查元素查看网页结构:可以看到,整个榜单存在于一个<table>表格标签中,每部小说信息在每个<tr>标签中,包含了小说的名称、链接、作者、状态等等,这里我们主要看名称和链接。
1.2 章节信息 以第一部小说《这吻超纲了》为例:
这部小说一共91个章节,我们需要依次获取每个章节的内容:这里我们看到,所以章节的内容都包含在<ol>列表标签中,每个具体章节的内容(章节名称和内容链接)则包含在每个<li>标签中。
点击每个链接即可获得章节具体内容。
2. 爬取数据
准备工作,导入以下模块:
import os import time import requests from bs4 import BeautifulSoup from fake_useragent import UserAgent
如果模块缺失,直接pip安装即可。2.1 获取排行榜小说信息
以前十部为例:
代码:
# 获取排行榜单
def getranklist(url,headers): allinfo = [] try: r = requests.get(url, headers=headers) r.raise_for_status() r.encoding = r.apparent_encoding soup = BeautifulSoup(r.text, 'html.parser') lsts = soup.find_all('tr', attrs={'class': 'bg'}) for lst in lsts[:10]: oneinfo = [] nh = lst.find_all('td')[1] href = nh.a['href'] name = nh.text oneinfo.append(name) oneinfo.append(href) allinfo.append(oneinfo) return allinfo except: if allinfo: return allinfo else: return None
结果:
2.2 获取每部小说所有章节信息
代码:
# 获取一部小说的所有章节名称及链接
def getallchapters(url,headers): allinfo = [] try: r = requests.get(url, headers=headers) r.raise_for_status() r.encoding = r.apparent_encoding soup = BeautifulSoup(r.text, 'html.parser') info = soup.find_all('ol', attrs={'class': 'clearfix'})[1] lsts = info.find_all('li') for lst in lsts: oneinfo = [] href = lst.a['href'] name = lst.text oneinfo.append(name) oneinfo.append(href) allinfo.append(oneinfo) return allinfo except: if allinfo: return allinfo else: return None
结果:
2.3 获取具体章节信息
代码:
# 获取每章节具体内容
def getchapterinfo(info,headers): try: r = requests.get(info[1], headers=headers) r.raise_for_status() r.encoding = r.apparent_encoding soup = BeautifulSoup(r.text, 'html.parser') lsts = soup.find('div', attrs={'id': 'content'}) print(lsts.text.lstrip('\n')) except: return None
结果:
3. 保存数据
要求:
- 所有小说放在新建的books文件夹中(注意判断是否已经存在)
- 将每部小说分别放在自己命名的文件夹
- 按章节存储
代码:
for st in ranklist: try: filepath = os.getcwd() + '\\books\\' + st[0] if not os.path.exists(filepath): os.makedirs(filepath) onebookhrefs = getallchapters(st[1], headers) for info in onebookhrefs: onechapterinfo = getchapterinfo(info, headers) with open(f'{filepath}\\{info[0]}.txt', 'w') as f: f.write(onechapterinfo) except: continue
结果:
with open 语句中使用了f-string格式化,具体用法可参考下面这篇文章(点击跳转):
技巧 | 5000字超全解析Python三种格式化输出方式【% / format / f-string】
完。
END
以上就是本期为大家整理的全部内容了,赶快练习起来吧,喜欢的朋友可以点赞、点在看也可以分享到朋友圈让更多人知道哦