Python实战之小说下载神器(完结)今天教你如何白嫖一款代码版资源丰富的小说App,海量资源免费看~(追书)

795 阅读4分钟

前言

这次的是一个系列内容  

给大家讲解一下何一步一步实现一个完整的实战项目案例系列之  

小说下载神器(完结)(GUI界面化程序) 

小说的搜索功能、小说下载器的GUI界面

爱看小伙伴想要一款资源丰富,好用的看小说的软件。

所以为大家做了一款Python版的小程序,这个系列内容已经到尾声了,上一期爬了小说排行榜

的所有小说内容采集,这一期的话终于到最后的阶段啦~

这一期的代码有点儿多,本来是分为两个内容文章的,想了下阅读量不行还是一次性写了吧,

下一期可以开点儿其他新鲜内容蛮~

本期主要内容:Python代码实现小说的搜索功能、小说下载器的GUI界面。

完整的源码💓免费自取👇👇厚台关注我滴滴我即可哦!

完整的源码💓免费自取👇👇厚台关注我滴滴我即可哦!

正文

一、实现小说的搜索功能

1)导入模块

# 导入数据请求模块 --> 第三方模块, 需要安装
import requests
# 导入正则表达式模块 --> 内置模块, 不需要安装
import re
# 导入数据解析模块 --> 第三方模块, 需要安装
import parsel
# 导入文件操作模块 --> 内置模块, 不需要安装
import os
# 导入漂亮的表格
import prettytable as pt

2)主程序

ef get_response(html_url):
    """
    发送请求函数
    :param html_url: 请求链接
    :return: response响应对象
    """
    # 模拟浏览器 headers 请求头
    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=html_url, headers=headers)
    return response


def get_list_url(html_url):
    """
    获取章节url/小说名
    :param html_url: 小说目录页
    :return:
    """
    # 调用发送请求函数
    html_data = get_response(html_url).text
    # 提取小说名字
    name = re.findall('<h1>(.*?)</h1>', html_data)[0]
    # 提取章节url
    url_list = re.findall('<dd> <a style="" href="(.*?)">', html_data)
    return name, url_list


def get_content(html_url):
    """
    获取小说内容/小说标题
    :param html_url: 小说章节url
    :return:
    """
    # 调用发送请求函数
    html_data = get_response(html_url).text
    # 提取标题
    title = re.findall('<h1>(.*?)</h1>', html_data)[0]
    # 提取内容
    content = re.findall('<div id="content">(.*?)<p>', html_data, re.S)[0].replace('<br/><br/>', '\n')
    return title, content


def save(name, title, content):
    """
    保存数据函数
    :param name: 小说名
    :param title: 章节名
    :param content: 内容
    :return:
    """
    # 自动创建一个文件夹
    file = f'{name}\\'
    if not os.path.exists(file):
        os.mkdir(file)
    with open(file + name + '.txt', mode='a', encoding='utf-8') as f:
        """
        第一章 标题
            小说内容
        第二章 标题
            小说内容
        """
        # 写入内容
        f.write(title)
        f.write('\n')
        f.write(content)
        f.write('\n')
    print(title, '已经保存')


def get_novel_id(html_url):
    """
    获取小说ID
    :param html_url: 某分类的链接
    :return:
    """
    # 调用发送请求函数
    novel_data = get_response(html_url=html_url).text
    selector = parsel.Selector(novel_data)
    href = selector.css('.l .s2 a::attr(href)').getall()
    href = [i.replace('/', '') for i in href]
    return href


