声明

1、 刚刚开始学习爬虫,写这个纯属兴趣,代码会有很多不严谨
2、 如果要转载,请标记出来源
爬取网站:顶点小说
获取书库资源
1、先查找搜索时的规律:
搜索大道朝天时网站为:https://www.118book.com/book/39/,代号39
搜索永恒圣王时网站为:https://www.118book.com/book/10393/,代号10393
可以得出每一个数字都代表一本书,因此可以使用循环获取某个范围内的所有书名
2、查看网页源代码,查找书名位置,从以下图片可以看出,书名位于id为info的div标签中的h1标签中

3、建立一个字典bookNames,来存放书名以及对应的编号
代码如下:

import requests
from bs4 import BeautifulSoup
import bs4bookNames = {}def getBookName(bookNames, number):for i in range(number):url = 'https://www.118book.com/book/'+str(i)try:r = requests.get(url, timeout=30)r.raise_for_statusr.encoding = r.apparent_encodingdemo = r.textsoup=BeautifulSoup(demo,'html.parser')for tag in soup.find(id='info').children:if(tag.name=='h1'):bookNames[i]=tag.string           except:print("爬取失败")getBookName(bookNames, 3)
print(bookNames)

输出结果:

{0: '我们是洪荒玩家', 1: '超级募兵仓库', 2: '僵君令'}

搜索指定书名
搜索书名是在bookNames字典中查找,如果存在返回书籍的编号,否则返回-1

def searchBook(bookNames):name = input("输入要搜索的书名:")id = -1for key, value in bookNames.items():if name == str(value):id = keyreturn idgetBookName(bookNames, 3)
print(bookNames)
id = searchBook(bookNames)
print(id)

注: 循环中valuse的类型是 'bs4.element.NavigableString,而name的类型是String,比较是否相等时要进行类型转换,否则一直返回-1

结果:

{0: '我们是洪荒玩家', 1: '超级募兵仓库', 2: '僵君令'}
输入要搜索的书名:僵君令
2

获取书籍的章节目录
1、该方法要获取书籍的章节目录以及每一章节对应的网址,并将其保存,为之后的书籍下载做准备这一部分应该是最重要的地方
2、分析网页源码

从网页源码中可以看出,每一个class为_chapter中包含3个小章节,所有要获取所有的class为_chapter的ul,然后再遍历其中的子节点
注: 这里有关问题class是python的关键字,不能在这里使用只能先获取id为list的div,然后在获取ul
代码

def getChapter(chapters, bookNames):id = searchBook(bookNames)url = 'https://www.118book.com/book/'+str(id)try:r = requests.get(url, timeout=30)r.raise_for_statusr.encoding = r.apparent_encodingdemo = r.textsoup = BeautifulSoup(demo, 'html.parser')string=''print(type(demo))for uls in soup.find(id='list').children:  # 获取所有的ulstring+=str(uls)     # 注意类型soup=BeautifulSoup(string,'html.parser')for a in soup.find_all('a'):    # 获取所有a标签chapters[a.attrs['href']]=a.string    # 注意href是a标签的一个属性,不能直接a.hrefexcept:print("章节获取失败")bookNames = {}    # 存储获取的所有书名
chapters = {}      # 存储指定小说的章节getBookName(bookNames, 3)
getChapter(chapters, bookNames)
print(chapters)

结果:

下载小说
1、最后一个阶段将小说保存的本地,想法是小说名作为文件名,每一章节都是一个单独的以章节名为命名的txt文件
2、随便打开一个章节,可以得到网址,例如:https://www.118book.com/book/2/6.html,可以得出规律只需要在https://www.118book.com/book/2/拼接上对应的编号即可打开每一章节
3、查看源代码,获取小说内容所在的标签

从源代码中可以看出只需要获得id为content的div标签即可

def saveNovel(bookNames, chapters, flog):i = -1id = searchBook(bookNames)getChapter(chapters, bookNames, id)url = 'https://www.118book.com/book/'+id+'/'for key, value in chapters.items():i += 1if(flog == True and i == 3):breaktry:href = url+keyr = requests.get(href, timeout=30)r.raise_for_statusr.encoding = r.apparent_encodingdemo = r.textsoup = BeautifulSoup(demo, 'html.parser')div = soup.find_all(id='content')text = (str(div)).replace('<br/>', '\n')  # 替换换行符的形式path = 'D:/'+bookNames[int(id)]       # 存放小说的文件夹if not os.path.exists(path):   # 检测文件夹是否存在os.mkdir(path)file = open(path+'/'+value+'.txt', 'a', encoding="utf-8")file.write(text)file.close()except Exception as re:print(re)print("下载完成")

