hahaa

室友喊着没有小说看,让我给他推荐几本,这能难倒我?

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

在这里插入图片描述

话不多说,我们直接开整!文末附视频

要准备的东西

软件

python 3.8
pycharm

 

使用的模块

requests  >>> pip install requests 数据请求
parsel  >>> pip install parsel 数据解析
(完善功能) 添加搜索功能 搜索小说名字或者作者名字
tqdm  >>> pip install tqdm  下载进度条显示模块
# Python学习交流群:924040232
pandas >>> pip install pandas 输入的格式好看一些

 

win + R 输入cmd 输入安装命令 pip install 模块名 ;
如果出现爆红,可能是因为,网络连接超时,切换国内镜像源;
黄色是警告 ,可以忽略;

输入小说名下载


在这里插入图片描述

打包成exe程序, 是需要安装 pyinstaller ,命令提示符窗口输入 pip install pyinstaller

 

打包命令:pyinstaller -F -w 加上文件名(如:123.py)

代码展示

下方我会放上视频,可以对照视频讲解的更加清楚。

# 导入数据请求模块
import requests
# 导入数据解析模块
import parsel
# 导入正则表达式模块
import re
# 导入pandas
import pandas as pd
# 导入进度条显示模块
from tqdm import tqdm

while True:
    key_word = input(\'请输入你想要下载的小说名字(输入0即可退出): \')
    if key_word == \'0\':
        break
    search_url = f\'https://www.***.com/search.php?q={key_word}\'
    headers = {
        \'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36\'
    }
    response = requests.get(url=search_url, headers=headers)
    # print(response.text)
    selector_1 = parsel.Selector(response.text)
    divs = selector_1.css(\'.result-list div.result-item\')
    # print(divs)
    if divs:
        lis = []
        for div in divs:
            novel_name = div.css(\'.result-game-item-title-link::attr(title)\').get() # 小说名字
            href = div.css(\'.result-game-item-title-link::attr(href)\').get().split(\'/\')[2] # ID
            author = div.css(\'.result-game-item-info p:nth-child(1) span:nth-child(2)::text\').get() # 作者
            # print(novel_name, href, author)
            dit = {
                \'书名\': novel_name,
                \'作者\': author,
                \'书ID\': href,
            }
            lis.append(dit)
        print(f\'一共搜索到{len(lis)}条数据内容, 结果如下\')
        search_data = pd.DataFrame(lis)
        print(search_data)
        key_num = input(\'请选择你想要下载小说序号: \')  # 输入的数据类型字符串数据
        novel_id = lis[int(key_num)][\'书ID\']
        url = f\'https://www.***.com/book/{novel_id}/\'
        headers = {
            \'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36\'
        }
        response = requests.get(url, headers)
        # print(response.text)  # 正则表达式提取出来数据返回列表 [\'天道修改器\']
        novel_name = re.findall(\'<h1>(.*?)</h1>\', response.text)[0]
        novel_info = re.findall(\'<dd><a href="(.*?)"  >(.*?)</a></dd>\', response.text)
        # print(novel_name)
        # print(novel_info)
        for novel_url, novel_title in tqdm(novel_info):
            # \'https://www.***e.com/book/60126/14362.html\'
            novel_url = \'https://www.***.com\' + novel_url
            # print(novel_url, novel_title)
            # 1. 发送请求, 对于刚刚分析得到的url地址发送请求
            # url = \'https://www.biqugee.com/book/60126/14362.html\'
            response = requests.get(novel_url, headers)  # <Response [200]> 返回response响应对象, 200表示请求成功
            # 2. 获取数据, 获取服务器返回的response响应数据
            # response.text 获取响应体返回文本数据(网页源代码)
            # print(response.text)
            # 3. 解析数据, 提取我们想要的数据内容 小说章节名字 以及小说内容
            # 提取数据方式: xpath css re 这三种方式都是可以提取数据
            selector = parsel.Selector(response.text)  # 把获取到的response.text 转换成 selector 对象
            # novel_title = selector.css(\'.bookname h1::text\').get()  # get获取第一个标签数据 返回字符串数据
            # novel_title_1 = selector.xpath(\'//*[@class="bookname"]/h1/text()\').get()  # get获取第一个标签数据 返回字符串数据
            novel_content_list = selector.css(\'#content::text\').getall()  # getall 获取所有标签内容, 返回列表数据
            # 需要把列表转成字符串数据 join  \n换行符
            novel_content = \'\n\'.join(novel_content_list)
            # print(novel_title)
            # print(novel_title_1)
            # print(novel_content_list)
            # print(novel_content)
            # 4. 保存数据
            # w写入数据但是覆盖 a写入追加写入, 写入文件末尾 b 二进制模式
            """
            第一章 xxx
            小说内容
            第二章 xxx
            小说内容
            """
            with open(novel_name + \'.txt\', mode=\'a\', encoding=\'utf-8\') as f:
                f.write(novel_title)
                f.write(\'\n\')
                f.write(novel_content)
                f.write(\'\n\')
            # print(\'正在保存\', novel_title)

    else:
        print(\'请正确输入小说名字或者作者名字 / 没有这本书的数据..\')

 

视频讲解:https://www.bilibili.com/video/BV1FT4y1X7B2/

好了,今天的分享就到这里,大家快去试试吧!

分类:

技术点:

相关文章: