• Python:50行代码实现下载小说,图片章节可自动识别转文字保存...


    最近有小伙伴吐槽,有些小说下载下来后发现是图片章节,白下载了,问我怎么处理?

    这还不简单,加个文字识别不就好了。

    所以今天咱们来展示一下怎么将小说爬下来,再识别成文字保存。

    话不多说,开搞!

    一、准备工作

    1、环境使用

    Python 3.8
    Pycharm
    
    • 1
    • 2

    2、模块使用

    requests >>> 数据请求模块
    parsel >>> 数据解析模块
    re 正则表达式
    
    • 1
    • 2
    • 3

    requests 是第三方模块,需要手动安装,在CMD里面进行安装 输入安装命令 pip install 模块名。如果平时下载模块慢,可以切换国内镜像源

    3、模块安装问题

    安装python第三方模块最快捷的有两种方法

    第一种: win + R 输入 cmd 点击确定,输入安装命令 pip install 模块名 (pip install requests) 回车。

    第二种: 在pycharm中点击Terminal(终端) 输入安装命令

    安装失败原因

    失败一

    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/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    例如:pip install -i https://pypi.doubanio.com/simple/ 模块名

    失败三

    cmd里面显示已经安装过了, 或者安装成功了, 但是在pycharm里面还是无法导入。

    解决方法: 可能安装了多个python版本 (anaconda 或者 python 安装一个即可) 卸载一个就好,或者你pycharm里面python解释器没有设置好。

    4、如何配置pycharm里面的python解释器?

    1. 选择file(文件) >>> setting(设置) >>> Project(项目) >>> python interpreter(python解释器)
    2. 点击齿轮, 选择add
    3. 添加python安装路径

    5、pycharm如何安装插件?

    1. 选择file(文件) >>> setting(设置) >>> Plugins(插件)
    2. 点击 Marketplace 输入想要安装的插件名字 比如:翻译插件 输入 translation / 汉化插件 输入 Chinese
    3. 选择相应的插件点击 install(安装) 即可
    4. 安装成功之后 是会弹出 重启pycharm的选项 点击确定, 重启即可生效

    二、案例思路/基本流程

    1、分析我们想要数据内容来自于哪里

    F12 开发者工具进行抓包分析,打开 F12 或者 鼠标右键点击检查 刷新网页,点击搜索按钮,输入搜索内容,点击回车找到数据包。

    请求 https://b.faloo.com/631781_1.html 这个网址, 就可以得到我们想要小说内容。

    2、代码实现步骤

    • 发送请求, 模拟浏览器对于 https://b.faloo.com/631781_1.html 发送请求
    • 获取数据, 获取服务器返回响应数据 —> 开发者工具里面response
    • 解析数据,提取我们想要数据内容,小说章节名字
    • 保存数据,保存本地文件。

    3、代码展示

    模块导入

    # 导入数据请求模块
    import requests
    # 导入数据解析模块
    import parsel
    # 导入获取VIP章节代码
    import Vip
    # 导入图片文字识别代码
    import spot
    # 导入os模块
    import os
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    发送请求

    模拟浏览器对于 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]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    获取数据

    获取服务器返回响应数据 —> 开发者工具里面 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    解析数据

    提取我们想要数据内容, 小说 小说章节名字
    撤回 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 (列表) 合并成一个字符串数据
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    保存数据, 保存本地文件

            # 打开文件 进行保存
            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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    图片文字识别,返回文字内容

    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')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    好了,今天的分享就到这里,全部代码下方名片获取。

    最后推荐一套Python教程, 涵盖了常见的大部分案例实战,非常详细~
    代码总是学完就忘记?100个爬虫实战项目!让你沉迷学习丨学以致用丨下一个Python大神就是你!

  • 相关阅读:
    Ubuntu Qt 5.15.2 支持 aarch64
    2023版一线大厂Java面试八股文(最新版)1000+ 面试题附答案详解,最全面详细
    dolphinscheduler
    在职场我们该具备哪些能力
    代码随想录算法训练营第49天|121. 买卖股票的最佳时机,买卖股票的最佳时机II
    技术应用:使用 FastJSON 作为 RedisTemplate 序列化器:禁用循环引用检测和类名序列化
    基于YOLOv8深度学习的脑肿瘤智能检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测、智慧医疗
    img 响应式图片的实现(含srcset属性、sizes属性的使用方法,设备像素比详解)
    springboot+校园超市管理系统的设计与实现 毕业设计 -附源码201521
    Day43:LeedCode 1049. 最后一块石头的重量 II 494. 目标和 474.一和零
  • 原文地址:https://blog.csdn.net/fei347795790/article/details/126507978