python带你一步步从单章小说下载到GUI界面制作

嗨喽,大家好呀~这里是爱看美女的茜茜呐

python带你一步步从单章小说下载到GUI界面制作_第1张图片

环境使用:

  • Python 3.10 解释器

  • Pycharm 编辑器

模块使用

  • import requests --> 数据请求模块 第三方模块, 需要安装

  • import re --> 正则表达式模块 内置模块, 不需要安装

  • import parsel --> 数据解析模块 第三方模块, 需要安装

  • import os --> 文件操作模块 内置模块, 不需要安装

  • import concurrent.futures --> 线程池

如何安装python第三方模块:

  1. win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests) 回车

  2. 在pycharm中点击Terminal(终端) 输入安装命令


更多精彩机密、教程,尽在下方,赶紧点击了解吧~

python源码、视频教程、插件安装教程、资料我都准备好了,直接在文末名片自取就可


爬虫基本实现思路

一. 数据来源分析
  1. 明确需求:

    • 采集的网站是什么?

      https://www.biqudu.net/1_1631/3047505.html

    • 采集的数据是什么?

      标题/内容

  2. 分析 标题/内容 是从哪里来的

    通过浏览器自带工具: 开发者工具抓包分析

    • 打开开发者工具: F12 / 鼠标右键点击检查选择network

    • 刷新网页

    • 搜索数据, 找到数据包

      https://www.biqudu.net/1_1631/3047505.html

二. 代码实现步骤:
  1. 发送请求, 模拟浏览器对于url地址发送请求

    请求链接: https://www.biqudu.net/1_1631/3047505.html

  2. 获取数据, 获取服务器返回响应数据内容

    开发者工具: response

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

    标题/内容

  4. 保存数据, 把数据保存本地文件

单章小说下载

导入模块

'''
python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
import requests
import re
import parsel

“”"

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

    请求链接: https://www.biqudu.net/1_1631/3047505.html

    安装模块方法:

    • win + R 输入cmd, 输入安装命令 pip install requests

    • 在pycharm终端, 输入安装命令

    模拟浏览器 headers 请求头:

     字典数据结构
    

    AttributeError: ‘set’ object has no attribute ‘items’

     因为headers不是字典数据类型, 而是set集合
    

“”"

请求链接

url = 'https://www.biqudu.net/1_1631/3047505.html'

模拟浏览器 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=url, headers=headers)

响应对象, 表示请求成功

print(response)

“”"

  1. 获取数据, 获取服务器返回响应数据内容

    开发者工具: response

    response.text --> 获取响应文本数据 <网页源代码/html字符串数据>

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

    标题/内容

“”"
获取下来response.text , 转成可解析对象

'''
python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
selector = parsel.Selector(response.text)
# 提取标题
title = selector.xpath('//*[@class="bookname"]/h1/text()').get()
# 提取内容
content = '\n'.join(selector.xpath('//*[@id="content"]/text()').getall())
print(title)
print(content)

“”"

  1. 保存数据, 把数据保存本地文件

“”"

title <文件名> ‘.txt’ 文件格式 a 追加保存 encoding 编码格式 as 重命名

with open(title + '.txt', mode='a', encoding='utf-8') as f:
    """
    第一章 标题
        小说内容
    第二章 标题
        小说内容
    """

写入内容

    f.write(title)
    f.write('\n')
    f.write(content)
    f.write('\n')
