最近有小伙伴吐槽,
有些小说下载下来后发现是图片章节,
白下载了,问我怎么处理?
这还不简单,加个文字识别不就好了。
所以今天咱们来展示一下怎么将小说爬下来,再识别成文字保存。
话不多说,开搞!
Python 3.8
Pycharm
requests >>> 数据请求模块
parsel >>> 数据解析模块
re 正则表达式
equests 是第三方模块,需要手动安装,
在CMD里面进行安装 输入安装命令 pip install 模块名。
如果平时下载模块慢,可以切换国内镜像源。
安装python第三方模块最快捷的有两种方法
安装失败原因
失败一
pip 不是内部命令
解决方法: 设置环境变量
失败二
出现大量报红 (read time out)
解决方法: 因为是网络链接超时, 需要切换镜像源。
清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:https://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:https://pypi.hustunique.com/
山东理工大学:https://pypi.sdutlinux.org/
豆瓣:https://pypi.douban.com/simple/
例如:pip install -i https://pypi.doubanio.com/simple/ 模块名
失败三
cmd里面显示已经安装过了, 或者安装成功了, 但是在pycharm里面还是无法导入。
解决方法: 可能安装了多个python版本 (anaconda 或者 python 安装一个即可) 卸载一个就好,或者你pycharm里面python解释器没有设置好。
F12 开发者工具进行抓包分析,
打开 F12 或者 鼠标右键点击检查 刷新网页,
点击搜索按钮,输入搜索内容,点击回车找到数据包。
请求 https://b.f a l oo.com/631 781_1.html 这个网址, 就可以得到我们想要小说内容。
发送请求, 模拟浏览器对于 https://b.faloo.com/631781_1.html 发送请求
获取数据, 获取服务器返回响应数据 —> 开发者工具里面response
解析数据,提取我们想要数据内容,小说章节名字
保存数据,保存本地文件。
模块导入
# 导入数据请求模块
import requests
# 导入数据解析模块
import parsel
# 导入获取VIP章节代码
import Vip
# 导入图片文字识别代码
import spot
# 导入os模块
import os
发送请求
模拟浏览器对于 https://b.faloo.com/631781_1.html 发送请求
为什么使用的是 requests.get ?
根据开发者工具里面所看到请求方式, 浏览器是什么请求方式, 我们代码当中就使用什么请求方式
爬虫代码要伪装成浏览器发送请求
添加headers请求,你不加请求头, 不伪装, 你就会被识别出来你是爬虫程序, 从而得到你想要的内容,被反爬了。
# 目录页url地址
link = 'https://地址我先屏蔽了,不然不给过com/631781.html'
# 请求头参数 ---> 在开发者工具复制粘贴的
# 复制这个替换掉上面地址中的中文 b.faloo
headers = {
# User-Agent 表示浏览器基本身份信息
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
# 发送请求 ---> 响应对象
html_data = requests.get(url=link, headers=headers).text
# 目录页url地址
link = 'https://b.faloo.com/631781.html'
# 请求头参数 ---> 在开发者工具复制粘贴的
headers = {
# User-Agent 表示浏览器基本身份信息
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
# 发送请求 ---> 响应对象
html_data = requests.get(url=link, headers=headers).text
# 转成可解析对象
selector = parsel.Selector(html_data)
# 获取小说名字
name = selector.css('#novelName::text').get()
# 获取所有章节url地址 ---> .DivTd a 还是定位标签 attr(href) 获取标签里面href属性
href = selector.css('.DivTd a::attr(href)').getall()[58:100]
获取数据
获取服务器返回响应数据 —>
开发者工具里面 response 响应文本数据 print(response.text)
for index in href:
# 确定请求链接
url = f'https:{index}'
# 请求头参数 ---> 在开发者工具复制粘贴的
headers = {
# User-Agent 表示浏览器基本身份信息
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
# 发送请求 ---> 响应对象
response = requests.get(url=url, headers=headers)
解析数据
提取我们想要数据内容, 小说 小说章节名字
撤回 ctrl + z
得到的 response.text 响应文本数据 字符串数据类型 需要转换一下数据类型
解析方法: css选择器 —> 根据标签属性内容提取数据
css语法不会, 没有关系, 只要你会 ctrl + c / v
# 转成可解析对象
selector = parsel.Selector(response.text)
# 提取小说章节标题 --> .nr_center .c_left .c_l_title h1 css语法用于定位标签 ::text 获取标签文本内容
title = selector.css('.nr_center .c_left .c_l_title h1::text').get()
# 提取小说内容 --> 获取所有 getall
content_list = selector.css('div.noveContent p::text').getall()
if len(content_list) != 0:
# 保存文本数据, 保存字符串数据类型 需要把列表转成字符串 str(content_list)强制转换
content = '\n'.join(content_list) # 用\n (换行符) 把 content_list (列表) 合并成一个字符串数据
保存数据, 保存本地文件
# 打开文件 进行保存
with open(name + '.txt', mode='a', encoding='utf-8') as f:
# 写入数据
f.write(title)
f.write('\n')
f.write(content)
f.write('\n')
print('成功保存: ',title)
else:
img_content = Vip.get_vip_img(link=url)
with open('img\\' + title + '.png', mode='wb') as img_f:
img_f.write(img_content)
print('成功保存: ',title)
图片文字识别,返回文字内容
files = os.listdir('img\\')
for file in files:
img_file = 'img\\' + file
novel_title = file.replace('.png', '')
novel_content = spot.get_vip_content(file=img_file)
with open(name + '.txt', mode='a', encoding='utf-8') as f:
# 写入数据
f.write(novel_title)
f.write('\n')
f.write(novel_content)
f.write('\n')
好了,今天的分享就到这里,全部代码下方名片获取。