本文要实现的案例是通过 requests 库抓取 斗破小说网 上指定的小说的目录和每一节的完整内容(只保留纯文本内容) 。当抓取包含目录和小说内容的页面后,会通过正则表达式分析 html 代码,并提取出目录标题,对应的 url 以及文本形式的小说内容 。现在进入斗破小说网,选择一篇小说,本文选择了 斗破苍穹 目录页面如下图所示:
文章插图
真是岁月催人老呀,怀念当年偷偷捂着被子,逃课看这本小说的年纪 。这部小说的目录很多,我只截图了一部分,第一个任务要完成下载这个目录页面的代码,并从中提取出小说的目录以及对应的 URL 。在网页中按 F12 或者是 检查 调出控制台调试界面,如下图所示:
文章插图
这步完成之后,我们就可以将标题作为文件名,然后抓取 URL 对应的页面内容,并提取出文本形式的小说正文,然后将小说正文保存在以标题作为文件名的文件夹中 。随便单击一个章节,进入小说正文,使用上面的方式调出调试窗口,查看正文对应的 HTML 代码,如下图所示:
文章插图
使用 requests 模块的时候,需要进行安装,如下图所示:
文章插图
根据前面的分析,示例代码如下:
【用Python抓取小说目录和全文】
# -*- coding: utf-8 -*-# @Time: 2020/5/9 19:03# @Author: 我就是任性-Amo# @FileName: 76.抓取小说目录和全文.py# @Software: PyCharm# @Blog:https://blog.csdn.net/xw1680import requests# 第三方模块 需要使用pip安装import re# 导入正则模块import os# 构造请求头headers = {"User-Agent": "Mozilla/5.0 (macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, ""like Gecko) Chrome/81.0.4044.138 Safari/537.36"}# TODO 1.根据小说链接得到小说目录和对应的urldef get_catalogue(url):# 发送请求response = requests.get(url=url, headers=headers)response.encoding = "utf-8"# 指定编码chapter_info_list = []# 用来存储获取到的所有url和章节标题数据if response.status_code == 200:# 判断请求是否成功li_list = re.findall(r"<li>.*</li>", response.text)# 过滤 获取所有的li标签for li in li_list:# print(li)result = re.search(r'href=https://www.isolves.com/it/cxkf/yy/Python/2020-09-16/"(.*)" title="(.*)"', li)# 过滤出url和标题if result:# 组成完整的urlchapter_url = "http://www.doupoxs.com" + result.group(1)# 得到章节的标题title = result.group(2)# 使用字典存储url和titlechapter = {"title": title, "url": chapter_url}# 将字典添加到列表中chapter_info_list.append(chapter)print(chapter_info_list)return chapter_info_list# TODO 2.根据章节目录,抓取目录对应的url指定的小说正文页面def get_content(chapter_info_list):for chapter_info in chapter_info_list:# 发送请求response = requests.get(url=chapter_info["url"], headers=headers)if response.status_code == 200:# 判断请求是否成功# 判断小说文件夹是否存在if os.path.exists("novel_斗破苍穹"):passelse:os.makedirs("novel_斗破苍穹")content_list = re.findall(r"(.*?)
", response.content.decode("utf8"))[1:-1]# 建立文件 并将小说正文写入文件中with open("./novel_斗破苍穹/" + chapter_info["title"] + ".txt", "w", encoding="utf8") as file:# 将内容一行一行的写入文件中for content in content_list:file.write(content + "n")if __name__ == '__main__':get_content(get_catalogue("http://www.doupoxs.com/doupocangqiong/"))
程序执行结果如下图所示:文章插图
很简单,有木有!
此文转载于:Amo Xiang
著作权归作者所有,如有侵权联系小编删除!
原文地址:https://blog.csdn.net/xw1680/article/details/106025946
推荐阅读
- 全面实用的SEO竞争对手研究
- python 操作PDF的几种方法
- 指定扫描目标和主机发现 Nmap使用详解
- 喝普洱茶的副作用,普洱茶的副作用
- 网络后沿:零信任网络架构
- 构建在线教育弹性高可用视频处理架构实战
- 红糖绿茶水的好处,用绿茶水洗脸能起到抗衰老效果
- 你知道黑客最喜欢使用的编程语言吗
- python随机生成100道100以内的加法试卷
- 金骏眉茶作用简述,金骏眉有抗癌作用