代码编织梦想

本文要实现的案例是通过 requests 库抓取 斗破小说网 上指定的小说的目录和每一节的完整内容(只保留纯文本内容)。当抓取包含目录和小说内容的页面后,会通过正则表达式分析 HTML 代码,并提取出目录标题,对应的 url 以及文本形式的小说内容。现在进入斗破小说网,选择一篇小说,本文选择了 斗破苍穹 目录页面如下图所示:


真是岁月催人老呀,怀念当年偷偷捂着被子,逃课看这本小说的年纪。这部小说的目录很多,我只截图了一部分,第一个任务要完成下载这个目录页面的代码,并从中提取出小说的目录以及对应的 URL 。在网页中按 F12 或者是 检查 调出控制台调试界面,如下图所示:


这步完成之后,我们就可以将标题作为文件名,然后抓取 URL 对应的页面内容,并提取出文本形式的小说正文,然后将小说正文保存在以标题作为文件名的文件夹中。随便单击一个章节,进入小说正文,使用上面的方式调出调试窗口,查看正文对应的 HTML 代码,如下图所示:


使用 requests 模块的时候,需要进行安装,如下图所示:


根据前面的分析,示例代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2020/5/9 19:03
# @Author  : 我就是任性-Amo
# @FileName: 76.抓取小说目录和全文.py
# @Software: PyCharm
# @Blog    :https://blog.csdn.net/xw1680

import 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.根据小说链接得到小说目录和对应的url
def 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="(.*)" title="(.*)"', li)  # 过滤出url和标题
            if result:
                # 组成完整的url
                chapter_url = "http://www.doupoxs.com" + result.group(1)
                # 得到章节的标题
                title = result.group(2)
                # 使用字典存储url和title
                chapter = {"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_斗破苍穹"):
                pass
            else:
                os.makedirs("novel_斗破苍穹")
            content_list = re.findall(r"<p>(.*?)</p>", 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

 

源码地址

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_43881394/article/details/108600080

leetcode 40 组合总和||-爱代码爱编程

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明: 所有数字(包括目标数)都是正整数。 解集不能包含重复的组合。 示例 1: 输入: candidates = [10,1,2,7,6,1,5]

SpringBoot+Mybatis-Plus使用webSocket实现一对一聊天-爱代码爱编程

SpringBoot+Mybatis-Plus使用webSocket实现一对一聊天 进一步修改完善连接:https://blog.csdn.net/w75545521/article/details/108642973 一、WebSocket WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

Java生鲜电商平台-深入理解微服务SpringCloud各个组件的关联与架构-爱代码爱编程

概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓。因此本文将通过大量的手绘图,给大家谈谈Spring Cloud微服务架构的底层原理。 实际上,Spring Cloud是一个全家桶式的技术栈,包含了很多

spring-boot将jar包整成服务自启-爱代码爱编程

在实际运行中有很多的奇奇怪怪的业务需求!以及各种优化等等 先来初步解决那一种不直接部署到线上(linux服务器)的情况。小弟才疏学浅只知道两种方式。。 第一种就是大家所常知的项目打成war包的方式。本地部署tomcat 项目直接放入此时就会有很讨人厌的情况出现。1. 黑窗口 2.客户自身原因导致项目关闭 3.重启电脑之后还是要运行tomcat第二种就是j

JAVA8新特性——Lambda表达式(一)-爱代码爱编程

java8新特性总述 1、速度更快 2、代码更少(增加了新的语法Lambda表达式) 3、强大的Stream API 4、便于并行 5、最大化减少空指针异常Optional Lambda表达式 1、为什么使用Lambda表达式 lambda是一个匿名函数,我们可以把lambda表达式理解为是一段可以传递的代码,(将代码像数据一样进行传递)。可

Spring5(3) —— 第一个Spring程序-爱代码爱编程

目录 1.创建POJO2.编写配置文件3.测试4.使用Spring改造上一个例子1.配置文件2.测试5.小结6.解析配置文件中的一些节点的意义 1.创建POJO package com.thhh.pojo; public class Hello { private String str; public Hello() {

西瓜书机器学习笔记(一)-爱代码爱编程

记录学习机器学习的过程,方便自己以后查阅; 一.机器学习 机器学习是一门致力研究如何通过计算的手段,利用经验来改善系统自身的性能的学科;在计算机系统中,“”经验通常以“数据”形式存在,因此,机器学习所研究的主要内容是关于在计算机上从数据中产生“模型”的算法,即“学习算法”(learning algorithm).通过经验数据可以基于数据产生模

Python用Tensorflow构建全连接神经网络进行半月形数据集分类-爱代码爱编程

import numpy as np import tensorflow as tf import matplotlib.pyplot as plt from sklearn.datasets import make_moons from sklearn.model_selection import train_test_split x,y = m

Python爬虫项目实战--模拟手机登录微博爬取博文转发评论点赞数据-爱代码爱编程

Python爬虫实战项目 ----爬取博文转评赞数据 import bs4 # 网页解析,获得数据 import re # 正则表达式,进行文字匹配 import urllib.request,urllib.error # 指定URL,获取网页数据 import xlwt # 进行excel操作

Pandas的时间序列-滑动窗口(32)-爱代码爱编程

什么是滑动(移动)窗口?为了提升数据的准确性,将某个点的取值扩大到包含这个点的一段区间,用区间来进行判断,这个区间就是窗口。例如想使用2011年1月1日的一个数据,单取这个时间点的数据当然是可行的,但是太过绝对,有没有更好的办法呢?可以选取2010年12月16日到2011年1月15日,通过求均值来评估1月1日这个点的值,2010-12-16到2011-1-

剑指Offer 60. n个骰子的点数(Easy)-爱代码爱编程

剑指Offer 60. n个骰子的点数(Easy) 【题目链接】 题解 【n个骰子的点数】:详解动态规划及其优化方式容易理解的python动态规划方法!思路 代码 class Solution(object): ### 0915 动态规划(20 ms,12.6 MB) def twoSum(self, n):

Pandas数据可视化-基本步骤(33)-爱代码爱编程

在Python里常用matplotlib来绘制数据即数据的可视化输出。用pandas数据处理完毕后,一般调用plot绘制,调用show显示数据。 import numpy as np import pandas as pd import matplotlib.pyplot as plt v = np.random.normal(loc = 10, sca