恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

腾讯漫画榜单爬虫到聚类推荐:Python数据分析全流程实战

  • 首页
  • 资讯中心
  • /
  • 腾讯漫画榜单爬虫到聚类推荐:Python数据分析全流程实战

相关资讯

Android仿QQ聊天课设:Room数据库与WebSocket消息机制 2026/9/14 9:18:29
从ER模型到SQL实现:图书馆管理系统数据库设计实战指南 2026/9/14 9:18:29
PyTorch实现五大经典CNN:从LeNet到ResNet的复现与实验对比 2026/9/14 9:13:29

最新资讯

Wagtail 如何用 Django Ninja 构建自定义 API 并展示 OpenAPI 文档?
从云端到边缘:Physical AI视觉推理的延迟优化与断网落地实践
vue-vben-admin 工作台快速上手:1 个页面装下项目、导航、待办与数据看板
32.768kHz晶振原理:为什么RTC必须用2¹⁵Hz分频
SEO优化协议书怎么写?中小企业避坑指南与核心条款拆解
订单超时取消方案详解:从数据库扫表到消息队列六大实现

今日推荐

ASP+Access库存管理系统源码部署与IIS配置实战指南
基于SSM框架的毕业季旧物分类处理系统设计与实现
MATLAB FFT频谱仿真:从DFT原理到参数设置与窗函数选择

本周热门

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化
Flutter应用改名全指南:从Android到iOS的配置与工具实践

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

腾讯漫画榜单爬虫到聚类推荐:Python数据分析全流程实战

