python爬虫学习笔记1简易小说爬虫
学了 python 语法之后在 b 站搜索练手的小项目,发现了这个视频:Python 实用练手小项目(超简单)
视频里面讲解了一个爬取图片网站图片的小爬虫。后面用到了我还没学的数据库,不过前面的部分是已经学了的,于是我就打算写一个不用数据库的,爬取某个盗版小说内容的爬虫。
声明:本人不会将得到的小说内容作任何商业用途,也请阅读此文章的各位读者遵纪守法,此文章只用作学习交流,原创内容,转载请注明出处。
项目描述
爬虫,在我理解中就是模拟人的浏览行为来获取网站上的信息的脚本,爬虫能得到的信息,一般情况下人也有权限可以得到。
盗版小说网站,不需要登录就可以看到小说内容,内容是写死在 html 文件里面的,通过右键菜单的查看源代码
就能够查看到小说内容,很适合拿来练手。
再次声明:本人不会将得到的小说内容作任何商业用途,也请阅读此文章的各位读者遵纪守法,此文章只用作学习交流,原创内容,转载请注明出处。
思路
爬虫的思路是向服务器发出请求,并收到服务器回复的数据,接着从获取的数据中取得想要的信息,保存在数据库中。
由于是小说,就直接保存在文本文件当中。
所以分为以下几步:
- 发出请求
- 接收数据
- 提取信息
- 保存数据
编程原理
发出请求和接收数据
发出请求需要一个库,名字叫做requests
,它是基于 python 自带的urllib
库写的第三方库,差不多就是升级版的意思吧。
要注意是requests
,不是request
,结尾有个 s,确实存在一个不带 s 的库,注意区分。
可以使用下面的命令进行安装:
1 | pip install requests |
pip 是 Python 包管理工具,总之有了这个玩意,你不用管它从哪里下载,在哪里安装,总之就告诉它要安装啥,它就帮你安排得明明白白的。以后会遇到很多这样的东西,比如 npm 啥的。
命令在 cmd 里面输就行了,如果电脑上没有这东西就百度一下怎么下载,一般来说安装了 python 应该就有了。
如果使用的是 pyCharm 这种 IDE,那就可以直接在代码 import 这个库,等库的名字变红再在旁边找安装按钮,很方便的。
这个库里面有个 get 函数,是采用 get 的方式(除此之外还有 post 方式,学 html 表单的时候应该有学到)来向服务器发出访问请求,并将获得的数据作为返回值。
1 | import requests |
此时返回变量是请求对象,要从中获取数据,就需要使用它的两个属性text
和content
r.text
是数据的 html 形式,r.content
是字节流的形式。二者的区别
前者返回文本格式(即二进制格式经过编码后),后者返回二进制格式。后者一般用于图片的保存。
我们需要获取的是文本内容,因此需要前者。
1 | html=r.text |
提取信息
我们打开笔趣阁(一个盗版小说网站)的一个小说页面,随便选一章点进去,查看源代码,发现小说的内容是放在一个<div>
里面的:
1 | <div class="content" id="booktext"> |
其他章节也是如此,所以就可以利用这个规律将其提取出来,用的就是正则表达式。
正则表达式
使用正则表达式需要使用一个内置的库re
,根据上面的规律可以写出下面的正则表达式:
1 | import re |
编码转换
但是我写到这里的时候遇到了一个问题,就是获取到的内容是乱码。一看到乱码就应该想到是编码出了问题。
右键菜单查看网页编码,是GBK
编码,需要转换编码。现在的情况是,网页利用GBK
的编码来“加密”了小说文本,而我们需要用同样的方式来“解码”。需要用到decode
函数
1 | html=r.content.decode("GBK", "ignore")#转换编码 |
将获得的二进制数据按照网页原本的编码GBK
来解码,就能获取到正确的内容了。
去除分隔字符
此时提取到的内容还有这很多 HTML 实体,比如
和<br />
,注意到它们的分布也有规律:
1 | <div class="content" id="booktext"> |
除了开头和结尾之外,都是以<br /><br />
进行分隔的。
可以利用split()
函数将其分割之后重新组合,
也可以使用字符串的替换函数replace()
1 | content=content.replace("<br /><br /> ","\n\n ") |
保存数据
保存在文本文件中就 ok 了:
1 | with open(fileName,'w') as fout:#fileName为保存路径加文件名 |
获取单章节内容代码
1 | import requests |
获取全部章节内容的思路
盗版小说网站章节的 url 有个规律,就是 url 的最后一串数字是连续的,照这个规律,知道第一章的 url,就可以获得后续章节的 url。于是我着手写这么个函数:
1 | def getNovelByIndexInc(url, number=1): |
从我写的注释里面也可以看出,我失败了。
一开始的一百多章还是没什么问题的,只有偶尔几个网址是无效网址,但是后面爬取的时候等了十分钟还没爬取到下一章,一直输出“无效网址”,我查看了那断片的两个连续章节之后才发现,最后的一串数字差了几万。不会是因为作者断更吧!
这种方式不可靠,还是换一种方式。
那么要如何可以改进呢?
我写了另一个函数:
1 | def getNovelByContentPage(url,path='novel'): |
网站的书籍页面会有一个目录,而目录下隐藏的就是我需要的全部章节的链接呀!
这个函数用到的内容上面也都讲到了,就直接放代码吧。
获取全部章节内容的代码
1 | import requests |
python爬虫学习笔记1简易小说爬虫
https://yxchangingself.xyz/posts/python_spider_note1simple_spider/