码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • python:爬取网络小说,看这一篇就够了


    说明:

            本教程仅供于学习研究使用,请勿用于其他用途。

    软件安装:

    官网下载visual studio Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft.com)

    点进网页后下拉找到个人免费版本。点击下载即可。

    1:找到浏览器下载位置,2:选择打开下载文件位置、3:选择双击运行安装程序

    点击继续

    等待下载完成后,勾选对python 的开发。

    最后等待安装完毕即可。

    新建工程:

    一般安装完成后桌面是没有图标的的我们要去系统栏进行搜索。

    选择创建新项目。

    1、点击下拉选项,2、找到python 项目

    1、选择python应用程序,2、点击确定

    1、程序名称,2、程序存放位置,可自行修改,3、勾选,4、创建

    创建后如以下界面:

    输入测试代码:

    print("hello world")

    点击启动按钮

    查看运行结果。

    到此我们的新建工程就完毕。

    导入python 包:

    需要导入的第三方包有两个,是requests和BeautifulSoup,其中一个是用于网页请求的,一个是网页解析的。

    1. import requests
    2. from bs4 import BeautifulSoup

    直接运行会报以下错误。

    错误的含义是没有找到对应的模块。我们要先下载相关的第三方包。

    首先我们关闭调试模式后,点击工具-》python-》python环境

    1、右侧输入requests,2、点击安装运行命令 pip install requests

    如果弹出提升权限点击立即提升即可

    显示此提升表明安装第三方包成功了

    同样的步骤导入bs4

    如果是其他编译环境就就采用以下命令即可。

    1. pip install requests
    2. pip install bs4

     判断爬取网页的编码格式:

    定义一个字符串变量内容为需要爬取的小说主页。

    1. # 小说的URL
    2. url = 'https://www.nfxs.com/book/126295/'

    字符串来源于百度搜索

     其他小说的话需要更换这个即可。

    首先发起一个请求,并通过BeautifulSoup解析出来。

    1. # 请求的URL是'url',这里的'url'只是一个占位符,你需要把实际的URL替换进去
    2. response = requests.get(url)
    3. # 设置响应的编码为'utf-8',这样获取到的文本内容就会是'utf-8'编码
    4. response.encoding = 'utf-8'
    5. # 导入BeautifulSoup库,这个库是Python中用来解析HTML或XML的库
    6. # 用BeautifulSoup库的'html.parser'解析器来解析从URL获取到的HTML内容
    7. soup = BeautifulSoup(response.text, 'html.parser')
    8. print(soup)

    运行结果如下这是编码格式正确可以进行下一步了。

    文中没有乱码是一个正常的页面返回。

    下面是编码格式错误的,我们需要手动调整。

    最常用的两种格式。

    1. response.encoding = 'utf-8'
    2. 或者
    3. response.encoding = 'gb2312'

    到这里我们的编码格式就能确定下来了。

     获取小说章节链接及标题:

    我们将执行的结果网上拉就可看到每个章节的前面带的有他的链接。

    接下来我们要将其取出来,写入以下代码。第一次滤除其他数据

    1. #找到HTML文档中的所有标签(即所有链接)
    2. soup.links = soup.find_all('a')
    3. #遍历所有链接
    4. # 获取小说的章节链接
    5. for a in soup.links:
    6. print(a)

    加入以上代码后输出,我们发现还有一些其他数据

    我们通过修改遍历代码将其他的滤除掉.

    1. ## 获取小说的章节链接
    2. for a in soup.links:
    3. if '.html' in str(a):
    4. print(a)

    通过判断其中是否包含'.html'字符,来将其他滤除掉。

    我们再次运行。

     

    我们发现其中还是有两个我们不想要的数据。再次修改滤波代码。 

    滤除第一种的时候,我们只需要将章节这个也加入判断即可,滤除第二种错误数据我们就需要强行固定序列了,比如我们强行让它从第一章开始。代码如下:

    1. # 获取小说的章节链接
    2. x=1
    3. for a in soup.links:
    4. if '.html' in str(a) and "第"+str(x)+"章" in str(a):
    5. print(a)
    6. x=x+1

    再次运行查看结果。

    报错咯 ,因为我们用了中文字符,这个是python 编码文件问题。我们在第一行加一行代码:

    # coding: utf-8  

    再将文件改成utf-8的编码格式即可。

    首先找到工具->自定义

    命令-》文件-》添加命令

    文件-》高级保存选项-》确定

     关闭窗口:

     我们将文件保存为utf-8模式即可。

    选择编码-》保存

    再次运行,我发现此时只有501章了,小说其实有1000多章呢

    我们可以直接去章节目录查看问题。原来是网站存在错别字。

    我们只好再次修改我们将这个错误也加入代码中.

    1. # 获取小说的章节链接
    2. x=1
    3. for a in soup.links:
    4. if '.html' in str(a) and ("第"+str(x)+"章" in str(a) or "弟"+str(x)+"章" in str(a)):
    5. print(a)
    6. x=x+1

    再次运行代码。可以发现代码到可以到1000多章了。

     首先将链接从标签a中取出来。

    1. # 获取小说的章节链接
    2. x=1
    3. for a in soup.links:
    4. if '.html' in str(a) and ("第"+str(x)+"章" in str(a) or "弟"+str(x)+"章" in str(a)):
    5. print(str(a['href']))
    6. x=x+1

    运行结果如下。

    我会发现其中链接不全,我们直接通过这种形式肯定不行。我们查看网站网页的命名格式。

    我们每读取一章就要如何通过这个网址来获取,而不是上面那个地方的网页。

    我们需要将

    /book/13713/18785770.html

    转化成下面这种模式 

    https://www.biqubao2.com/book/13713/18785770.html
    

    我们发现前面缺少的其实就是我们刚开始的链接,我们使用字符拼接即可。

    修改后代码如下所示。

    1. # 获取小说的章节链接
    2. x=1
    3. for a in soup.links:
    4. if '.html' in str(a) and ("第"+str(x)+"章" in str(a) or "弟"+str(x)+"章" in str(a)):
    5. tp=str(a['href'])
    6. print(url[:-12]+tp)
    7. x=x+1

    运行代码结果:

    最后修改代码我们将链接和章节名称保存起来。

    1. # 获取小说的章节链接
    2. x=1
    3. #链接
    4. chapter_links=[]
    5. #章节名称
    6. catalogue=[]
    7. for a in soup.links:
    8. if '.html' in str(a) and ("第"+str(x)+"章" in str(a) or "弟"+str(x)+"章" in str(a)):
    9. tp=str(a['href'])
    10. chapter_links.append(url[:-12]+tp)
    11. catalogue.append(a.text)
    12. x=x+1
    13. print(chapter_links)
    14. print(catalogue)

    运行后发现链接和我们的标题都被保存下来了。

    获取小说并保存:

    写入以下代码

    1. # 初始化一个计数器,用于跟踪章节的序号
    2. i=0
    3. # 对章节链接进行遍历
    4. for link in chapter_links:
    5. # 获取每一章的内容
    6. chapter_response = requests.get(link)
    7. # 设置响应对象的编码为utf-8,以正确处理获取到的文本数据
    8. chapter_response.encoding = 'utf-8'
    9. # 使用BeautifulSoup库解析获取到的响应文本,将其转化为一个BeautifulSoup对象
    10. # BeautifulSoup是一个用于解析HTML和XML文档的Python库
    11. chapter_soup = BeautifulSoup(chapter_response.text, 'html.parser')
    12. # 在BeautifulSoup对象中寻找id为"myDiv"的div标签
    13. # 这通常用于定位网页中的特定区域,以获取其内容
    14. # 找到 id 为 "myDiv" 的 div 标签
    15. div = chapter_soup.find('div', {'id': 'content'})
    16. # 从找到的div标签中获取文本内容
    17. chapter_text = div.get_text()
    18. # 打开名为'novel.txt'的文件,以追加模式写入数据
    19. # 如果文件不存在,将创建一个新文件
    20. # 将章节内容写入文件
    21. with open('寒门极品公子.txt', 'a', encoding='utf-8') as f:
    22. # 将catalogue[i]的内容与一个换行符'\n'拼接,并写入到文件中
    23. # catalogue可能是一个列表或其他类型的可索引对象,它包含了各章节的标题或其它标识信息
    24. f.write(catalogue[i] + '\n')
    25. # 将获取到的章节文本内容与一个换行符'\n'拼接,并写入到文件中
    26. f.write(chapter_text + '\n')
    27. # 打印出当前处理的章节编号和状态信息
    28. print('第'+str(i)+'章下载完成')
    29. time.sleep(5) # 延时5秒
    30. # 当所有章节都处理完毕后,打印出小说下载完成的信息
    31. print('小说下载完成。')

    代码的主要内容就是通过单个章节的链接获取到回复,之后找到居中格式的div ,获取其中的文本就是先说内容 这个时候我们将其写入到txt中,知道完成下载,其中延时是必须的,防止影响网站运行,从而导致踩缝纫机的风险。以下是运行结果。

    最后等待下载完成即可.

    最后贴一下完整源码。

    1. # coding: utf-8
    2. import time
    3. import requests
    4. from bs4 import BeautifulSoup
    5. url='https://www.biqubao2.com/book/13713/'
    6. # 请求的URL是'url',这里的'url'只是一个占位符,你需要把实际的URL替换进去
    7. response = requests.get(url)
    8. # 设置响应的编码为'utf-8',这样获取到的文本内容就会是'utf-8'编码
    9. response.encoding = 'utf-8'
    10. # 用BeautifulSoup库的'html.parser'解析器来解析从URL获取到的HTML内容
    11. soup = BeautifulSoup(response.text, 'html.parser')
    12. #找到HTML文档中的所有标签(即所有链接)
    13. soup.links = soup.find_all('a')
    14. # 获取小说的章节链接
    15. x=1
    16. #链接
    17. chapter_links=[]
    18. #章节名称
    19. catalogue=[]
    20. for a in soup.links:
    21. if '.html' in str(a) and ("第"+str(x)+"章" in str(a) or "弟"+str(x)+"章" in str(a)):
    22. tp=str(a['href'])
    23. chapter_links.append(url[:-12]+tp)
    24. catalogue.append(a.text)
    25. x=x+1
    26. i=0
    27. for link in chapter_links:
    28. # 获取每一章的内容
    29. chapter_response = requests.get(link)
    30. chapter_response.encoding = 'utf-8'
    31. chapter_soup = BeautifulSoup(chapter_response.text, 'html.parser')
    32. # 找到 id 为 "myDiv" 的 div 标签
    33. div = chapter_soup.find('div', {'id': 'content'})
    34. chapter_text = div.get_text()
    35. # 将章节内容写入文件
    36. with open('novel.txt', 'a', encoding='utf-8') as f:
    37. f.write(catalogue[i] + '\n')
    38. f.write(chapter_text + '\n')
    39. i=i+1
    40. print('第'+str(i)+'章下载完成')
    41. time.sleep(5) # 延时5秒
    42. print('小说下载完成。')

    好了,不多说了,我的小说下载好了,我看小说去了。 

  • 相关阅读:
    第十三章《集合》第6节:使用Collections类操作集合
    21天学Python --- 打卡11:Python基础
    ES6学习笔记
    Python 对MySQL进行增删改查等一系列操作
    2.1.4 运算放大器的等效模型、理想运算放大器的特性
    GIS是个什么鬼,真的开眼了。感谢好学生的奉献。
    YOLOv7独家改进:Multi-Dconv Head Transposed Attention注意力,效果优于MHSA| CVPR2022
    论文复现《SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM》
    2023.10.08
    MySQl索引
  • 原文地址:https://blog.csdn.net/Tom_Jerry__/article/details/133845840
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号