发布时间:2026/9/14 9:18:29
腾讯漫画榜单爬虫到聚类推荐:Python数据分析全流程实战 简介面向爬虫、数据分析与可视化学习者这份腾讯漫画榜单处理项目是从数据采集到业务洞察的完整参考尤其适合课程设计、毕业设计或想快速上手综合实战的读者。压缩包共33个文件、1.35MB包含6个Python脚本及编译后的pyc文件覆盖爬虫采集、数据可视化、图形界面、聚类与推荐等环节3个CSV数据表、7张效果图与XML配置分别承担数据输入、结果展示和工程配置目录结构清晰。目前已有1649人学习项目以腾讯漫画榜单为实例通过可视化图表直观呈现阅览量最高的作品并使用K-Means算法对图像聚类、完成矢量化处理进而挖掘当前最受用户欢迎的漫画类型平台可根据结果制定运营策略。读者不仅能获得从爬虫到推荐的完整代码还能借鉴其模块划分与设计思路迁移到其他榜单数据上对理解推荐算法与可视化实现具有实际价值。1. 腾讯漫画榜单数据处理项目从爬虫脚本到聚类推荐的一站式拆解腾讯漫画的榜单每天在变但页面只展示前20名想知道“近三个月哪种题材最受用户欢迎”“哪位作者的新作留存率更高”就需要把榜单数据抓下来、洗干净、再画成图。这个TencentComics项目把“爬虫抓取→CSV落盘→可视化解读→K-Means聚类→推荐算法→GUI整合”完整串了起来适合想练Python、爬虫、数据分析与可视化、机器学习整套流程的人。解包TencentComics.rar后关键文件不只是getData.py还有JuLei.py负责聚类、TuiJian.py负责推荐、DataVisualization.py负责绘图、GUI.py负责界面整合。下面按实际开发顺序把每个环节的细节、参数和坑都拆开讲。2. 抓取腾讯漫画榜单请求构造、JSON解析与CSV落盘2.1 榜单接口分析与请求头伪装腾讯漫画的榜单数据由前端异步加载直接用requests.get抓页面HTML是拿不到完整榜单的。第一件事用Chrome开发者工具切换到Network面板勾选Fetch/XHR刷新榜单页搜索“rank”或“comicRank”会看到一个返回JSON的接口里面包含comicList和rankType等字段。不建议去解析HTML因为HTML里只有图标和链接缺少“总点击量、月票、评分”这类结构化指标。常见做法是把请求头完整伪装成浏览器并带上referer: https://ac.qq.com/rank/否则部分请求会被跳转到验证页。下面是我通常会用到的最小请求参数import requests import json headers { user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36, referer: https://ac.qq.com/rank/, accept: application/json, } params { rank_type: hot, # hot人气榜, new新作榜, finish完结榜 page: 1, # 页码 limit: 50, # 每页条数 type: 0 # 0全部1热血2恋爱3悬疑…… }rank_type、page、limit是三个最常用的调节参数。首次请求建议page1从接口返回的total字段拿到总条数再按需翻页type对应题材筛选不同榜单页的枚举可能不同踩坑时直接在开发者工具里看真实参数最准。我一般会把page和limit设置成循环变量方便后续爬取多页后合并。2.2 数据清洗与字段映射拿到JSON后不要急着塞进DataFrame。腾讯漫画返回的字段非常冗余包含cover、lastUpTime、monthTicket、rating等几十个字段但真正用于数据分析与可视化的只有一小部分。我习惯先做字段映射只保留后续K-Means和推荐算法需要的列避免深层JSON清洗影响脚本速度。CSV字段名原始JSON字段说明用途分类comic_idcomicID漫画ID,去重主键标识titletitle作品名标识typetags[0]主分类,取第一个标签类别特征total_clicktotalClick总点击量数值特征month_ticketmonthTicket月票数数值特征ratingrating评分,转float数值特征authorauthorList[0].name作者名类别特征is_finishisFinish1完结,0连载类别特征last_updatelastUpTime时间戳转日期时间特征上面的映射规则对应getData.py里的format_comic()函数。这里有一个容易踩的坑tags是字符串数组热门作品通常同时有多个标签直接写进CSV会让后续聚类没法处理所以只取tags[0]作为主分类。如果作品有“热血奇幻冒险”我一般只保留“热血”避免特征膨胀。2.3 数据落盘与增量更新清洗完的字典列表可以先json.dump到data.json方便排错同时用pandas写data.csv供后续可视化脚本直接读取。程序中断后重新运行最好以comic_id为主键做增量合并而不是直接覆盖写。import pandas as pd import os csv_file data.csv def save_data(comics: list): df pd.DataFrame(comics) if os.path.exists(csv_file): old_df pd.read_csv(csv_file, dtype{comic_id: str}) df pd.concat([old_df, df], ignore_indexTrue) df df.drop_duplicates(subsetcomic_id, keeplast) # 以comic_id去重保留最新数据 df.to_csv(csv_file, indexFalse, encodingutf-8-sig) # utf-8-sig防止Excel中文乱码代码的核心在drop_duplicates(subsetcomic_id, keeplast)第一次抓取生成的旧数据会被最新数据替换。utf-8-sig编码是必须的不然Excel打开data.csv会出现中文乱码。如果你想长期监控榜单变化建议再加一列crawl_date做成“每日快照表”后续可视化才能观察榜单的波动趋势。3. 数据可视化用图表定位高人气类型与作者效应3.1 从CSV到图表matplotlib与pyecharts选型DataVisualization.py做的事情是读入data.csv在images/目录输出多张图表。可视化工具选择我会看使用场景matplotlib适合快速出统计图能精准控制坐标轴和标签pyecharts适合做带时间轴或联动交互的可视化大屏。这个项目既有静态图也有GUI展示所以两套方案都用了但核心绘图逻辑统一抽象成load_data()和plot_*()两部分。从CSV读数据时最好显式指定列类型否则total_click会被读成int64rating读成float64这两个字段用于聚类没问题但有缺失值时会直接报错需要提前填充。下面这段代码生成Top15阅读量条形图同时解决中文乱码问题import pandas as pd import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams[font.sans-serif] [SimHei, Microsoft YaHei] matplotlib.rcParams[axes.unicode_minus] False df pd.read_csv(data.csv, dtype{comic_id: str}) df[total_click] pd.to_numeric(df[total_click], errorscoerce) # 强转数值错误值置NaN df df.dropna(subset[total_click]) top15 df.nlargest(15, total_click) # 取阅读量前15 plt.figure(figsize(12, 6)) plt.barh(top15[title][::-1], top15[total_click][::-1], color#FF6B6B) # 反转让最大作品在顶部 plt.xlabel(总点击量) plt.title(腾讯漫画人气榜 Top15 阅读量) plt.tight_layout() plt.savefig(images/man0.jpg, dpi120)nlargest按total_click输出前15名[::-1]反转后让阅读量最高的作品排在最上方更符合阅读习惯。dpi120是尝试下来的平衡点GUI里内嵌图片和后续封面缩略图都能清晰显示。3.2 类型分布与作者热度可视化只看Top榜不够还要按分类聚合观察“哪类漫画贡献了最多阅读量”。这里通常会出三张图第一张是饼图展示主分类的阅读量占比第二张是横向柱状图展示作者名下作品的月票总量第三张是散点图用来排查“叫好不叫座”的作品。项目里的animeType.csv和peopleNum.csv就是在这个阶段导出的中间结果。图表输入文件聚合方式关键业务结论类型阅读量饼图data.csvdf.groupby(type)[total_click].sum()确认热血、恋爱类是否占据主导作者月票总量柱状图data.csvdf.groupby(author)[month_ticket].sum().nlargest(10)找出高潜作者供平台定向扶持评分-月票散点图data.csvdf.plot.scatter(xrating, ymonth_ticket)检查是否存在“高分低票”作品实际写代码时作者月票榜的聚合结果会先写到peopleNum.csv它是很多后续分析的基石。散点图要注意rating列可能存在NaN画图前先用fillna(0)或者dropna()处理否则matplotlib会警告但不出图。3.3 多图联动做一个简单的可视化大屏当数据量上来之后单张图很难讲清楚完整故事我一般会把三张图组合到一个Tab页面里类似一个轻量可视化大屏。GUI.py里用的是matplotlib内嵌Tkinter而独立的HTML大屏可以直接用pyecharts生成from pyecharts.charts import Tab, Bar, Pie bar Bar().add_xaxis([f作者{i} for i in range(10)]) # 示例数据 pie Pie().add(series_name类型, data_pair[(热血, 55), (恋爱, 30)]) tab Tab() tab.add(bar, 作者月票) tab.add(pie, 类型占比) tab.render(visual_dashboard.html)Tab可以看作是一个多页签的可视化大屏渲染成HTML后浏览器直接打开。不过要注意pyecharts依赖Javascript渲染不适合直接嵌进Tkinter窗口所以在GUI里的图表仍然使用matplotlib的FigureCanvasTkAgg。4. K-Means聚类与推荐算法把榜单数据变成兴趣标签4.1 聚类特征构造数值列标准化JuLei.py和TuiJian.py分别负责聚类和推荐。拿到data.csv后需要构造数值特征例如total_click、month_ticket、rating并把is_finish作为二值特征。这个组合实际跑下来效果比较好的原因在于阅读量反映作品热度月票反映粉丝付费意愿评分反映口碑完结状态反映追更周期四者组合可以区分“高热度低口碑”和“小众高口碑”等不同漫画群组。特征含义量纲标准化方式total_click总点击量万级Z-Scoremonth_ticket月票数百级Z-Scorerating评分0-10Z-Scoreis_finish是否完结0/1不处理量纲差异很大total_click是千万级month_ticket可能只有几千如果不做标准化K-Means距离会被总点击量完全主导聚类结果几乎只能区分“爆款”与“普通作品”发现不了题材结构。所以我用StandardScaler做Z-Score标准化。4.2 K-Means聚类与K值选择聚类第一件事是选K值。常见做法是肘部法跑1到10个簇记录每个K的SSE簇内平方和画折线找拐点。也可以直接用轮廓系数但榜单漫画样本一般在几百条到几千条肘部法更直观计算更快。from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler import pandas as pd df pd.read_csv(data.csv) features df[[total_click, month_ticket, rating, is_finish]].fillna(0) scaler StandardScaler() X_std scaler.fit_transform(features) # 标准化避免量纲干扰 sse [] for k in range(1, 11): km KMeans(n_clustersk, random_state42, n_init10) km.fit(X_std) sse.append(km.inertia_) print(sse) # 观察下拉趋于平缓的位置作为K值参考n_init10很关键默认只有1次初始化会导致结果不稳定每换一次K值都可能出现不同簇。设置random_state42让结果可复现。sse列表里斜率明显放缓的位置就是肘点榜单数据通常在3到5之间。确定K后重新聚合并打标签km KMeans(n_clusters4, random_state42, n_init10) df[cluster] km.labels_ df.to_csv(data_clustered.csv, indexFalse)需要提醒的是聚类是无监督学习簇号本身不代表“人气高”或“人气低”要通过每个簇的特征均值来解读。我一般会打印df.groupby(cluster)[[total_click, month_ticket, rating]].mean()观察哪个簇评分高阅读量低哪个簇月票高点击量高。4.3 基于聚类的推荐算法TuiJian.py的核心思路是——用户喜欢作品A先找到A所在的簇再推荐该簇内高评分、高月票的其他漫画。这比单纯按总点击量推荐更能发现“小众同类好作品”。实现分三步第一步用K-Means给所有作品打簇标签第二步计算簇内作品与A的余弦相似度第三步过滤已读作品返回TopN。from sklearn.metrics.pairwise import cosine_similarity import numpy as np # X_std 是经过 StandardScaler 标准化后的特征矩阵 sim_matrix cosine_similarity(X_std) def recommend(comic_id, top_n5): idx df.index[df[comic_id] comic_id][0] # 找到目标作品的行号 sim_scores list(enumerate(sim_matrix[idx])) sim_scores sorted(sim_scores, keylambda x: x[1], reverseTrue) sim_scores [i for i, s in sim_scores if i ! idx] # 排除自身 top_idx sim_scores[:top_n] return df.iloc[top_idx][title].tolist()sim_matrix是一个对称矩阵sim_matrix[i][j]表示作品i和作品j在标准化特征空间里的余弦相似度。余弦相似度更关注方向而不是距离“点击量高、月票高、评分高”的作品会被归到同一个方向即使是不同类型的漫画也可能有高相似度这在实际推荐中能起到惊喜推荐的效果。4.4 对封面图做K-Means矢量化项目摘要里专门提到“使用K-Means算法对图像进行聚类完成对图像的矢量化操作”指的不是漫画推荐而是对images/man0.jpg这类封面缩略图做颜色压缩。原理是把图片所有像素当作RGB三维样本用K-Means找到K个中心色再用中心色替换每个像素达到类似矢量量化的效果。import cv2 import numpy as np img cv2.imread(images/man0.jpg) h, w, _ img.shape pixels img.reshape(-1, 3).astype(np.float32) k 8 _, labels, centers cv2.kmeans(pixels, k, None, criteria(cv2.TERM_CRITERIA_EPS cv2.TERM_CRITERIA_MAX_ITER, 20, 1.0), attempts3, flagscv2.KMEANS_PP_CENTERS) centers centers.astype(np.uint8) quantized centers[labels.flatten()].reshape(h, w, 3) cv2.imwrite(images/man0_quant.jpg, quantized)代码里attempts3表示在不同的随机中心上尝试3次取误差最小的结果KMEANS_PP_CENTERS使用k-means初始化比随机初始化收敛更快、簇更稳定。K8时漫画线条依然清晰但文件体积会明显缩小。量化后的图不仅适合在GUI里快速加载还能把颜色直方图作为封面图聚类的新特征。5. 用GUI整合爬虫、可视化和推荐Tkinter实战与聚类效果验证GUI.py用Tkinter做了三个Tab分别放数据采集、图表展示、推荐测试。左侧是“开始爬取”“生成图表”“执行聚类”三个按钮右侧是matplotlib画布和结果文本框。打包时建议用pyinstaller -F GUI.py --hidden-import sklearn因为scikit-learn在PyInstaller下经常漏打包。import tkinter as tk from tkinter import ttk from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib.figure import Figure app tk.Tk() app.title(TencentComics分析) tab ttk.Notebook(app) tab.pack(fillboth, expandTrue) fig Figure(figsize(5, 4), dpi100) canvas FigureCanvasTkAgg(fig, masterapp) # 将matplotlib画布嵌入Tk窗口 canvas.get_tk_widget().pack(sidetk.RIGHT, filltk.BOTH, expandTrue) app.mainloop()FigureCanvasTkAgg是matplotlib与Tkinter的桥梁所有动态更新都要先fig.clear()再重新绘制否则连续点击“生成图表”会导致旧图覆盖新图。聚类效果验证比看图更重要。SSE只能体现簇内紧密程度不体现簇间分离度建议用Calinski-Harabasz指数综合衡量簇间离散度与簇内紧密度的比值值越大表示聚类越清晰。from sklearn.metrics import calinski_harabasz_score score calinski_harabasz_score(X_std, km.labels_) print(fCH指数: {score:.2f})在GUI的结果文本框中我会同时输出CH指数、轮廓系数和每个簇的特征均值方便判断聚类是否稳定。一个容易被忽略的技巧data.json和__pycache__里的.pyc文件不是项目必需品直接删除不会影响运行.idea是PyCharm配置目录外发源码时应一并清理避免别人打开项目时工具栏一片混乱。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号