注: 如果只是单纯下载某一个页面的小说可以使用以下代码

import requests
from bs4 import BeautifulSoup
import bs4
import osurl = 'https://www.118book.com/book/2/6.html'  # 这是每一章节对应的网址
try:r = requests.get(url, timeout=30)r.raise_for_statusr.encoding = r.apparent_encodingdemo = r.textsoup = BeautifulSoup(demo, 'html.parser')div = soup.find_all(id='content')div = (str(div)).replace('<br/>', '\n')path = 'D:/'+'1'file=open(path+'/a.txt','a',encoding="utf-8")file.write(div)file.close() print('wc')
except Exception as re:print(re)

完整代码
偷个懒,代码还可以简单整理以下,就不整理了
1、可以加一个main函数
2、以下代码有些重复,可以单独定义成一个init函数

r = requests.get(url, timeout=30)
r.raise_for_status
r.encoding = r.apparent_encoding
demo = r.text
soup = BeautifulSoup(demo, 'html.parser')

3、完整代码:

import requests
from bs4 import BeautifulSoup
import bs4
import os# 获取书库
def getBookName(bookNames, number):for i in range(number):url = 'https://www.118book.com/book/'+str(i)try:r = requests.get(url, timeout=30)r.raise_for_statusr.encoding = r.apparent_encodingdemo = r.textsoup = BeautifulSoup(demo, 'html.parser')for tag in soup.find(id='info').children:if(tag.name == 'h1'):bookNames[i] = tag.stringexcept:print("爬取失败")# 搜索指定书籍
def searchBook(bookNames):name = input("输入要搜索的书名:")id = -1for key, value in bookNames.items():if name == str(value):id = keyreturn str(id)# 获取所有的章节
def getChapter(chapters, bookNames, id):url = 'https://www.118book.com/book/'+idtry:r = requests.get(url, timeout=30)r.raise_for_statusr.encoding = r.apparent_encodingdemo = r.textsoup = BeautifulSoup(demo, 'html.parser')string = ''for uls in soup.find(id='list').children:  # 获取所有的ulstring += str(uls)     # 注意类型soup = BeautifulSoup(string, 'html.parser')for a in soup.find_all('a'):    # 获取所有a标签# 注意href是a标签的一个属性,不能直接a.hrefchapters[a.attrs['href']] = a.stringexcept:print("章节获取失败")# 下载小说
def saveNovel(bookNames, chapters, flog):i = -1id = searchBook(bookNames)getChapter(chapters, bookNames, id)url = 'https://www.118book.com/book/'+id+'/'for key, value in chapters.items():i += 1if(flog == True and i == 3):breaktry:href = url+keyr = requests.get(href, timeout=30)r.raise_for_statusr.encoding = r.apparent_encodingdemo = r.textsoup = BeautifulSoup(demo, 'html.parser')div = soup.find_all(id='content')text = (str(div)).replace('<br/>', '\n')  # 替换换行符的形式path = 'D:/'+bookNames[int(id)]       # 存放小说的文件夹if not os.path.exists(path):   # 检测文件夹是否存在os.mkdir(path)file = open(path+'/'+value+'.txt', 'a', encoding="utf-8")file.write(text)file.close()except Exception as re:print(re)print("下载完成")bookNames = {}    # 存储获取的所有书名
chapters = {}      # 存储指定小说的章节getBookName(bookNames, 3)
print(bookNames)
saveNovel(bookNames, chapters, True)

注: 因为运行速度有些慢,当soveNovel的参数为true时,只下载3章,如果要全部下载设置为false即可
运行结果:



总结

1、 感觉写这个程序非常累,写了很久
2、 写程序过程中发现自己不扎实,要翻书、看笔记
3、 要注意类型,代码因为类型问题,出现了很多错误

