用Python打造一款非常实用的小说下载器,只需链接,即可一键下载

2022-03-30 20:28:41 浏览数 (4)

前言

今天教大家自己打造一款非常实用的小说下载器,让你轻轻松松看小说 本次的小说下载代码就不介绍了,这不是有手就行?小说的代码放在文末 这次主要是教大家如何做一个下载器的界面,如下图

知识点

  • tkinter

开发环境

  • 版 本:Python 3.8 |Anaconda, Inc.|
  • 编辑器:pycharm 2021.2

现在来写界面的代码

先创建一个窗口

代码语言:javascript复制
import tkinter

if __name__ == '__main__':
    # 窗口对象
    root = tkinter.Tk()

    # 事件循环
    root.mainloop()

绘制窗口界面

代码语言:javascript复制
class Query:
    def __init__(self, master):
        # 类里面固定的一个方法
        self.root = master
        # 设置窗口对象的大小
        self.root.geometry('600x500 100 100')
        # 设置窗口的标题
        self.root.title('笔趣阁小说下载')
        # 设置窗口的图标
        self.root.iconbitmap('favicon.ico')

        # tkinter 的特殊变量,可以与组件里面的文字进行绑定
        self.index_url = tkinter.StringVar()

        self.create_page()
        self.handle_event()

创建界面,设置点击按钮

代码语言:javascript复制
def create_page(self):
    # label 文本框
    tkinter.Label(self.root, text='请输入你想要的下载的小说的目录页链接').place(x=30, y=30)
    # 输入框 entry 只是布局了一个控件
    tkinter.Entry(self.root, width=70, textvariable=self.index_url).place(x=30, y=60)
    # 保存路径
    tkinter.Label(self.root, text='保存路径').place(x=30, y=90)
    # # 路径标签
    tkinter.Entry(self.root).place(x=30, y=120)
    self.button1 = tkinter.Button(self.root, text='浏览', width=6, height=1)
    self.button1.place(x=200, y=120)

    self.button2 = tkinter.Button(self.root, text='下载', width=6, height=1)
    self.button2.place(x=350, y=120)

    self.button3 = tkinter.Button(self.root, text='清空', width=6, height=1)
    self.button3.place(x=450, y=120)

    # 文本框
    self.text = tkinter.Text(self.root, width=70, height=22)
    self.text.place(x=30, y=160)

调用小说代码,并设置点击事件

代码语言:javascript复制
def handle_event(self):
    # 点击下载,就开始下载小说
    # 拿到需要的链接,
    # 当下载按钮被点击的时候,获取下载地址,然后再进行下载
    self.button2['command'] = self.download_book

def download_book(self):
    book_url = self.index_url.get()
    if book_url:
        print(book_url)
        # 下载小说逻辑之前公开课已经实现过了,直接导入使用
        # 调用方法,获取每一章的下载地址
        links = get_book_links(book_url)
        for link in links:
            print(book_url   link)
            # 调用现有的逻辑,实现一章小说的下载
            title, text = download_one_chapter(book_url   link)
            save_text(title, text)
            # 把下载的信息插入的 text 文本框里面去
            # 第0行,第0个
            self.text.insert(0.0, f'{title} 下载成功n')
            self.text.update()
    else:
        messagebox.showinfo(title='提示', message='下载链接不能为空')

这是小说下载代码

代码语言:javascript复制
import requests
import parsel

# 获取网页源代码
# 模拟浏览器发送请求
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}

def download_one_chapter(target_url):
    # 需要请求的网址
    # target_url = 'http://www.shuquge.com/txt/8659/2324753.html'
    response = requests.get(target_url, headers=headers)

    # 解码 万能解码
    response.encoding = response.apparent_encoding

    # 文字方法 获取网页文字内容
    # print(response.text)
    # 字符串
    html = response.text

    # 从网页源代码里面拿到信息
    # 使用parsel 把字符串变成对象
    sel = parsel.Selector(html)


    # 数据清除 清除空白字符串
    # 列表推导式
    contents1 = [content.strip() for content in contents]
    # print(contents1)
    # 把列表编程字符串
    text = 'n'.join(contents1)
    # print(text)
    return title, text


def save_text(title, text):
    # 保存小说内容
    # open 操作文件(写入、读取)
    file = open(title   '.txt', mode='w', encoding='utf-8')

    # 只能写入字符串
    file.write(title)
    file.write(text)

    # 关闭文件
    file.close()


# 传入一本小说的目录
def get_book_links(book_url):
    response = requests.get(book_url)
    response.encoding = response.apparent_encoding
    html = response.text
    sel = parsel.Selector(html)
    links = sel.css('dd a::attr(href)').extract()
    return links


# 下载一本小说
def get_one_book(book_url):
    links = get_book_links(book_url)
    for link in links[12:]:
        # print('http://www.shuquge.com/txt/8659/'   link)
        download_one_chapter(book_url   link)

0 人点赞