接上章,上章写了如何解决爬取到的内容乱码的问题,本章主要是写一个爬取单章小说的模板
完整代码如下:
# 导入requests 包
import requests
# 导入解析模块
import parsel
'''
爬取网页内容
'''
# 发送请求
x = requests.get('https://www.513gp.org/book/5105/235222.html')
x.encoding = 'gbk'
# 返回网页内容
print(x.text)
'''
解析数据
'''
# 用parsel的Selector这个类来声明一个selector对象,传入了网页爬到的内容
selector = parsel.Selector(x.text)
# 使用css方法提取特定的内容,提取方法为:选中网页中要提取的文本,复制对应的selector,提取文本需要再加上::text
# 提取标题
# get方法:获取第一个Selector对象里的内容
title = selector.css('body > div.chaptertitle.clearfix > h1::text').get()
# 提取内容
# getall方法:依次获取每个Selector对象对应的结果
content_list =selector.css('#BookText::text').getall()
'''
join()方法
描述:用于将序列中的元素以指定的字符连接生成一个新的字符串
语法:str.join(sequence)
参数:sequence--要连接的元素序列
返回值:返回通过指定字符连接序列中元素生成的新字符串
'''
# 转成字符串
content = ''.join(content_list)
# 打印文本内容
print(content)
'''
保存数据
1、路径前的 fr 的含义:
r:把字符串转变为非转义的原始字符串
f:在字符串前加 f 是把字符串格式化,使可以在字符串中直接使用变量。
例:
a = 'python'
print(f'hello {a})
结果:hello python
2、mode=:保存方式
w 写入数据(会覆盖) a 追加保存(不会覆盖)
3、encoding=:文件的编码格式
'''
with open(fr'D:\2\python\pycharm\PycharmProjects\爬虫\结果\{title}.txt', mode='w', encoding='utf-8') as f:
# 写入文件的标题
f.write(title)
f.write('\n')
# 写入内容
f.write(content)
f.write('\n')
主要分为了3个部分
1、爬取网页内容
使用上一章学习到的requests模块爬取网页的内容,url地址为想爬取的网页的网址;编码格式为 gbk ;然后打印从这个网页上爬取到的内容
# 发送请求
x = requests.get('https://www.513gp.org/book/5105/235222.html')
x.encoding = 'gbk'
# 返回网页内容
print(x.text)
2、数据解析
从网页上爬取的的内容其实看不太懂,这个时候就需要使用 parsel 模块对网页内容进行解析
首先,用parsel的Selector这个类来声明一个selector对象,传入了网页爬到的内容
然后提取标题,使用css方法
提取内容,使用css方法。注意要使用getall方法,否则提取到的就只有一个段落而不是全篇了
提取到的内容连在一起,分不清段落,使用join()方法重新生成字符串
打印文本
# 用parsel的Selector这个类来声明一个selector对象,传入了网页爬到的内容
selector = parsel.Selector(x.text)
# 使用css方法提取特定的内容,提取方法为:选中网页中要提取的文本,复制对应的selector,提取文本需要再加上::text
# 提取标题
# get方法:获取第一个Selector对象里的内容
title = selector.css('body > div.chaptertitle.clearfix > h1::text').get()
# 提取内容
# getall方法:依次获取每个Selector对象对应的结果
content_list =selector.css('#BookText::text').getall()
'''
join()方法
描述:用于将序列中的元素以指定的字符连接生成一个新的字符串
语法:str.join(sequence)
参数:sequence--要连接的元素序列
返回值:返回通过指定字符连接序列中元素生成的新字符串
'''
# 转成字符串
content = ''.join(content_list)
# 打印文本内容
print(content)
3、保存数据
将文本保存在指定的路径下。
路径可分为相对路径和绝对路径
相对路径:代码在哪就保存在哪
with open(title + '.txt', mode='w', encoding='utf-8') as f:
# with open(fr'D:\2\python\pycharm\PycharmProjects\爬虫\结果\{title}.txt', mode='w', encoding='utf-8') as f:
# 写入文件的标题
f.write(title)
f.write('\n')
# 写入内容
f.write(content)
f.write('\n')
绝对路径:指定哪个盘 哪个文件夹
# with open(title + '.txt', mode='w', encoding='utf-8') as f:
with open(fr'D:\2\python\pycharm\PycharmProjects\爬虫\结果\{title}.txt', mode='w', encoding='utf-8') as f:
# 写入文件的标题
f.write(title)
f.write('\n')
# 写入内容
f.write(content)
f.write('\n')
'''
保存数据
1、路径前的 fr 的含义:
r:把字符串转变为非转义的原始字符串
f:在字符串前加 f 是把字符串格式化,使可以在字符串中直接使用变量。
例:
a = 'python'
print(f'hello {a})
结果:hello python
2、mode=:保存方式
w 写入数据(会覆盖) a 追加保存(不会覆盖)
3、encoding=:文件的编码格式
'''
with open(fr'D:\2\python\pycharm\PycharmProjects\爬虫\结果\{title}.txt', mode='w', encoding='utf-8') as f:
# 写入文件的标题
f.write(title)
f.write('\n')
# 写入内容
f.write(content)
f.write('\n')