python爬取起点小说_Python简单爬取起点中文网小说(仅学习)
前言
实习期间自学了vba,现在开始捡回以前上课学过的python,在此记录学习进程
本文内容仅用于学习,请勿商用
一、爬虫思路
无需登录的页面只需要用到简单爬虫,获取小说目录、通过目录获取小说正文即可。
二、使用步骤
1.引入库
代码如下(示例):
import requests,sys
from bs4 import BeautifulSoup
2.读取页面
代码如下(示例):
target = 'https://book.qidian.com/info/1024995653#Catalog'
req = requests.get(url=target)
为防止页面出错、页面乱码问题,分别加入:
req.raise_for_status()
req.encoding = req.apparent_encoding
此时即可看到网页HTML:
html = req.text
3.分析HTML
在HTML代码中,我们要找到对应目录的文字和链接,以及承载这两个信息的标签:
在小说目录页面按下F12,观察页面的HTML,可以发现目录是在一个class=‘catalog-content-wrap’、id=‘j-catalogWrap’的div标签下的。继续分析,发现还有volume-wrap,volume等子标签作为目录的容器:
一直向下延伸到带有链接的a标签,定位到目标,分析完毕。
bf = BeautifulSoup(html,"html.parser")
catalogDiv = bf.find('div',class_='catalog-content-wrap',id='j-catalogWrap')
volumeWrapDiv = catalogDiv.find('div',class_='volume-wrap')
volumeDivs = volumeWrapDiv.find_all('div',class_='volume')
3.从标签中取出信息
仍然是利用BS直接取出volume中所有的a标签,并且把其中的文本和对应的href存起来。
aList = volumeDiv.find_all('a')
for a in aList:
chapterName = a.string
chapterHref = a.get('href')
这样整个目录就检索完成了,开始利用Href爬取正文。
4.爬取正文
先随便选择一个链接打开,观察正文的HTML:
发现格式会有两种情况,一种直接用p标签装起来,一种是p中带有span,用class=content-wrap的span装起来。
但是首先他们都一定是在class=‘read-content j_readContent’的div下,因此直接定位:
req = requests.get(url=chapterHref)
req.raise_for_status()
req.encoding = req.apparent_encoding
html = req.text
bf = BeautifulSoup(html,"html.parser")
mainTextWrapDiv = bf.find('div',class_='main-text-wrap')
readContentDiv = mainTextWrapDiv.find('div',class_='read-content j_readContent')
readContent = readContentDiv.find_all('span',class_='content-wrap')
这时已经可以拿到带有标签的正文部分了,由于链接不同,会导致标签格式不同,因此用判断区分:
if readContent == []:
textContent = readContentDiv.text.replace('
','\r\n')
textContent = textContent.replace('
','')
else:
for content in readContent:
if content.string == '':
print('error format')
else:
textContent += content.string + '\r\n'
正文内容获取完毕。
现在只需遍历就能获取整部小说啦!
总结
以下为完整代码:
#!/usr/bin/env python3
# coding=utf-8
# author:sakuyo
#----------------------------------
import requests,sys
from bs4 import BeautifulSoup
class downloader(object):
def __init__(self,target):#初始化
self.target = target
self.chapterNames = []
self.chapterHrefs = []
self.chapterNum = 0
self.session = requests.Session()
def GetChapterInfo(self):#获取章节名称和链接
req = self.session.get(url=self.target)
req.raise_for_status()
req.encoding = req.apparent_encoding
html = req.text
bf = BeautifulSoup(html,"html.parser")
catalogDiv = bf.find('div',class_='catalog-content-wrap',id='j-catalogWrap')
volumeWrapDiv = catalogDiv.find('div',class_='volume-wrap')
volumeDivs = volumeWrapDiv.find_all('div',class_='volume')
for volumeDiv in volumeDivs:
aList = volumeDiv.find_all('a')
for a in aList:
chapterName = a.string
chapterHref = a.get('href')
self.chapterNames.append(chapterName)
self.chapterHrefs.append('https:'+chapterHref)
self.chapterNum += len(aList)
def GetChapterContent(self,chapterHref):#获取章节内容
req = self.session.get(url=chapterHref)
req.raise_for_status()
req.encoding = req.apparent_encoding
html = req.text
bf = BeautifulSoup(html,"html.parser")
mainTextWrapDiv = bf.find('div',class_='main-text-wrap')
readContentDiv = mainTextWrapDiv.find('div',class_='read-content j_readContent')
readContent = readContentDiv.find_all('span',class_='content-wrap')
if readContent == []:
textContent = readContentDiv.text.replace('
','\r\n')
textContent = textContent.replace('
','')
else:
for content in readContent:
if content.string == '':
print('error format')
else:
textContent += content.string + '\r\n'
return textContent
def writer(self, path, name='', content=''):
write_flag = True
with open(path, 'a', encoding='utf-8') as f: #a模式意为向同名文件尾增加文本
if name == None:
name=''
if content == None:
content = ''
f.write(name + '\r\n')
f.writelines(content)
f.write('\r\n')
if __name__ == '__main__':#执行层
target = 'https://book.qidian.com/info/1024995653#Catalog'
dlObj = downloader(target)
dlObj.GetChapterInfo()
print('开始下载:')
for i in range(dlObj.chapterNum):
try:
dlObj.writer( 'test.txt',dlObj.chapterNames[i], dlObj.GetChapterContent(dlObj.chapterHrefs[i]))
except Exception:
print('下载出错,已跳过')
pass
sys.stdout.write(" 已下载:%.3f%%" % float(i/dlObj.chapterNum) + '\r')
sys.stdout.flush()
print('下载完成')
原文链接:https://blog.csdn.net/weixin_47190827/article/details/113087316
python爬取起点小说_Python简单爬取起点中文网小说(仅学习)相关推荐
- python爬虫爬取今日头条_python 简单爬取今日头条热点新闻(一)
今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...
- python 实时数据推送_python scrapy 爬取金十数据并自动推送到微信
一.背景 因业务需要获取风险经济事件并采取应对措施,但因为种种原因又疏忽于每天去查看财经日历,于是通过爬取金十数据网站并自动推送到微信查看. 二.目标实现 image 三.环境与工具 1.pychar ...
- python怎么使用int四舍五入_python中如何取整数
首先,不得不提醒大家一个容易被忽视或者搞混的问题--一般的,0.5这种末尾是5的小数,四舍五入取整应进位.这个进位的意思是:-0.5 → -1:0.5 → 1.即正负情况不同,都向着远离0,使得绝对值 ...
- python最简单的爬取邮箱地址_python简单爬虫,抓取邮箱
最近,老师给了一个练习是,实现一个爬虫,就爬大概100个网页,匹配出邮箱. 于是,我花了几天时间,熟悉熟悉了python,就有了下面这个超级简单的爬虫程序.各种毛病...... 这里先说明一下,pyt ...
- python爬虫今日头条_python 简单爬取今日头条热点新闻(
今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...
- python爬取学校新闻_python爬虫爬取新闻的简单实现
我们通常是使用爬虫爬取网站信息,其实网络爬虫是一种应用于搜索引擎的程序.使用python爬虫可以将一个网站的所有内容与链接进行阅读.例如我们每日都要获取新闻信息,利用python爬虫就可以帮助我们爬取 ...
- python 头条 上传_python 简单爬取今日头条热点新闻(一)
今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...
- python爬虫今日头条_python 简单爬取今日头条热点新闻(一)
今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...
- python爬取豆瓣电影信息_Python|简单爬取豆瓣网电影信息
前言: 在掌握一些基础的爬虫知识后,就可以尝试做一些简单的爬虫来练一练手.今天要做的是利用xpath库来进行简单的数据的爬取.我们爬取的目标是电影的名字.导演和演员的信息.评分和url地址. 准备环境 ...
- python 爬取网页 通知消息_python简单爬取页面信息及实现打开、关闭浏览器
声明:本文仅是为了学习而举例说明python的强大,禁止用于不良目的! 1.python可以打开浏览器并浏览网页,并且保存网页内容到本地硬盘 实现代码如下: import urllib import ...
最新文章
- 对现有代码的分析方法随想
- java php mysql_系统学习javaweb13----MYSQL学习(使用PHP、SQL)1
- 获取收藏夹路径的C++代码
- 通过live555实现H264 RTSP直播(Windows版)
- 推荐10个Github热门Python库,非常实用!
- tidb vs mysql_一个长耗时SQL在TiDB和Mysql上的耗时测试
- 信息学奥赛一本通 1062:最高的分数 | OpenJudge NOI 1.5 05
- 319元!特斯拉卡车造型哨子发布 马斯克:快来买 别给苹果抛光布交智商税
- python测验4_Python小测试_4
- 3.剑指Offer --- 高质量的代码
- 【VRP】基于matlab蚁群算法求解多中心的车辆路径规划问题【含Matlab源码 111期】
- linux tcp 压力测试工具,技术|分布式TCP压力测试工具 tcpcopy
- Javascript中的运算符及其优先级顺序
- 程序员爱穿格子衫、秃头的刻板印象是如何形成的?
- html5 footer header,W3C HTML5标准阅读笔记 – header、footer、main、address
- SharePoint 2016 Search 定制开发简介系列七-Search Database with Security Trimming
- 交换字符使得字符串相同
- 程序员与颈椎病(一) 我得了什么病
- 考研不歧视双非的院校计算机专业,21考研,保护一志愿不歧视“双非”的30所学校,值得收藏!...
- 感性电路电流计算_第五讲 正弦交流电路分析
热门文章
- matlab画图函数基本使用(适合新手)
- matlab图像加椒盐噪声,用matlab给图像加高斯噪声和椒盐噪声(不调用imnoise函数)...
- HTTP请求方法及幂等性
- GIS应用实例--模型预测、多元回归、空间自相关分析
- PASCAL VOC2012数据集下载地址
- python vecm_用Eviews处理有关VARVECM模型的几个问题
- 智能雷达存在感知技术,家居场景方案应用,毫米波雷达探测方案
- excel解决线性规划求解问题
- c语言保留三位小数用float,float保留三位小数
- 基于模糊RBF神经网络轨迹跟踪matlab程序