问题

python课上,老师给同学们布置了一个问题,因为这节课上学的是正则表达式,所以要求利用python爬取小说网的任意小说并保存到文件。

我选的网站的URL是‘https://www.biqukan.com/0_159/’

解决方法

首先先思考解决方式。

  1. 先获取到网页源码,从源码中找出小说的名字和目录结构
  2. 创建文件保存的目录,目录名是小说名
  3. 从网页代码中获取小说的目录列表
  4. 循环遍历目录,获取目录中每篇的超链接和文章标题
  5. 如果是超链接就继续发请求访问从而获取这章小说的正文
  6. 将正文写入创建好的目录,文件名是这章小说的标题名

使用之前需要导入相关的模块,requests模块,re正则的模块,os模块
导入有好几种,这里介绍的是在命令窗口中导入

以管理员的身份打开命令窗口。


2、输入pip install requests 下载安装requests模块,同样的方式安装剩余模块。


r = requests.get(url)
# 向URL发起get请求,r是返回的对象
r.text就是响应的网页源代码
r.encoding=r.apparent_encoding
  • 这里的encoding指的是对响应结果的编码格式,如果head中没有charset指明编码格式,那么默认是ISO-8859-1,r.text根据encoding编码响应内容;
  • apparent_encding是 响应头的编码格式。从网页源代码中可以找出编码方式。
    字符编码方式

    r.raise_for_status()
    如果status_code不是200,产生异常requests.HTTPError;这是HTTP错误。
    该语句便于利用try-except进行异常处理。

正则表达式re.findall()方法返回的是一个list集合,关于正则表达式的一些字符。
.代表匹配除换行外的任意字符,*代表匹配一次到N次,?代表采用非贪婪模式匹配,不加?默认是贪婪模式进行匹配。

输入小说的链接,按下F12,查看源代码,检查元素,或是点

最左边的按钮,找到小说的名字,这时他在h2标签体中;
因此

name = re.findall(r'<h2>(.*?)</h2>',r.text)[0]

因为findall返回的是一个list集合,但是匹配到的只有小说名字一个元素,所以[0]就直接获取了小说名字 ‘三寸人间’

然后创建目录,先判断保存小说的目录存不存在,如果已存在不用创建,如果不存在再创建。这里目录名字就是小说名。

创建完目录后,继续获取小说的目录列表。

由上图可知,目录都在标签<dl></dl>中,
因此

novleList = re.findall(r'<dl>(.*?)</dl>',html,re.S)[0]

获取目录列表集合,

然后我们要的是a标签找连接里面的内容和href属性值。
在对他进行匹配。得到如下

剩下的就是遍历集合,取出超链接的href和标题,进而访问href,访问的时候需要加上网站的前缀,https://www.biqukan.com/。然后得到正文的返回结果。

想要获取小说内容采用正则匹配,以</script>开头,以<script>结尾。取中间内容。

content = re.findall(r'<script>app2.*?</script>(.*?)<script>',chapterHtml.text,re.S)

最后在保存前需要注意的是,小说中有空格和换行等HTML代码,需要将其替换成相应的格式,保存的时候一定不要忘了编码格式!!!

完整代码如下

import re
import requests
import os # 将要爬取的url
url = 'https://www.biqukan.com/0_159/' """
1. 获取小说名字
2. 创建保存小说的目录
3. 从网页代码中获取小说的目录列表
4. 循环遍历目录,获取每篇的标题,每篇的超链接,如果是超链接就继续请求,进而获取文章内容,最后创建文件将章节写入 """
# 1.获取小说名
def getNovelName(url):
r = requests.get(url)
# 打印状态码
print(r.status_code)
try:
r.raise_for_status()
r.encoding = r.apparent_encoding
html = r.text
name = re.findall(r'<h2>(.*?)</h2>', html)[0]
except:
return '获取失败'
return name dirName = getNovelName(url)
#2. 保存小说的路径
path = 'D://workspace//python//reptile//work9_regular/'+dirName #. 创建一个保存小说的目录
def createDir(path):
try:
if not os.path.exists(path):
os.mkdir(dirName)
else:
print('该文件夹已存在')
except:
print('创建文件失败!')
#3. 创建目录
createDir(path) def getHtml(url):
r = requests.get(url)
r.encoding=r.apparent_encoding
if r.status_code==200:
return r.text # 获取小说主页源代码
html = getHtml(url) #4. 获取目录列表
novleList = re.findall(r'<dl>(.*?)</dl>',html,re.S)[0]
#5. 获取目录中的链接和标题
alls = re.findall(r'<a href ="(.*?)">(.*?)</a>',novleList,re.S) def writeToFile(alls,path):
# 遍历目录下的标题和链接,继续访问链接获取内容
for item in alls:
hrefs = item[0] # 超链接地址
title = item[1] # 标题 chapterHtml = requests.get('https://www.biqukan.com/'+hrefs)
chapterHtml.encoding=chapterHtml.apparent_encoding
content = re.findall(r'<script>app2.*?</script>(.*?)<script>',chapterHtml.text,re.S)[0]
content = content.replace('<br />','\n') # 替换换行
content = content.replace('\u3000','\t') # 替换制表
content = content.replace('&nbsp;',' ') # 替换空格
f = open(path+'/'+title+'.txt','w',encoding='utf-8') # 注意编码方式
f.write(content) # 6.写入文件
writeToFile(alls,path)

本人初学者,以上有错误的地方欢迎批评指正,有更好的想法的欢迎评论交流!