爬虫 (7)—— 爬取网络小说,详细分析及代码相关推荐

  1. python爬虫下载小说_用PYTHON爬虫简单爬取网络小说

    用PYTHON爬虫简单爬取网络小说. 这里是17K小说网上,随便找了一本小说,名字是<千万大奖>. 里面主要是三个函数: 1.get_download_url() 用于获取该小说的所有章节 ...

  2. 用PYTHON爬虫简单爬取网络小说

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  3. Python爬虫之爬取网络小说并在本地保存为txt文件

    Python爬虫之爬取网络小说并在本地保存为txt文件 注:本文使用软件为Sublime Text,浏览器为谷歌浏览器 (新手小白第一次写,写得不好请见谅) **1.**首先找到想要爬取的小说章节目录 ...

  4. Python爬虫练习 爬取网络小说保存到txt

    原文链接:https://yetingyun.blog.csdn.net/article/details/107916769 创作不易,未经作者允许,禁止转载,更勿做其他用途,违者必究. 利用 Pyt ...

  5. python爬取小说写入txt_Python爬虫练习 爬取网络小说保存到txt

    利用python爬虫爬取网络小说保存到txt,熟悉利用python抓取文本数据的方法. 选取其中某一章,检查网页,可以找到这本小说所有章节的链接和名称. 写出xpath表达式提取出href里的内容:/ ...

  6. 【网络爬虫】爬取网络小说并保存为txt

    爬虫爬取网络小说并保存为txt文件 最近突然想看小说,但是苦于无法下载为txt,于是秉持着"自己动手,丰衣足食"的原则,自己写了一个爬虫,仅供参考~ 这里就以火星引力的<逆天 ...

  7. python爬取小说写入txt_燎原博客—python爬取网络小说存储为TXT的网页爬虫源代码实例...

    python是一门优秀的计算机编程语言,两年前曾因为动过自动化交易的念头而关注过它.前几天在微信上点了个python教学的广告,听了两堂课,所以现在又热心了起来,照葫芦画瓢写了一段简单的网络爬虫代码, ...

  8. Python3网络爬虫,简单爬取网络小说并下载

    相信我们常常会有想看的小说,但是不能下载,导致无法在没网的环境下观看..下面将解一下如何用python3爬取网络小说. 本文主要是用于学习,希望大家支持正版. 首先我们需要两个包,我们分别是reque ...

  9. python爬虫爬取网络小说

    近日沉迷网络小说不能自拔的某人让我趁着网站限免把她想看的小说爬取下来,免得到时候又要付费看书,本来对于这种又要看正版又想占便宜不给钱的行为的我是深恶痛绝的,然而...为了小命我还是做一下吧.     ...

  10. 完全小白篇-使用Python爬取网络小说

    完全小白篇-使用Python爬取网络小说 一.找一个你要爬取的小说 二.分析网页 网页的展示方式 需要用到的库文件 三.向网站发送请求 四.正则提取 五.跳转的逻辑 六.后续处理 七.保存信息进入do ...

最新文章

  1. CVPR2022最新106篇论文整理|包含目标检测、动作识别、图像处理等32个方向
  2. python与excel的关系-Python 与 Excel 不得不说的事
  3. Tomcat的安装配置与JavaWeb入门教程
  4. stability condition in queueing system
  5. 根据数组建立平衡二叉搜索树
  6. 读书节来当当薅羊毛!170买400/240买600
  7. 一步步Netty的基石 - Reactor模式
  8. JavaScript基础专题之执行上下文和执行栈(二)
  9. java往json里添加对象_将新数组元素添加到JSON对象
  10. java爬虫教程:模拟用户表单登录
  11. 记一次超好用下载器you-get复活
  12. shader篇-漫反射
  13. 系统版本aplpha,Beta等表示的意思
  14. 多线程编程实例(使用CompletableFuture)
  15. 高德导航在天地图显示
  16. Linux遇到Aborted (core dumped)
  17. Spark的Cache和Checkpoint区别和联系拾遗
  18. 【c】C语言编程写的一个http下载程序
  19. 漫画:算法如何验证合法数独 | 全世界最难的数独?
  20. Electron是什么以及可以做什么

热门文章

  1. Flutter异常Another exception was thrown: A RenderFlex overflowed by 5.0 pixels on the bottom解决方案
  2. 未知环境探索(二)基于边界点的自主环境探索
  3. python层次聚类法画图_原理+代码|详解层次聚类及Python实现
  4. 狼人杀微信娱乐游戏小程序源码
  5. Drools7.5.0教程-目录
  6. Excel怎么制作二维码图片?
  7. 批量查询手机号归属地
  8. Excel如何批量查询手机号码归属地?
  9. 最小二乘法求解线性回归模型及求解
  10. python数据科学导论_R与Python手牵手:数据科学导论系列(包的载入)