Python小说爬取:从入门到精通(附GUI界面及词云图)
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:解析HTMLlxml:快速HTML解析器sqlite3:操作SQLite数据库jieba:中文分词wordcloud:生成词云图openpyxl:操作Excel文件tkinter:构建GUI界面
- 类:
NovelCrawler:负责核心爬虫功能NovelCrawlerGUI:构建GUI界面
- 改进建议:
- 添加错误处理机制
- 增加多线程/异步爬取以提高效率
- 提供更详细的用户提示信息
- 可以根据实际需求,自定义爬取规则和数据分析方法
使用说明:
- 安装所需模块
- 运行代码
- 在弹出的窗口中点击'加载链接'按钮,输入小说URL
- 点击其他按钮执行相应功能
注意:
- 代码中获取小说信息的逻辑需要根据实际网站结构进行修改
- 爬取小说网站内容时,请遵守网站robots协议
原文地址: https://www.cveoy.top/t/topic/f1dz 著作权归作者所有。请勿转载和采集!