前言

实习期间自学了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简单爬取起点中文网小说(仅学习)相关推荐

  1. python爬虫爬取今日头条_python 简单爬取今日头条热点新闻(一)

    今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...

  2. python 实时数据推送_python scrapy 爬取金十数据并自动推送到微信

    一.背景 因业务需要获取风险经济事件并采取应对措施,但因为种种原因又疏忽于每天去查看财经日历,于是通过爬取金十数据网站并自动推送到微信查看. 二.目标实现 image 三.环境与工具 1.pychar ...

  3. python怎么使用int四舍五入_python中如何取整数

    首先,不得不提醒大家一个容易被忽视或者搞混的问题--一般的,0.5这种末尾是5的小数,四舍五入取整应进位.这个进位的意思是:-0.5 → -1:0.5 → 1.即正负情况不同,都向着远离0,使得绝对值 ...

  4. python最简单的爬取邮箱地址_python简单爬虫,抓取邮箱

    最近,老师给了一个练习是,实现一个爬虫,就爬大概100个网页,匹配出邮箱. 于是,我花了几天时间,熟悉熟悉了python,就有了下面这个超级简单的爬虫程序.各种毛病...... 这里先说明一下,pyt ...

  5. python爬虫今日头条_python 简单爬取今日头条热点新闻(

    今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...

  6. python爬取学校新闻_python爬虫爬取新闻的简单实现

    我们通常是使用爬虫爬取网站信息,其实网络爬虫是一种应用于搜索引擎的程序.使用python爬虫可以将一个网站的所有内容与链接进行阅读.例如我们每日都要获取新闻信息,利用python爬虫就可以帮助我们爬取 ...

  7. python 头条 上传_python 简单爬取今日头条热点新闻(一)

    今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...

  8. python爬虫今日头条_python 简单爬取今日头条热点新闻(一)

    今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...

  9. python爬取豆瓣电影信息_Python|简单爬取豆瓣网电影信息

    前言: 在掌握一些基础的爬虫知识后,就可以尝试做一些简单的爬虫来练一练手.今天要做的是利用xpath库来进行简单的数据的爬取.我们爬取的目标是电影的名字.导演和演员的信息.评分和url地址. 准备环境 ...

  10. python 爬取网页 通知消息_python简单爬取页面信息及实现打开、关闭浏览器

    声明:本文仅是为了学习而举例说明python的强大,禁止用于不良目的! 1.python可以打开浏览器并浏览网页,并且保存网页内容到本地硬盘 实现代码如下: import urllib import ...

最新文章

  1. 对现有代码的分析方法随想
  2. java php mysql_系统学习javaweb13----MYSQL学习(使用PHP、SQL)1
  3. 获取收藏夹路径的C++代码
  4. 通过live555实现H264 RTSP直播(Windows版)
  5. 推荐10个Github热门Python库,非常实用!
  6. tidb vs mysql_一个长耗时SQL在TiDB和Mysql上的耗时测试
  7. 信息学奥赛一本通 1062:最高的分数 | OpenJudge NOI 1.5 05
  8. 319元!特斯拉卡车造型哨子发布 马斯克:快来买 别给苹果抛光布交智商税
  9. python测验4_Python小测试_4
  10. 3.剑指Offer --- 高质量的代码
  11. 【VRP】基于matlab蚁群算法求解多中心的车辆路径规划问题【含Matlab源码 111期】
  12. linux tcp 压力测试工具,技术|分布式TCP压力测试工具 tcpcopy
  13. Javascript中的运算符及其优先级顺序
  14. 程序员爱穿格子衫、秃头的刻板印象是如何形成的?
  15. html5 footer header,W3C HTML5标准阅读笔记 – header、footer、main、address
  16. SharePoint 2016 Search 定制开发简介系列七-Search Database with Security Trimming
  17. 交换字符使得字符串相同
  18. 程序员与颈椎病(一) 我得了什么病
  19. 考研不歧视双非的院校计算机专业,21考研,保护一志愿不歧视“双非”的30所学校,值得收藏!...
  20. 感性电路电流计算_第五讲 正弦交流电路分析

热门文章

  1. matlab画图函数基本使用(适合新手)
  2. matlab图像加椒盐噪声,用matlab给图像加高斯噪声和椒盐噪声(不调用imnoise函数)...
  3. HTTP请求方法及幂等性
  4. GIS应用实例--模型预测、多元回归、空间自相关分析
  5. PASCAL VOC2012数据集下载地址
  6. python vecm_用Eviews处理有关VARVECM模型的几个问题
  7. 智能雷达存在感知技术,家居场景方案应用,毫米波雷达探测方案
  8. excel解决线性规划求解问题
  9. c语言保留三位小数用float,float保留三位小数
  10. 基于模糊RBF神经网络轨迹跟踪matlab程序