网络小说数据分析系统:解决小说数据采集、清洗与可视化展示的综合平台

79 阅读4分钟

一、个人简介

  • 💖💖作者:计算机编程果茶熊
  • 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我!
  • 💛💛想说的话:感谢大家的关注与支持!
  • 💕💕文末获取源码联系计算机编程果茶熊

二、前言

开发语言:Java+Python 数据库:MySQL 系统架构:B/S 后端框架:SpringBoot(Spring+SpringMVC+Mybatis)+Django 前端:Vue+HTML+CSS+JavaScript+jQuery

网络小说数据分析系统是一款基于B/S架构设计的综合性平台,采用Java/Python双语言支持,分别结合Spring Boot和Django框架实现后端功能,前端则运用Vue+ElementUI+HTML技术栈打造友好的用户界面,底层依托MySQL数据库进行数据存储与管理。该系统主要针对网络小说领域的数据采集、处理与分析需求,提供了完善的用户管理功能,支持不同权限用户的操作控制;核心功能包括网络小说管理模块,实现小说信息的增删改查;网络小说爬取和清理模块,能够自动抓取互联网上的小说资源并进行数据清洗;数据可视化模块,通过图表等形式直观展示小说数据的各类统计分析结果;系统还配备了系统公告功能,方便管理员发布重要通知;同时提供个人信息管理功能,允许用户自定义个人设置。整个系统架构清晰,功能模块化,为网络小说数据的采集、管理与分析提供了一站式解决方案,可满足教学、研究及个人爱好者对网络小说数据分析的多样化需求。

三、网络小说数据分析系统-视频解说

网络小说数据分析系统:解决小说数据采集、清洗与可视化展示的综合平台

四、网络小说数据分析系统-功能介绍

登录模块.png

后台数据看板.png

后台小说爬取处理模块.png

前台个人信息模块.png

前台数据分析模块.png

前台网络小说模块.png

作品可视化模块.png

五、网络小说数据分析系统-代码展示

// 核心功能1: 网络小说爬取和清理 @Service public class NovelCrawlerService { @Autowired private NovelRepository novelRepository; @Autowired private CleaningService cleaningService;

public void crawlAndCleanNovel(String sourceUrl, String category) {
    try {
        // 创建爬虫配置
        CrawlerConfig config = new CrawlerConfig();
        config.setThreadCount(5);
        config.setTimeout(10000);
        config.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
        
        // 初始化爬虫并执行
        NovelCrawler crawler = new NovelCrawler(config);
        List<RawNovelData> rawNovels = crawler.fetchNovelsFromSource(sourceUrl, category);
        
        // 数据清理和转换
        for (RawNovelData rawNovel : rawNovels) {
            Novel novel = new Novel();
            novel.setTitle(cleaningService.cleanTitle(rawNovel.getTitle()));
            novel.setAuthor(cleaningService.cleanAuthor(rawNovel.getAuthor()));
            novel.setContent(cleaningService.cleanContent(rawNovel.getContent()));
            novel.setCategory(category);
            novel.setWordCount(novel.getContent().length());
            novel.setChapterCount(rawNovel.getChapters().size());
            novel.setSourceUrl(rawNovel.getUrl());
            novel.setCrawlTime(new Date());
            
            // 进行文本分析
            TextAnalysisResult analysis = cleaningService.analyzeText(novel.getContent());
            novel.setKeywords(analysis.getKeywords());
            novel.setReadability(analysis.getReadabilityScore());
            novel.setSentimentScore(analysis.getSentimentScore());
            
            // 保存到数据库
            novelRepository.save(novel);
        }
    } catch (Exception e) {
        throw new CrawlerException("小说爬取和清理过程中出错: " + e.getMessage(), e);
    }
}

}

// 核心功能2: 数据可视化 @RestController @RequestMapping("/api/visualization") public class VisualizationController { @Autowired private NovelAnalysisService analysisService;