小知识点
  • re正则表达式: 是直接对于字符串数据进行解析

    re.findall(‘什么数据’, ‘什么地方’) --> 从什么地方, 去找什么数据

    .*? --> 可以匹配任意数据, 除了\n换行符

     # 提取标题
     title = re.findall('

    (.*?)

    ', response.text)[0] # 提取内容 content = re.findall('
    (.*?)

    ', response.text, re.S)[0].replace('

    ', '\n')

  • css选择器: 根据标签属性提取数据

    .bookname h1::text

    类名为bookname下面h1标签里面文本

    get() --> 提取第一个标签数据内容 返回字符串

    getall() --> 提取多个数据, 返回列表

     # 提取标题
     title = selector.css('.bookname h1::text').get()
     # 提取内容
     content = '\n'.join(selector.css('#content::text').getall())
    
  • xpath节点提取: 提取标签节点提取数据

整本小说下载

'''
python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
import requests
import re
import parsel
import os

# 请求链接: 小说目录页
list_url = 'https://www.biqudu.net/1_1631/'
# 模拟浏览器 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'
}
# 发送请求
html_data = requests.get(url=list_url, headers=headers).text
# 提取小说名字
name = re.findall('

(.*?)

'
, html_data)[0] # 自动创建一个文件夹 file = f'{name}\\' if not os.path.exists(file): os.mkdir(file) # 提取章节url url_list = re.findall('
', html_data) # for循环遍历 for url in url_list: index_url = 'https://www.biqudu.net' + url print(index_url) # # 请求链接 # url = 'https://www.biqudu.net/1_1631/3047506.html' # 模拟浏览器 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=index_url, headers=headers) # 响应对象, 表示请求成功 print(response) # 获取下来response.text , 转成可解析对象 selector = parsel.Selector(response.text) # 提取标题 title = selector.xpath('//*[@class="bookname"]/h1/text()').get() # 提取内容 content = '\n'.join(selector.xpath('//*[@id="content"]/text()').getall()) print(title) # print(content) # title <文件名> '.txt' 文件格式 a 追加保存 encoding 编码格式 as 重命名 with open(file + title + '.txt', mode='a', encoding='utf-8') as f: f.write(title) f.write('\n') f.write(content) f.write('\n')

多线程采集小说

导入模块

import requests
import re
import parsel
import os
import concurrent.futures
'''
python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
def 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('

(.*?)

'
, html_data)[0] # 提取章节url url_list = re.findall('
', 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('

(.*?)

'
, html_data)[0] # 提取内容 content = re.findall('
(.*?)

', html_data, re.S)[0].replace('

'
, '\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 + title + '.txt', mode='a', encoding='utf-8') as f:
        """
        第一章 标题
            小说内容
        第二章 标题
            小说内容
        """
        # 写入内容
        f.write(title)
        f.write('\n')
        f.write(content)
        f.write('\n')
    print(title, '已经保存')


def main(home_url):
    # index_url = 'https://www.biqudu.net' + url
    title, content = get_content(html_url=home_url)
    save(name, title, content)


if __name__ == '__main__':
    url = 'https://www.biqudu.net/1_1631/'
    name, url_list = get_list_url(html_url=url)
    exe = concurrent.futures.ThreadPoolExecutor(max_workers=7)
    for url in url_list:
        index_url = 'https://www.biqudu.net' + url
        exe.submit(main, index_url)
    exe.shutdown()

下载排行所有小说

import requests
import re
import parsel
import os
'''
python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
def 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('

(.*?)

'
, html_data)[0] # 提取章节url url_list = re.findall('
', 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('

(.*?)

'
, html_data)[0] # 提取内容 content = re.findall('
(.*?)

', html_data, re.S)[0].replace('

'
, '\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 + title + '.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 main(home_url): href = get_novel_id(html_url=home_url) for novel_id in href: 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) break if __name__ == '__main__': html_url = 'https://www.biqudu.net/biquge_1/' main(html_url)

小说搜搜功能

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


def 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('

(.*?)

'
, html_data)[0] # 提取章节url url_list = re.findall('
', html_data) return name, url_list ''' python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过) 即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书! ''' def get_content(html_url): """ 获取小说内容/小说标题 :param html_url: 小说章节url :return: """ # 调用发送请求函数 html_data = get_response(html_url).text # 提取标题 title = re.findall('

(.*?)

'
, html_data)[0] # 提取内容 content = re.findall('
(.*?)

', html_data, re.S)[0].replace('

'
, '\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)

制作GUI界面

导入模块

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()

查询下载输入框

'''
python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
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)

展示界面

root.mainloop()

尾语

感谢你观看我的文章呐~本次航班到这里就结束啦

希望本篇文章有对你带来帮助 ,有学习到一点知识~

躲起来的星星也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~更多源码、资料、素材、解答、交流皆点击下方名片获取呀

你可能感兴趣的:(python爬虫,python,python,开发语言,学习,pycharm)