Python爬取小说(requests和BeautifulSoup)

news2024/11/23 15:43:46

1.用requests和BeautifulSoup爬取起点中文网小说(https://www.qidian.com/free/all/)

在这里插入图片描述

2.选择一篇小说(https://www.qidian.com/book/1037297523/)

在这里插入图片描述

3.查看小说的卷章和每章对应的章节

在这里插入图片描述

4.Chrome浏览器,使用F12,打开开发者模式,查看章节对应代码细节

在这里插入图片描述

5.查看卷章结构,并创建文件夹

#卷章结构
volums_names = [a.text.strip() for a in soup.find_all('h3', class_='volume-name')]

在这里插入图片描述

#创建文件夹存卷章
def create_folders(base_path, folder_names):
    for folder_name in folder_names:
        try:
            # 使用os.makedirs()创建文件夹,如果它不存在
            older_path = os.path.join(base_path, folder_name)
            os.makedirs(folder_name)
            print("文件夹 {}'创建成功!".format(folder_name))
        except OSError as e:
            print("创建文件夹 {}失败!!!".format(folder_name))

在这里插入图片描述

6.章节结构

chapter_names = [a.text.strip() for a in soup.find_all('a', class_='chapter-name')]

在这里插入图片描述
在这里插入图片描述

7.章节内容所在页面URL,缺少https:

data_cids = [a['data-cid'] for a in soup.find_all('a', class_='chapter-name')]

在这里插入图片描述

8.提取章节内容

def getchacontents(chapter_id,headers):
    response = requests.get('https:' + chapter_id, headers = headers)
    pattern = r'<p>(.*?)</p>'
    matches = re.findall(pattern, response.text, re.DOTALL)
    result = '\n'.join(matches)# 使用换行符拼接文本
    return result

在这里插入图片描述

9.获取章节内容写入txt文件,并将文件存入对应的卷章文件夹

#将章节内容写入文件,存入对应的文件夹
 def save2file(filepath, filename , content):
    filename = filename.replace(/,-)#文件名称不可出现-
    try:
        if not os.path.exists(filepath):
            os.makedirs(filepath)
         #文件存储地址
        file_path = os.path.join(filepath, filename + '.txt')
        #爬取内容写入文件
        with open(file_path,'a',encoding ='utf-8') as f:
                f.write(content +'\n')
                f.close()
        print('{}写入成功'.format(filename))
    except Exception as e:
        print('{}写入失败!!!'.format(filename))

在这里插入图片描述

10.整体代码

import requests
import json
import os
import re
from bs4 import BeautifulSoup
import random
#提取章节内容
def getchacontents(chapter_id,headers):
    response = requests.get('https:' + chapter_id, headers = headers)
    pattern = r'<p>(.*?)</p>'
    matches = re.findall(pattern, response.text, re.DOTALL)
    result = '\n'.join(matches)# 使用换行符拼接文本
    return result
#创建文件夹存卷章
def create_folders(base_path, folder_names):
    for folder_name in folder_names:
        try:
            # 使用os.makedirs()创建文件夹,如果它不存在
            older_path = os.path.join(base_path, folder_name)
            os.makedirs(folder_name)
            print("文件夹 {}'创建成功!".format(folder_name))
        except OSError as e:
            print("创建文件夹 {}失败!!!".format(folder_name))
 #将章节内容写入文件,存入对应的文件夹
 def save2file(filepath, filename , content):
    filename = filename.replace("/","-")
    try:
        if not os.path.exists(filepath):
            os.makedirs(filepath)
        #user_home = os.path.expanduser("~")
        file_path = os.path.join(filepath, filename + '.txt')
        #file_path = os.path.join(filepath,filename +'.txt')
        with open(file_path,'a',encoding ='utf-8') as f:
                f.write(content +'\n')
                f.close()
        print('{}写入成功'.format(filename))
    except Exception as e:
        print('{}写入失败!!!'.format(filename))
#防止被禁,随机返回list_中某个User_Agent设置值
def get_User_Agent():
    list_ = ['Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',\
'Mozilla/5.0 (Windows NT 10.0;Win64;x64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36',\
'Mozilla/5.0 (Windows NT 6.3;Win64;x64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',\
'Mozilla/5.0 (Windows NT 6.2;Win64;x64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',\
 'Mozilla/5.0 (Windows NT 6.1;Win64;x64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',\
'Mozilla/5.0 (Windows NT 6.3;WOW64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/401.0.2225.0 Safari/537.36',\
'Mozilla/5.0 (Windows NT 6.2;WOW64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/401.0.2225.0 Safari/537.36',\
'Mozilla/5.0 (Windows NT 6.1;WOW64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/401.0.2225.0 Safari/537.36']
    return list_[random.randint(0,len(list_)-1]
def main():
    headers = {'User-Agent':get_User_Agent()}
    response = requests.get('https://www.qidian.com/book/1037297523/',headers = headers)
    # 使用BeautifulSoup解析HTML
    soup = BeautifulSoup(response.text, 'html.parser')
    # 查找所有章节名称和章节对应网页
    volums_names = [a.text.strip() for a in soup.find_all('h3', class_='volume-name')]
    chapter_names = [a.text.strip() for a in soup.find_all('a', class_='chapter-name')]
    data_cids = [a['data-cid'] for a in soup.find_all('a', class_='chapter-name')] 
     # 指定要创建文件夹的基本路径
    base_path = '/Users/xinxin/Desktop'
    create_folders(base_path ,volums_names)

    i = 0; j = 0;m = 0
    for chapter_name in chapter_names:
        result = getchacontents(data_cids[chapter_names.index(chapter_name)], headers)
        save2file(base_path + '/' +volums_names[j] , chapter_name, result)
        i += 1;m += 1
        print(' -----写入{}已完成{}/{}----'.format(volums_names[j],m,volums_names[j][6:8]))
        if i == volums_names[0][6:8]:
            j += 1;m = 0
        elif i == volums_names[0][6:8] + volums_names[0][6:8]:
            j += 1;m =1
        
    print("小说爬取完毕")

if __name__=='__main__':
    main()         

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1069455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C超市商品信息查询系统

一、系统界面介绍 1. 超市商品信息查询系统 1、显示商品信息&#xff0c;包括&#xff1a;商品名称、商品种类&#xff08;休闲食品、奶品水饮、生鲜水果&#xff09;、商品价格、商品保质期、商品生产日期&#xff1b; 2、从文件中导入数据、显示、排序、查询的功能。&…

Javascript笔记 rest VS spread

1 rest 2 spread 3 二者区别 在 JavaScript 中&#xff0c;spread 操作符 ... 和 rest 参数都使用三个点 ... 作为前缀&#xff0c;但它们在使用上有一些区别&#xff0c;主要体现在它们的作用和使用场景上。 Spread 操作符 ... 作用&#xff1a; "展开"数组或对象的…

分类预测 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络数据分类预测

分类预测 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络数据分类预测 目录 分类预测 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现SSA-CNN麻雀算法优化卷积神经网络数据分类预测&#xff0c;多特…

2023年中国家用智能微投市场销售概况分析:家用智能微投销量为727万台,销售额为131亿元[图]

随着中国主机游戏市场的开放、电影市场的逐步繁荣&#xff0c;大屏幕带来的体验远高于电视&#xff0c;智能微投设备将成为主机游戏玩家、电影爱好者的选择。2022年&#xff0c;我国家用智能微投销量为727万台&#xff0c;销售额为131亿元&#xff1b;预计2023年家用智能微投行…

问题:remote: HTTP Basic: Access denied

参看文章&#xff1a;https://baijiahao.baidu.com/s?id1740126019873950482&wfrspider&forpc 解决方法一 (最有效) 输入&#xff1a;git config --system --unset credential.helper 再次进行 Git 操作&#xff0c;输入正确的用户名&#xff0c;密码即可。

免费使用,媲美Midjourney!微软在Bing Chat等提供—DALL-E 3

微软在官网宣布&#xff0c;将OpenAI最新模型DALL-E 3集成在Bing Chat和Bing Image Create中&#xff0c;并免费提供给用户使用。 据悉&#xff0c;DALL-E 3是一款类Midjourney产品&#xff0c;通过文本就能生成二次元、3D、朋克、涂鸦、素描、黑白、极简、印象派、位面像素等…

【Phoenix】在Kerberos认证下使用JDBC连接Phoenix 和 Phoenix各数据类型测试表创建

本案例使用的是CDH集群。 phoenix语法 一、Phoenix连接sqlline # 先检查一下kerberos cache是否过期了。 klist# 使用Phoenix的sqlline连接集群 sqlline.py zkhost1,zkhost2,zkhost3:2181二、sqlline中创建测试表 -- 查看帮助 !help-- 查看所有表 !tables-- 创建schema CRE…

IS-IS

二、IS-IS中的DIS与OSPF中的DR Level-1和Level-2的DIS是分别选举的&#xff0c;用户可以为不同级别的DIS选举设置不同的优先级。DIS的选举规则如下&#xff1a;DIS优先级数值最大的被选为DIS。如果优先级数值最大的路由器有多台&#xff0c;则其中MAC地址最大的路由器会成为DI…

算法竞赛备赛进阶之数字三角形模型训练

目录 1.数字三角形 2.摘花生.1015 3.最低通行费 4.方格取数 在算法竞赛中&#xff0c;有时候会遇到一些图形相关的题目&#xff0c;需要运用图论相关的知识进行求解。今天我们将一起探讨一个比较常见的模型——数字三角形模型。 在数字三角形模型中&#xff0c;每个位置的…

Redis 群集模式

目录 1 Redis 群集模式 1.1 集群的作用&#xff0c;可以归纳为两点 1.2 Redis集群的数据分片 2 搭建Redis 群集模式 2.1 开启群集功能 2.2 启动redis节点 2.3 启动集群 2.4 测试群集 1 Redis 群集模式 集群&#xff0c;即Redis Cluster&#xff0c;是Redis 3.0开始引入…

Android攻城狮学鸿蒙 -- 点击事件

具体参考&#xff1a;华为官网学习地址 1、点击事件&#xff0c;界面跳转 对于一个按钮设置点击事件&#xff0c;跳转页面。但是onclick中&#xff0c;如果pages前边加上“/”&#xff0c;就没法跳转。但是开发工具加上“/”才会给出提示。不知道是不是开发工具的bug。&#…

用正则表达式验证用户名和跨域postmessage

正则验证用户名 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </hea…

redis命令学习

redis命令学习 redis的类型分为&#xff1a; string类型hash类型list类型set类型sortedset类型 string类型命令 set key value 设置值&#xff0c;key是键 value是值get key 根据键获取值setex key second value 设置值有效时间 second 是时间setnx key value 只有key不存在…

JSP旅游平台管理

本系统采用基于JAVA语言实现、架构模式选择B/S架构&#xff0c;Tomcat7.0及以上作为运行服务器支持&#xff0c;基于JAVA、JSP等主要技术和框架设计&#xff0c;idea作为开发环境&#xff0c;数据库采用MYSQL5.7以上。 开发环境&#xff1a; JDK版本&#xff1a;JDK1.8 服务器&…

【19】c++设计模式——>桥接模式

桥接模式的定义 C的桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它将抽象部分与实现部分分离&#xff0c;使得它们可以独立地变化。桥接模式的核心思想是利用组合关系代替继承关系&#xff0c;将系统划分成多个独立的、功能不同的类层次结…

Spring实例化源码解析之Custom Events下集(九)

上集从官网的角度讲解了基本的使用和源码的内容&#xff0c;没有深入的进行分析&#xff0c;本章将从源码的角度分析ApplicationEvent、ApplicationListener、ApplicationEventMulticaster这三者之间的关系。 initApplicationEventMulticaster 上一章后续部分给出了源码的含义…

数据驱动智能护理:看AI如何塑造医疗领域,为灰暗夕阳带来新的曙光

近年来&#xff0c;人工智能的应用正日益渗透到医疗领域&#xff0c;呈现出无限的潜力和前景。技术的不断进步和全球医疗挑战的不断涌现&#xff0c;使得AI成为改善医疗保健质量、提高患者生活水平的强大工具。从疾病的早期诊断到治疗计划的制定&#xff0c;再到医疗管理和患者…

IP 子网划分(VLSM)

目录 一、 为什么要划分子网 二、如何划分子网 1、划分两个子网 2、划分多个子网 一、 为什么要划分子网 假设有一个B类IP地址172.16.0.0&#xff0c;B类IP的默认子网掩码是 255.255.0.0&#xff0c;那么该网段内IP的变化范围为 172.16.0.0 ~ 172.16.255.255&#xff0c;即…

IDEA的database工具以及对比两个数据库之间的差异(比DBVisualizer和DBeaver方便)

背景 其实IDEA里有个非常好用的database工具&#xff0c;用来连数据库&#xff0c;能连的数据非常多&#xff0c;最重要的是还带有对比数据库差异的工具。 唯一有点不好就是这个是 intellij idea的ultimate edition版本才有&#xff0c;对于社区版本&#xff08;community ed…

Tomcat自启动另一种方法

Tomcat自启动另一种方法 问题&#xff1a; 不知道怎么回事&#xff0c;好几台电脑都可以开机自启动tomcat&#xff0c;正常运行项目。一样的配置一样的操作流程&#xff0c;偏偏要运行的机器开机自启动后&#xff0c;项目不能运行&#xff0c;手动重启tomcat又可以用了。网上…