最后成功保存下来的截图!

Python3爬取小说并保存到文件的更多相关文章

  1. python3下BeautifulSoup练习一(爬取小说)

    上次写博客还是两个月以前的事,今天闲来无事,决定把以前刚接触python爬虫时的一个想法付诸行动:就是从网站上爬取小说,这样可以省下好多流量(^_^). 因为只是闲暇之余写的,还望各位看官海涵:不足之 ...

  2. python3爬取女神图片,破解盗链问题

    title: python3爬取女神图片,破解盗链问题 date: 2018-04-22 08:26:00 tags: [python3,美女,图片抓取,爬虫, 盗链] comments: true ...

  3. Python3 爬取微信好友基本信息,并进行数据清洗

    Python3 爬取微信好友基本信息,并进行数据清洗 1,登录获取好友基础信息: 好友的获取方法为get_friends,将会返回完整的好友列表. 其中每个好友为一个字典 列表的第一项为本人的账号信息 ...

  4. Python实战项目网络爬虫 之 爬取小说吧小说正文

    本次实战项目适合,有一定Python语法知识的小白学员.本人也是根据一些网上的资料,自己摸索编写的内容.有不明白的童鞋,欢迎提问. 目的:爬取百度小说吧中的原创小说<猎奇师>部分小说内容 ...

  5. python3爬取网页

    爬虫 python3爬取网页资源方式(1.最简单: import'http://www.baidu.com/'print2.通过request import'http://www.baidu.com' ...

  6. python爬虫——爬取小说 | 探索白子画和花千骨的爱恨情仇(转载)

    转载出处:药少敏   ,感谢原作者清晰的讲解思路! 下述代码是我通过自己互联网搜索和拜读完此篇文章之后写出的具有同样效果的爬虫代码: from bs4 import BeautifulSoup imp ...

  7. Python3爬取人人网(校内网)个人照片及朋友照片,并一键下载到本地~~~附源代码

    题记: 11月14日早晨8点,人人网发布公告,宣布人人公司将人人网社交平台业务相关资产以2000万美元的现金加4000万美元的股票对价出售予北京多牛传媒,自此,人人公司将专注于境内的二手车业务和在美国 ...

  8. python3爬取微博评论并存为xlsx

    python3爬取微博评论并存为xlsx**由于微博电脑端的网页版页面比较复杂,我们可以访问手机端的微博网站,网址为:https://m.weibo.cn/一.访问微博网站,找到热门推荐链接我们打开微 ...

  9. python3爬取全民K歌

    Python3爬取全民k歌 环境 python3.5 + requests 1.通过歌曲主页链接爬取 首先打开歌曲主页,打开开发者工具(F12). 选择Network,点击播放,会发现有一个请求返回的 ...

随机推荐

  1. 【Codeforces 1083C】Max Mex(线段树 & LCA)

    Description 给定一颗 \(n\) 个顶点的树,顶点 \(i\) 有点权 \(p_i\).其中 \(p_1,p_2,\cdots, p_n\) 为一个 \(0\sim (n-1)\) 的一个 ...

  2. 【学习笔记】使用 bitset 求解较高维偏序问题

    求解五维偏序 给定 \(n(\le 3\times 10^4)\) 个五元组,对于每个五元组 \((a_i, b_i, c_i, d_i, e_i)\),求存在多少个 \(1\le j\le n\) ...

  3. IDEA注册码(附修改hosts文件的方法)

    推荐获取IDEA注册码的网站:http://idea.lanyus.com/ 亲测好用! 也可复制下边的注册码: K71U8DBPNE-eyJsaWNlbnNlSWQiOiJLNzFVOERCUE5F ...

  4. Java-Word转PDF

    1. 下载jar包或者引入pom.xml 下载:https://www.e-iceblue.cn/Downloads/Free-Spire-Doc-JAVA.html 引入pom.xml:https: ...

  5. apt-get could not get lock /var/lib/dpkg/lock报错

    用apt-get命令安装一些软件包时,报这个错 could not get lock /var/lib/dpkg/lock 出现这个问题的原因可能是有另外一个程序正在运行,导致资源被锁不可用.而导致资 ...

  6. K8S安装Kubesphere

    准备工作 安装Helm curl -L https://git.io/get_helm.sh | bash 创建账户 cat > heml-rbac.yaml << EOF apiV ...

  7. css 11-CSS3属性详解(一)

    11-CSS3属性详解(一) #前言 我们在上一篇文章中学习了CSS3的选择器,本文来学一下CSS3的一些属性. 本文主要内容: 文本 盒模型中的 box-sizing 属性 处理兼容性问题:私有前缀 ...

  8. js上 十六、数组-2

    十六.数组-2 #4.3万能法:splice(): #4.3.1.删除功能 ​ 语法:arr.splice(index,num); //num表示删除的长度 ​ 功能:从下标index位置开始,删除n ...

  9. Python高级语法-私有属性-with上下文管理器(4.7.3)

    @ 目录 1.说明 2.代码 关于作者 1.说明 上下文管理器 这里使用with open操作文件,让文件对象实现了自动释放资源.我们也能自定义上下文管理器,通过__enter__()和__exit_ ...

  10. netsniff恶意流量识别和匹配解读

    代码整体框架 流量扫描函数调用 加载配置文件的代码调用 获取扫描的条数 重点匹配函数 流量eg:'\x00\x04\x00\x01\x00\x06\x00\x16>\x10\x1d>SW\ ...