问题
python课上,老师给同学们布置了一个问题,因为这节课上学的是正则表达式,所以要求利用python爬取小说网的任意小说并保存到文件。
我选的网站的URL是
‘https://www.biqukan.com/0_159/’
解决方法
首先先思考解决方式。
- 先获取到网页源码,从源码中找出小说的名字和目录结构
- 创建文件保存的目录,目录名是小说名
- 从网页代码中获取小说的目录列表
- 循环遍历目录,获取目录中每篇的超链接和文章标题
- 如果是超链接就继续发请求访问从而获取这章小说的正文
- 将正文写入创建好的目录,文件名是这章小说的标题名
使用之前需要导入相关的模块,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]就直接获取了小说名字 ‘三寸人间’
然后创建目录,先判断保存小说的目录存不存在,如果已存在不用创建,如果不存在再创建。这里目录名字就是小说名。
创建完目录后,继续获取小说的目录列表。