def search(word):
    """
    搜索功能
    :param word: 书名/作者
    :return:
    """
    search_url = f'https://www.biqudu.net/searchbook.php?keyword={word}'
    # 发送请求
    search_data = get_response(html_url=search_url).text
    # 解析数据, 提取小说名字/作者/小说ID
    selector = parsel.Selector(search_data)
    lis = selector.css('.novelslist2 li')
    novel_info = []
    tb = pt.PrettyTable()
    tb.field_names = ['序号', '书名', '作者', '书ID']
    num = 0
    for li in lis[1:]:
        # 小说名字
        name = li.css('.s2 a::text').get()
        novel_id = li.css('.s2 a::attr(href)').get().replace('/', '')
        writer = li.css('.s4::text').get()
        dit = {
            'name': name,
            'writer': writer,
            'novel_id': novel_id,
        }
        tb.add_row([num, name, writer, novel_id])
        num += 1
        novel_info.append(dit)
    print('你搜索的结果如下:')
    print(tb)
    novel_num = input('请输入你想要下载的小说序号: ')
    novel_id = novel_info[int(novel_num)]['novel_id']
    return novel_id


def main(word):
    """
    主函数
    """
    novel_id = search(word)
    novel_url = f'https://www.biqudu.net/{novel_id}/'
    name, url_list = get_list_url(html_url=novel_url)
    print(name, url_list)
    for url in url_list:
        index_url = 'https://www.biqudu.net' + url
        title, content = get_content(html_url=index_url)
        save(name, title, content)



if __name__ == '__main__':
    word = input('请输入你搜索小说名: ')
    main(word)

3)效果展示

输入小说名——

小说下载中——

​二、小说下载器的GUI界面

1)主程序

import tkinter as tk
from tkinter import ttk



def show():
    name = name_va.get()
    print('输入的名字是:', name)

def download():
    name = num_va.get()
    print('输入的序号:', name)


# 创建界面
root = tk.Tk()
# 设置标题
root.title('小说下载器')
# 设置界面大小
root.geometry('500x500+200+200')
# 设置可变变量
name_va = tk.StringVar()
# 设置标签
search_frame = tk.Frame(root)
search_frame.pack(pady=10)
# 设置文本
tk.Label(search_frame, text='书名 作者', font=('微软雅黑', 15)).pack(side=tk.LEFT, padx=10)
# 设置输入框
tk.Entry(search_frame, relief='flat', textvariable=name_va).pack(side=tk.LEFT)

# 序号获取
num_va = tk.StringVar()
# 查询下载输入框
download_frame = tk.Frame(root)
download_frame.pack(pady=10)
# 设置文本
tk.Label(download_frame, text='小说 序号', font=('微软雅黑', 15)).pack(side=tk.LEFT, padx=10)
# 设置输入框
tk.Entry(download_frame, relief='flat', textvariable=num_va).pack(side=tk.LEFT)

# 按钮设置
button_frame = tk.Frame(root)
button_frame.pack(pady=10)

# 设置查询按钮
tk.Button(button_frame, text='查询', font=('微软雅黑', 10), relief='flat', bg='#88e2d6', width=10, command=show).pack(side=tk.LEFT, padx=10)
# 设置下载按钮
tk.Button(button_frame, text='下载', font=('微软雅黑', 10), relief='flat', bg='#88e2d6', width=10, command=download).pack(side=tk.LEFT, padx=10)

# 提前设置标签名字和中文显示内容
columns = ('num', 'writer', 'name', 'novel_id')
columns_value = ('序号', '作者', '书名', '书ID')
tree_view = ttk.Treeview(root, height=18, show='headings', columns=columns)
# 设置列名
# 设置列名
tree_view.column('num', width=40, anchor='center')
tree_view.column('writer', width=40, anchor='center')
tree_view.column('name', width=40, anchor='center')
tree_view.column('novel_id', width=40, anchor='center')
# 给列名设置显示的名字
tree_view.heading('num', text='序号')
tree_view.heading('writer', text='作者')
tree_view.heading('name', text='书名')
tree_view.heading('novel_id', text='书ID')
tree_view.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

2)效果展示

总结

今天小编终于把小说下载器的内容更完了鸭~全网小说免费看,软件界面简洁、功能全面,可以

让大家轻轻松松的遨游书海哦~下一期大家想看我写什么内容啦可评论区哦!

完整的源码💓免费自取👇👇厚台关注我滴滴我即可哦!

完整的源码💓免费自取👇👇厚台关注我滴滴我即可哦!