Python带你实现小说下载器,实现小说自由!!

前言

室友喊着没有小说看,让我给他推荐几本,最初寻思我也不看啊,但这能难倒我?

分分钟就用python给他把整个网站的小说都给下载下来了,不愧是我啊!

话不多说,我们直接开整!
在这里插入图片描述

环境

python 3.6 解释器
pycharm 编辑器 专业版 是需要激活码

requests >>> pip install requests
parsel >>> pip install parsel
pandas >>> pip install pandas
tqdm >>> pip install tqdm

数据来源分析

  1. 确定需求

    爬取小说内容
    进行搜索功能 (当输入一本小说名字或者作者选择下载相应的小说内容)
    2. 数据来源分析

代码实现过程

发送请求 对小说章节列表页发送请求

获取数据 获取网页源代码 (响应体的文本数据response.txt)

解析数据 提取小说名字 / url地址

发送请求 对小说章节url地址发送请求

获取数据 获取网页源代码 (响应体的文本数据response.txt)

解析数据 提取小说的内容 / 小说章节名

保存数据

实现一个搜索功能
在这里插入图片描述

本文所有模块\环境\源码\教程皆可点击此处跳转免费领
本文所有模块\环境\源码\教程皆可点击此处跳转免费领
本文所有模块\环境\源码\教程皆可点击此处跳转免费领


import requests  # pip install requests
import parsel  # 数据解析 pip install parsel
import pandas as pd # pip install pandas
from tqdm import tqdm  # pip install tqdm

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}


def get_response(html_url):
 '''发送请求'''
    response = requests.get(url=html_url, headers=headers)
    response.encoding = response.apparent_encoding
    return response


def save(name, title, content):
    """保存小说"""
    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)


def get_novel_url(html_url):
    """获取小说章节url"""
    response = get_response(html_url)
    # 把获取到的html字符串数据 转成 selector 对象
    selector = parsel.Selector(response.text)
    name = selector.css('#info h1::text').get()
    href = selector.css('#list dd a::attr(href)').getall()
    # https://www.biquges.com/10_10770/6896120.html
    href = ['https://www.biquges.com/' + i for i in href]
    for index in tqdm(href):
        """获取小说的内容"""
        response = get_response(index)
        selector = parsel.Selector(response.text)
        title = selector.css('.bookname h1::text').get()
        # getall() 获取所有的标签内容 返回的是列表 get 获取一个 返回的是字符串
        content_list = selector.css('#content::text').getall()
        # 把列表转换成字符串
        content = ''.join(content_list)
        save(name, title, content)
 #python学习群:748989764

if __name__ == '__main__':
    # url = 'https://www.biquges.com/10_10770/index.html'
    # get_novel_url(url)
    # print(response.text)
    while True:
        print('输入0即可退出程序')
        word = input('请输入你要下载的小说名字(作者): ')
        if word == '0':
            break
        search_url = 'https://www.biquges.com/modules/article/search.php'
        data = {
            'searchkey': word,
            'searchtype': 'articlename'
        }
        response_1 = requests.post(url=search_url, data=data, headers=headers)
        response_1.encoding = response_1.apparent_encoding
        selector_1 = parsel.Selector(response_1.text)
        # 第一次提取
        trs = selector_1.css('#nr')
        lis = []
        if trs:
            for tr in trs:
                novel_name = tr.css('td:nth-child(1) a::text').get()
                novel_id = tr.css('td:nth-child(1) a::attr(href)').get().replace('/', '')
                author = tr.css('td:nth-child(3)::text').get()
                dit = {
                    '书名': novel_name,
                    '作者': author,
                    '书ID': novel_id,
                }
                lis.append(dit)
            print(f'一共搜索到{len(lis)}数据内容')
            search_result = pd.DataFrame(lis)
            print(search_result)
            num = input('请输入你要下载的小说序号: ')
            # 序号对应的就是列表里面索引位置
            num_id = lis[int(num)]['书ID'] # 直接获取小说ID
            link_url = f'https://www.biquges.com/{num_id}/index.html'
            get_novel_url(link_url)
            print(f"{lis[int(num)]['书名']}已经下载完成了")
        else:
            print('抱歉,搜索没有结果^_^')
好的,以下是一个简单的小说下载界面的代码示例,使用了Tkinter库: ```python import tkinter as tk from tkinter import filedialog import requests from bs4 import BeautifulSoup class NovelDownloader: def __init__(self, master): self.master = master self.master.title("小说下载") self.create_widgets() def create_widgets(self): # 创建标签和输入框 self.label1 = tk.Label(self.master, text="小说名称") self.label1.grid(row=0, column=0, padx=5, pady=5) self.entry1 = tk.Entry(self.master, width=30) self.entry1.grid(row=0, column=1, padx=5, pady=5) self.label2 = tk.Label(self.master, text="小说网站") self.label2.grid(row=1, column=0, padx=5, pady=5) self.entry2 = tk.Entry(self.master, width=30) self.entry2.grid(row=1, column=1, padx=5, pady=5) self.label3 = tk.Label(self.master, text="保存路径") self.label3.grid(row=2, column=0, padx=5, pady=5) self.entry3 = tk.Entry(self.master, width=30) self.entry3.grid(row=2, column=1, padx=5, pady=5) self.button1 = tk.Button(self.master, text="选择路径", command=self.select_path) self.button1.grid(row=2, column=2, padx=5, pady=5) # 创建下载按钮 self.button2 = tk.Button(self.master, text="下载", command=self.download) self.button2.grid(row=3, column=1, padx=5, pady=5) def select_path(self): # 选择保存路径 path = filedialog.askdirectory() self.entry3.delete(0, tk.END) self.entry3.insert(0, path) def download(self): # 获取小说网站的HTML url = self.entry2.get() response = requests.get(url) soup = BeautifulSoup(response.content, "html.parser") # 获取小说章节列表 chapter_list = [] chapter_tags = soup.select("div.chapter-list a") for tag in chapter_tags: chapter_list.append(tag["href"]) # 下载小说 novel_name = self.entry1.get() save_path = self.entry3.get() for chapter_url in chapter_list: response = requests.get(chapter_url) soup = BeautifulSoup(response.content, "html.parser") chapter_name = soup.select_one("h1.title").text.strip() content = soup.select_one("div.content").text.strip() filename = f"{novel_name}/{chapter_name}.txt" with open(f"{save_path}/{filename}", "w", encoding="utf-8") as f: f.write(content) if __name__ == "__main__": root = tk.Tk() app = NovelDownloader(root) root.mainloop() ``` 这个小说下载界面可以输入小说名称、小说网站地址和保存路径,点击下载按钮后会自动下载小说的所有章节并保存到指定的路径中。需要注意的是,这个示例代码只是一个简单的实现,对于不同的小说网站可能需要做一些调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值