@GetMapping("/category-distribution")
public ResponseEntity<Map<String, Object>> getCategoryDistribution() {
    // 获取各类别小说数量分布
    Map<String, Integer> distribution = analysisService.getCategoryDistribution();
    
    // 计算百分比
    int total = distribution.values().stream().mapToInt(Integer::intValue).sum();
    Map<String, Double> percentages = new HashMap<>();
    for (Map.Entry<String, Integer> entry : distribution.entrySet()) {
        double percentage = (double) entry.getValue() / total * 100;
        percentages.put(entry.getKey(), Math.round(percentage * 100.0) / 100.0);
    }
    
    // 获取各类别的平均字数
    Map<String, Long> avgWordCounts = analysisService.getAvgWordCountByCategory();
    
    // 获取各类别的平均评分
    Map<String, Double> avgRatings = analysisService.getAvgRatingByCategory();
    
    // 获取各类别的热门关键词
    Map<String, List<String>> topKeywords = analysisService.getTopKeywordsByCategory(5);
    
    // 组装返回数据
    Map<String, Object> result = new HashMap<>();
    result.put("distribution", distribution);
    result.put("percentages", percentages);
    result.put("avgWordCounts", avgWordCounts);
    result.put("avgRatings", avgRatings);
    result.put("topKeywords", topKeywords);
    
    // 计算年度趋势数据
    List<YearlyTrendData> yearlyTrends = analysisService.calculateYearlyTrends();
    result.put("yearlyTrends", yearlyTrends);
    
    return ResponseEntity.ok(result);
}

}

// 核心功能3: 网络小说管理 @Service public class NovelManagementService { @Autowired private NovelRepository novelRepository; @Autowired private ChapterRepository chapterRepository; @Autowired private UserActivityRepository userActivityRepository;

@Transactional
public NovelAnalysisResult analyzeNovel(Long novelId) {
    // 获取小说基本信息
    Novel novel = novelRepository.findById(novelId)
            .orElseThrow(() -> new NovelNotFoundException("小说不存在: " + novelId));
    
    // 获取章节内容
    List<Chapter> chapters = chapterRepository.findByNovelIdOrderByChapterNumber(novelId);
    
    // 创建分析结果对象
    NovelAnalysisResult result = new NovelAnalysisResult();
    result.setNovelId(novelId);
    result.setTitle(novel.getTitle());
    result.setAuthor(novel.getAuthor());
    
    // 词频统计
    Map<String, Integer> wordFrequency = new HashMap<>();
    for (Chapter chapter : chapters) {
        String[] words = chapter.getContent().split("\\s+");
        for (String word : words) {
            if (word.length() > 1) {  // 忽略单字符
                wordFrequency.put(word, wordFrequency.getOrDefault(word, 0) + 1);
            }
        }
    }
    
    // 提取高频词
    List<Map.Entry<String, Integer>> sortedWords = wordFrequency.entrySet().stream()
            .sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
            .limit(100)
            .collect(Collectors.toList());
    result.setTopWords(sortedWords);
    
    // 情感分析
    double positiveScore = 0, negativeScore = 0;
    SentimentAnalyzer analyzer = new SentimentAnalyzer();
    for (Chapter chapter : chapters) {
        SentimentResult sentiment = analyzer.analyzeSentiment(chapter.getContent());
        positiveScore += sentiment.getPositiveScore();
        negativeScore += sentiment.getNegativeScore();
    }
    result.setPositiveSentiment(positiveScore / chapters.size());
    result.setNegativeSentiment(negativeScore / chapters.size());
    
    // 记录用户活动
    UserActivity activity = new UserActivity();
    activity.setUserId(SecurityContextHolder.getContext().getAuthentication().getName());
    activity.setActivityType(ActivityType.NOVEL_ANALYSIS);
    activity.setNovelId(novelId);
    activity.setTimestamp(new Date());
    userActivityRepository.save(activity);
    
    return result;
}

六、网络小说数据分析系统-文档展示

论文.png

七、END

谢谢.png

💕💕文末获取源码联系计算机编程果茶熊