新闻详情

新闻详情

首页 / 资讯中心 / 详情

微博恶意用户识别系统:爬虫、特征工程与模型落地全流程

发布时间:2026/9/26 8:45:32来源:尧图网络
微博恶意用户识别系统:爬虫、特征工程与模型落地全流程
简介这份资源是面向计算机相关专业学生、教师及企业开发者的机器学习实战项目包聚焦微博平台恶意用户识别这一典型社交网络安全场景。项目为个人高分作品经导师指导与答辩评审获得95分代码已测试可正常运行适合用作毕业设计、课程设计、作业提交或项目初期演示也便于初学者理解机器学习在文本与用户行为分析中的落地方式。压缩包共66个文件约10.54MB涵盖Python源码、npy数据文件、dat数据集、sql建表脚本、html页面、yaml配置及说明文档等覆盖数据爬取、特征处理、模型训练与Web展示等环节。目前已有53人学习下载。读者可获取完整项目源码、详细文档与可运行环境参考其目录组织与模块划分快速复现恶意用户识别流程并在此基础上进行功能扩展或二次开发。1. 微博恶意用户识别系统从爬虫到模型落地的完整拆解微博每天产生海量内容正常用户和恶意账号混在一起人工审核根本看不过来。这个项目用机器学习做恶意用户识别配套了爬虫、特征工程、模型训练和 Flask 演示的完整链路还带一份详细文档。我拿到手第一反应是终于不是那种只有几个 notebook 的“半成品”了。它适合计算机相关专业做毕设或课程设计的人也适合想跑通一个完整机器学习项目的新手。整个包里有爬虫脚本、SQL 数据、模型代码和 Web 演示能直接跑起来看效果不是只给你一堆理论。下面我按实际拆包和复现的顺序把关键环节和踩过的坑讲清楚。2. 资源结构与运行环境先看清包里有什么再动手2.1 目录拆解与文件职责拿到压缩包后别急着解压运行先扫一遍目录结构。这个项目的文件组织比较典型我按功能分成四块文件/目录作用备注crawler/微博数据采集脚本含weiboCrawler.py、concern.py、fans.py、newUser.pysrc/核心源码特征处理、模型训练、评估learner/学习器/模型封装可能包含 sklearn 或自定义模型flask_demo/Web 演示提供可视化界面data/数据存放可能含原始或处理后数据xinan.sql/xinan_with_data.sql数据库导出带数据的版本可直接导入evil1.txt恶意用户名单或标签用于监督学习insertUser.py用户数据入库脚本配合 MySQL 使用mysqldump.sh数据库备份脚本运维辅助README.md项目说明先读这个cookies.txt是爬虫用的登录态文件nohup.out是后台运行日志。这些细节说明项目确实跑过不是纯理论堆砌。2.2 环境依赖与数据库初始化项目基于 Python依赖常见的机器学习库。我建议用 Python 3.7 或 3.8太新的版本某些库可能不兼容。先建虚拟环境python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate pip install -r requirements.txt # 如果没有手动装下面这些常见依赖包括scikit-learn、pandas、numpy、flask、requests、beautifulsoup4、pymysql。如果requirements.txt缺失按报错逐个装。数据库部分项目提供了xinan_with_data.sql直接导入就能拿到带数据的表mysql -u root -p -e CREATE DATABASE xinan DEFAULT CHARACTER SET utf8mb4; mysql -u root -p xinan xinan_with_data.sql导入后检查表结构通常会有用户表、微博内容表、关系表。insertUser.py负责把爬到的用户写进库运行前改一下数据库连接配置。注意cookies.txt里的登录态会过期爬虫跑之前先确认是否有效否则请求会被重定向到登录页拿不到数据。3. 爬虫模块实战用户信息、关注和粉丝怎么抓3.1 爬虫脚本的分工与调用关系crawler/下几个脚本各司其职。weiboCrawler.py是主入口负责抓取微博内容concern.py抓关注列表fans.py抓粉丝列表newUser.py可能是增量用户发现。它们共用cookies.txt做身份认证。我一般先跑newUser.py发现新用户再用concern.py和fans.py扩展关系网络最后用weiboCrawler.py抓这些用户的微博内容。这样能构建一个以恶意用户为中心的社交图谱。# 以 fans.py 为例核心逻辑是构造请求并解析 JSON import requests import json import time def get_fans(uid, cookie, page1): url fhttps://weibo.com/ajax/friendships/friends?uid{uid}page{page} headers { Cookie: cookie, User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } resp requests.get(url, headersheaders, timeout10) if resp.status_code ! 200: print(f请求失败状态码 {resp.status_code}) return None data resp.json() # 解析用户列表提取 uid、昵称、关注数等字段 users data.get(users, []) for u in users: print(u[id], u[screen_name]) return users # 调用时传入 cookie 字符串和用户 uid # cookie 从 cookies.txt 读取注意转成单行字符串这段代码的关键参数是uid和page。微博的粉丝接口分页返回每页大概 20 条。Cookie必须完整缺一个字段都可能被拒。time.sleep要加在循环里否则请求太频繁会触发风控返回 403 或空数据。3.2 反爬应对与数据落库微博的反爬不算特别狠但有几个点要注意。第一请求头里的User-Agent和Referer要带上Referer设为https://weibo.com/。第二单账号抓取频率别太高我一般每页间隔 2 到 3 秒。第三如果返回的 JSON 里ok字段为 0说明被限制了换个 cookie 或等一段时间。抓到的数据用insertUser.py写进 MySQL。这个脚本通常用pymysql连接执行INSERT INTO ... ON DUPLICATE KEY UPDATE避免重复。跑之前确认表字段和脚本里的 SQL 对得上尤其是uid的类型微博 uid 是字符串别设成 int。import pymysql conn pymysql.connect(hostlocalhost, userroot, passwordyourpass, databasexinan, charsetutf8mb4) cursor conn.cursor() sql INSERT INTO users (uid, screen_name, followers_count, friends_count) VALUES (%s, %s, %s, %s) ON DUPLICATE KEY UPDATE screen_name%s cursor.execute(sql, (uid, name, followers, friends, name)) conn.commit()参数说明host、user、password按本机配置改charset用utf8mb4才能存 emoji 和特殊字符。ON DUPLICATE KEY UPDATE保证重复抓取时更新而不是报错。4. 特征工程与模型训练恶意用户识别的核心逻辑4.1 特征选取与标签构建恶意用户的识别本质是二分类问题。项目里evil1.txt应该是恶意用户名单作为正样本标签。特征主要从用户属性、行为统计和内容三个维度提取用户属性注册天数、粉丝数、关注数、是否认证、性别、地区行为统计发博频率、原创比例、转发比例、评论数均值、点赞数均值内容特征微博文本长度、是否含链接、是否含敏感词、表情符号比例关系特征关注/粉丝比、与已知恶意用户的交互次数关注/粉丝比是个强特征。正常用户这个比值不会太极端而恶意账号往往关注几千人但粉丝只有几十个。项目里应该用了类似逻辑。标签构建时要注意样本平衡。恶意用户通常远少于正常用户直接训练会导致模型偏向多数类。常见做法是欠采样或 SMOTE 过采样。我一般先用class_weightbalanced让模型自动调整权重效果不够再上采样。4.2 模型训练与评估代码src/下的训练脚本通常用 sklearn 的 Pipeline 组织。下面是一个典型的训练流程import pandas as pd from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report, roc_auc_score from sklearn.preprocessing import StandardScaler # 读取特征数据假设已经处理好存成 csv df pd.read_csv(data/features.csv) X df.drop([uid, label], axis1) y df[label] # 划分训练集和测试集 stratify 保证标签比例一致 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42, stratifyy ) # 标准化树模型其实不太需要但逻辑回归等需要 scaler StandardScaler() X_train scaler.fit_transform(X_train) X_test scaler.transform(X_test) # 随机森林n_estimators 设 100 到 200 之间 clf RandomForestClassifier( n_estimators150, max_depth12, class_weightbalanced, random_state42, n_jobs-1 ) clf.fit(X_train, y_train) # 预测并评估 y_pred clf.predict(X_test) y_prob clf.predict_proba(X_test)[:, 1] print(classification_report(y_test, y_pred)) print(AUC:, roc_auc_score(y_test, y_prob))参数说明n_estimators是树的数量太少欠拟合太多训练慢且提升有限150 左右比较稳。max_depth控制树深防止过拟合12 层对几千条数据够用。class_weightbalanced自动按类别频率反比设权重缓解不平衡。n_jobs-1用满 CPU 核。评估时别只看准确率。恶意用户识别里召回率往往比精确率重要漏掉一个恶意账号可能比误封一个正常账号代价更大。看classification_report里 label1 的 recall 和 f1-score。4.3 Flask 演示与结果可视化flask_demo/提供了一个 Web 界面输入用户 uid 或特征返回是否恶意的判断。启动方式通常是cd flask_demo python app.py默认跑在5000端口。打开浏览器访问http://127.0.0.1:5000能看到输入框和结果展示。这个演示适合答辩时展示比纯命令行直观。如果端口被占用改app.py里的app.run(port5001)。注意Flask 演示依赖训练好的模型文件。如果src/下没有生成.pkl或.joblib先跑训练脚本保存模型再启动 Web 服务。5. 避坑与常见问题排查5.1 爬虫返回空数据或 403现象运行fans.py或weiboCrawler.py时请求返回 403 或 JSON 里ok为 0拿不到用户列表。原因cookie 过期、请求频率过高被风控、或者缺少必要的请求头。解决重新从浏览器复制 cookie 更新cookies.txt在循环里加time.sleep(2)以上检查headers里是否带了Referer和User-Agent。如果还不行换一个账号的 cookie。5.2 数据库导入报错字符集问题现象导入xinan_with_data.sql时提示Unknown character set: utf8mb4或中文乱码。原因MySQL 版本过低不支持utf8mb4或者导入时没指定字符集。解决MySQL 5.5 以上都支持utf8mb4如果版本太低建议升级。导入时加--default-character-setutf8mb4mysql -u root -p --default-character-setutf8mb4 xinan xinan_with_data.sql5.3 模型训练报错“Input contains NaN”现象跑训练脚本时 sklearn 抛出ValueError: Input contains NaN, infinity or a value too large。原因特征表里有缺失值或无穷大。爬虫抓取时某些字段可能为空或者关注/粉丝比为 0 时做了除法。解决在训练前加缺失值处理X X.fillna(0) # 简单填充也可以用均值 X X.replace([np.inf, -np.inf], 0) # 处理无穷大更稳妥的做法是在特征工程阶段就检查每列的缺失比例超过 30% 的列考虑丢弃。5.4 Flask 启动后页面报 500 错误现象访问http://127.0.0.1:5000后页面显示 Internal Server Error。原因模型文件路径不对、模型加载失败、或者输入特征维度不匹配。解决看终端里的 traceback。常见的是app.py里模型路径写成了绝对路径换台机器就找不到。改成相对路径或基于os.path.dirname(__file__)拼接。另外确认输入特征的顺序和训练时一致sklearn 对特征顺序敏感。5.5 样本极度不平衡导致模型全预测为正常现象训练完发现所有测试样本都被预测为 0正常用户恶意用户的 recall 为 0。原因恶意样本太少模型学到了“全部预测为多数类”就能拿到高准确率。解决除了class_weightbalanced还可以用imblearn的 SMOTE 过采样或者手动调整决策阈值。我一般先看predict_proba的分布如果恶意样本的概率普遍偏低把阈值从 0.5 降到 0.3 试试。6. 进阶技巧用交叉验证和特征重要性反推业务逻辑跑通基础流程后别急着调参。先做两件事交叉验证和特征重要性分析。交叉验证能告诉你模型稳不稳定特征重要性则能帮你理解哪些行为最能区分恶意用户。from sklearn.model_selection import cross_val_score from sklearn.ensemble import RandomForestClassifier import numpy as np clf RandomForestClassifier(n_estimators150, max_depth12, class_weightbalanced, random_state42) # 5 折交叉验证看 AUC 的均值和方差 scores cross_val_score(clf, X, y, cv5, scoringroc_auc) print(AUC 均值:, np.mean(scores), 标准差:, np.std(scores)) # 训练后看特征重要性 clf.fit(X, y) importances clf.feature_importances_ for name, imp in sorted(zip(X.columns, importances), keylambda x: -x[1]): print(f{name}: {imp:.4f})如果交叉验证的 AUC 标准差超过 0.05说明模型对数据划分敏感可能需要更多数据或更简单的模型。特征重要性排前几的通常是关注/粉丝比、发博频率、账号年龄。这些特征和业务直觉一致说明模型学到了真东西而不是噪声。我还会做一件事把特征重要性最高的几个特征单独拿出来画一下正负样本的分布。比如关注/粉丝比恶意用户可能集中在 10 以上正常用户集中在 0.1 到 2 之间。这种分布图在答辩时特别有说服力比只报一个准确率强得多。从那以后我每次拿到类似项目都强制先跑一遍交叉验证和特征重要性再决定要不要调参。很多所谓的“模型效果不好”其实是特征没选对或者数据泄漏了。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

