import requests
from bs4 import BeautifulSoup
import lxml
import sqlite3
import jieba
from wordcloud import WordCloud
import openpyxl
import tkinter as tk
from tkinter import filedialog

class NovelCrawler:
    def __init__(self):
        self.url = ''  # 待爬取的小说网站链接
        self.title = ''  # 小说标题
        self.author = ''  # 小说作者
        self.content = ''  # 小说正文
        self.word_list = []  # 分词结果
        self.word_freq = {}  # 分词频率统计结果
        self.wordcloud = None  # 词云图
        self.db_name = 'novel.db'  # 数据库名称
        self.excel_name = 'novel.xlsx'  # Excel表格名称
        self.conn = None  # 数据库连接
        self.cursor = None  # 数据库游标
        self.wb = None  # Excel工作簿
        self.ws = None  # Excel工作表
        self.init_db()  # 初始化数据库
        self.init_excel()  # 初始化Excel表格

    def init_db(self):
        self.conn = sqlite3.connect(self.db_name)
        self.cursor = self.conn.cursor()
        self.cursor.execute('''CREATE TABLE IF NOT EXISTS novel
                               (title TEXT, author TEXT, content TEXT)''')
        self.conn.commit()

    def init_excel(self):
        self.wb = openpyxl.Workbook()
        self.ws = self.wb.active
        self.ws.append(['标题', '作者', '正文'])

    def load_url(self):
        self.url = input('请输入小说网站链接:')

    def get_novel_info(self):
        response = requests.get(self.url)
        response.encoding = 'utf-8'
        soup = BeautifulSoup(response.text, 'lxml')
        # 注意:以下需要根据实际网页结构修改
        self.title = soup.find('h1').text.strip()
        self.author = soup.find('div', class_='author').text.strip()
        self.content = soup.find('div', class_='content').text.strip()

    def save_to_db(self):
        self.cursor.execute('INSERT INTO novel VALUES (?, ?, ?)',
                            (self.title, self.author, self.content))
        self.conn.commit()

    def save_to_excel(self):
        self.ws.append([self.title, self.author, self.content])
        self.wb.save(self.excel_name)

    def segment_words(self):
        self.word_list = jieba.cut(self.content)
        self.word_freq = {}
        for word in self.word_list:
            if len(word) > 1:
                self.word_freq[word] = self.word_freq.get(word, 0) + 1

    def generate_wordcloud(self):
        self.wordcloud = WordCloud(width=800, height=600, background_color='white').generate_from_frequencies(self.word_freq)

    def save_wordcloud(self):
        file_path = filedialog.asksaveasfilename(defaultextension='.png')
        if file_path:
            self.wordcloud.to_file(file_path)

class NovelCrawlerGUI:
    def __init__(self):
        self.crawler = NovelCrawler()
        self.window = tk.Tk()
        self.window.title('小说爬取')
        self.window.geometry('400x300')

        self.load_url_button = tk.Button(self.window, text='加载链接', command=self.load_url)
        self.load_url_button.pack(pady=10)

        self.get_info_button = tk.Button(self.window, text='获取信息', command=self.get_novel_info)
        self.get_info_button.pack(pady=10)

        self.save_to_db_button = tk.Button(self.window, text='保存到数据库', command=self.save_to_db)
        self.save_to_db_button.pack(pady=10)

        self.save_to_excel_button = tk.Button(self.window, text='保存到Excel', command=self.save_to_excel)
        self.save_to_excel_button.pack(pady=10)

        self.segment_words_button = tk.Button(self.window, text='分词', command=self.segment_words)
        self.segment_words_button.pack(pady=10)

        self.generate_wordcloud_button = tk.Button(self.window, text='生成词云图', command=self.generate_wordcloud)
        self.generate_wordcloud_button.pack(pady=10)

        self.save_wordcloud_button = tk.Button(self.window, text='保存词云图', command=self.save_wordcloud)
        self.save_wordcloud_button.pack(pady=10)

        self.window.mainloop()

    def load_url(self):
        self.crawler.load_url()

    def get_novel_info(self):
        self.crawler.get_novel_info()

    def save_to_db(self):
        self.crawler.save_to_db()

    def save_to_excel(self):
        self.crawler.save_to_excel()

    def segment_words(self):
        self.crawler.segment_words()

    def generate_wordcloud(self):
        self.crawler.generate_wordcloud()

    def save_wordcloud(self):
        self.crawler.save_wordcloud()

if __name__ == '__main__':
    NovelCrawlerGUI()

代码解析:

  • 功能:
    • 从用户指定的URL爬取小说内容
    • 提取小说标题、作者和正文
    • 将数据保存到SQLite数据库和Excel文件
    • 对小说正文进行分词,统计词频
    • 生成并保存词云图
  • 模块:
    • requests:发送HTTP请求
    • BeautifulSoup:解析HTML
    • lxml:快速HTML解析器
    • sqlite3:操作SQLite数据库
    • jieba:中文分词
    • wordcloud:生成词云图
    • openpyxl:操作Excel文件
    • tkinter:构建GUI界面
  • 类:
    • NovelCrawler:负责核心爬虫功能
    • NovelCrawlerGUI:构建GUI界面
  • 改进建议:
    • 添加错误处理机制
    • 增加多线程/异步爬取以提高效率
    • 提供更详细的用户提示信息
    • 可以根据实际需求,自定义爬取规则和数据分析方法

使用说明:

  1. 安装所需模块
  2. 运行代码
  3. 在弹出的窗口中点击'加载链接'按钮,输入小说URL
  4. 点击其他按钮执行相应功能

注意:

  • 代码中获取小说信息的逻辑需要根据实际网站结构进行修改
  • 爬取小说网站内容时,请遵守网站robots协议
Python小说爬取:从入门到精通(附GUI界面及词云图)

原文地址: https://www.cveoy.top/t/topic/f1dz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录