【Python】实现一个小说下载器,可以打包成exe(附原码)

前言

闲的无聊,现在没得什么好剧追(你们或许可以给我推荐推荐)

朋友都在看小说,那我就来用Python搞一个小说下载器吧

顺便打包一下

实现步骤

爬虫基本四个步骤:

采集一章小说内容
  1. 发送请求, 模拟浏览器对于url地址发送请求
    小说章节链接:
https://***不屏蔽不给过.com/book/5613/4217210.html
  1. 获取数据, 获取网页源代码

  2. 解析数据, 提取我们想要的数据内容

    小说章节名
    小说内容

  3. 保存数据, 把小说内容本地文件 txt

实现代码

导入数据请求模块

原码.点击即可领取 (备注:苏)
import requests

导入数据解析模块

import parsel

导入正则

import re

导入格式化打印

import prettytable as pt

导入进度条

from tqdm import tqdm

请求头 字典数据类型, 构建完整键值对

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'
}


def get_response(html_url):

发送请求, 模拟浏览器对于url地址发送请求

    自定义函数:
        def 关键字 定义函数
        get_response 函数名 自定义
        html_url 形式参数
    :param html_url: 给个网址就可以了
    :return:response 返回响应对象

    模拟浏览器对于url地址发送请求
        headers 请求头 --> 可以直接复制粘贴
    """
    # 发送请求
    response = requests.get(url=html_url, headers=headers)
    # return 关键字 返回 response 响应对象
    # <Response [200]> 响应对象 表示请求成功
    return response

获取小说名字 / 小说章节url

def get_novel_info(novel_url):
    """
    获取小说名字 / 小说章节url
    :param novel_url: 小说目录页url地址
    :return:
    """
    # 发送请求, 获取网页源代码
    html_data = get_response(html_url=novel_url).text
    # 把获取下来 html字符串数据 <response.text>, 转成可解析对象
    selector = parsel.Selector(html_data)
    # 提取小说名字
    name = selector.css('.novel_info_title h1::text').get()
    # 提取小说章节url  attr 属性选择器, 提取标签里面属性内容
    link_list = selector.css('.chapter_list a::attr(href)').getall()
    # https://ssbiqu.com/book/5613/4217210.html  列表推导式
    link_list = ['https://ssbiqu.com' + i for i in link_list]
    return name, link_list

获取小说内容函数

def get_content(html_url):
    获取小说内容函数
    :param html_url: 形参 传入小说章节url地址
    :return: 章节名 / 小说内容
    """
    # 调用前面定义好的发送请求函数
    response = get_response(html_url=html_url)
    # 获取网页源代码, html字符串数据
    # print(response.text)

解析提取, 小说章节名, 以及小说内容

       - 根据标签属性提取数据内容
            1. 小说章节名字 
    .style_h1 定位标签
    get() 获取第一个标签内容 相当于获取一个, 返回字符串
    getall() 获取所有标签内容, 返回列表

把获取下来

html字符串数据 <response.text>, 转成可解析对象

selector = parsel.Selector(response.text)

提取标题

title = selector.css('.style_h1::text').get()

提取内容

content_list = selector.css('#article>p::text').getall()

保存文字, 保存字符串数据

所有要把 列表转成字符串数据类型

列表转成字符串数据类型?
        for 遍历提取列表里面元素
        str 强制转换数据类型
        str.join() 把列表合并为字符串
    '\n'.join(content_list) 以换行符, 把列表里面元素一个一个合并起来变成一个字符串
    """
    content = '\n'.join(content_list)

返回标题, 小说内容

return title, content

保存函数

def save(name, title, content):
    """
    保存函数
    :param title: 小说章节名
    :param content: 小说内容
    :return:
    """
    # # replace 字符串替换, 把 / 替换成 -
    # title = title.replace('/', '-')  保存 a 追加 w 写入会覆盖
    with open(name + '.txt', mode='a', encoding='utf-8') as f:
        f.write(title)
        f.write('\n')
        f.write(content)
        f.write('\n')

搜索函数

def search(word):
    """
    搜索函数
    :param word: 小说名
    :return:
    """
    search_url = 'https://ssbiqu.com/search/'
    data = {
    
    
        'searchkey': word
    }
    search_data = requests.post(url=search_url, data=data, headers=headers).text
    novel_id_list = re.findall('<a href="/book/(\d+)/">', search_data)
    name_list = re.findall('<h3>(.*?)<span class="hot">(.*?)</span>(.*?)</h3>', search_data)
    name_list = [''.join(j) for j in name_list]
    # 仅匹配中文
    writer_list = re.findall('<i class="fa fa-user-circle-o">&nbsp;</i>.*?(.*?)&nbsp;&nbsp;<span class="s_gray">', search_data)
    writer_list = [z.replace('<span class="hot">', '').replace('</span>', '') for z in writer_list]
    tb = pt.PrettyTable()
    tb.field_names = ['序号', '书名', '作者', '书ID']
    page = 0
    novel_info_list = []
    for novel_id, name, writer in zip(novel_id_list, name_list, writer_list):
        dit = {
    
    
            '书名': name,
            '作者': writer,
            '书ID': novel_id,
            
        }
        print(dit)
        novel_info_list.append(dit)
        tb.add_row([page, name, writer, novel_id])
        page += 1
    print(tb)
    num = input('请输入你想要下载小说序号: ')
    novel = novel_info_list[int(num)]['书ID']
    return novel

获取小说名字

ef main(word):
    """
    主函数
    :return:
    """
    novel_id = search(word)
    # 小说目录页 https://ssbiqu.com/book/5613/
    url = f'https://ssbiqu.com/book/{
      
      novel_id}/'
    # 获取小说名字
    name, link_list = get_novel_info(novel_url=url)
    # for循环遍历 提取内容
    for link in tqdm(link_list):
        # 获取小说内容
        title, content = get_content(html_url=link)
        save(name, title, content)

最后

今天的分享到这里就结束了

对文章有问题的,或者有其他关于python的问题,可以在评论区留言或者私信我哦
觉得我分享的文章不错的话,可以关注一下我,或者给文章点赞(/≧▽≦)/

猜你喜欢

转载自blog.csdn.net/sunanpython/article/details/128271990