SQL Server数据库设计实战:从表结构到索引优化的完整指南 2026/9/26 12:53:39

SQL Server数据库设计实战:从表结构到索引优化的完整指南

做SQL Server这套东西十几年,每次接手一个新项目,我第一件事不是写代码,而是先看数据库设计。很多人觉得这是小题大做,觉得CRUD嘛,表随便建一建就行了。但恰恰是这个"随便",后面会让你付出成倍的…

阅读更多 →
SQL Server数据库设计实战:从用户表到索引优化的完整指南 2026/9/26 12:53:39

SQL Server数据库设计实战:从用户表到索引优化的完整指南

1. 项目概述:别急着写表,先想清楚数据模型入行做 SQL Server 开发这么多年,我见过太多“表先建起来、业务跑着跑着再补丁”的项目,最后大多陷入字段冗余、关联混乱、查询慢到怀疑人生的泥潭。所谓数据库设计,并不是拿 …

阅读更多 →
基于小波包畸变与卷积神经网络的机械系统不平衡故障诊断方法解读 2026/9/26 12:53:39

基于小波包畸变与卷积神经网络的机械系统不平衡故障诊断方法解读

在机械系统状态监测中,实测故障样本数量往往远少于正常样本,容易导致分类模型偏向多数类而出现误诊。针对这一问题,论文《Highly imbalanced fault diagnosis of mechanical systems based on wavelet packet distortion and convolutional n…

阅读更多 →
Ubuntu22.04 装 libcurl3 依赖冲突:用 TaoToken 统一 Key 排查 apt 报错与配置骨架 2026/9/26 12:53:39

Ubuntu22.04 装 libcurl3 依赖冲突:用 TaoToken 统一 Key 排查 apt 报错与配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Agent技能模块化实战:从Prompt堆叠到可编排的技能体系 2026/9/26 12:53:39

Agent技能模块化实战:从Prompt堆叠到可编排的技能体系

1. 从“能聊”到“能干活”:Agent技能模块化到底在解决什么问题最近大半年,我一直在做智能体(Agent)方向的工程落地,发现一个特别典型的现象:很多人搭出来的AgentDemo效果很惊艳,能聊天、能推理…

阅读更多 →
Harness Engineering:高并发智能体的工程化落地实践 2026/9/26 12:53:32

Harness Engineering:高并发智能体的工程化落地实践

1. Harness Engineering不是新名词,而是工程范式的系统性升级很多人看到“2026新版Harness Engineering”第一反应是:又出新框架了?是不是LangChain的下一代?或者又是某个创业公司包装的概念?我去年在三家不同行业的客…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