{"id":19659798,"url":"https://github.com/maicius/qqzonemood","last_synced_at":"2025-04-04T19:13:59.444Z","repository":{"id":43038620,"uuid":"81948145","full_name":"Maicius/QQZoneMood","owner":"Maicius","description":"QQZone mood spider and analysis. QQ空间多线程爬虫和数据挖掘。提供线上服务，扫码登陆即可自动爬取和分析数据，还有网易云年度报告风格的数据展示；使用docker-compose打包程序，方便部署；额外提供QQ空间抽奖小程序。","archived":false,"fork":false,"pushed_at":"2023-03-04T13:59:18.000Z","size":60053,"stargazers_count":525,"open_issues_count":0,"forks_count":130,"subscribers_count":19,"default_branch":"master","last_synced_at":"2025-03-28T18:16:21.061Z","etag":null,"topics":["docker","flask","mood","qq","qqzone","qzone","slider","slides","spider","thread"],"latest_commit_sha":null,"homepage":"http://app.xiaomaidong.com","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Maicius.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-02-14T13:31:07.000Z","updated_at":"2025-03-25T13:05:17.000Z","dependencies_parsed_at":"2024-11-11T15:55:11.085Z","dependency_job_id":null,"html_url":"https://github.com/Maicius/QQZoneMood","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Maicius%2FQQZoneMood","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Maicius%2FQQZoneMood/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Maicius%2FQQZoneMood/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Maicius%2FQQZoneMood/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Maicius","download_url":"https://codeload.github.com/Maicius/QQZoneMood/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247234923,"owners_count":20905854,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","flask","mood","qq","qqzone","qzone","slider","slides","spider","thread"],"created_at":"2024-11-11T15:44:23.955Z","updated_at":"2025-04-04T19:13:54.435Z","avatar_url":"https://github.com/Maicius.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# QQZoneMood\n\n### 体验地址：\n\n1. [app.xiaomaidong.com](http://app.xiaomaidong.com)\n2. [qzone.xiaomaidong.com](http://qzone.xiaomaidong.com/)\n\n### 相关博客\n\n- [关于python并发爬虫的一些经验总结](http://www.xiaomaidong.com/?p=1189)\n\n### QQ交流群\n 群号：707583419\n\n![](resource/image/qrCodeGroup.png)\n\n如果在使用中遇见bug，或者关于项目有什么想法，欢迎在群中交流\n\n### 简介\n\n- 多线程抓取QQ空间说说内容并进行分析，提供基于Flask和avalon.js的web配置界面，以及配套的测试用例\n\n- 基于React Slides的数据展示页面，风格模仿网易云年度报告。子项目地址:[QQZoneSwipper](https://github.com/Maicius/QQZoneSwipper)\n\n- 提供抽奖小程序，可以根据指定说说的点赞或评论信息进行随机抽奖（可单独打包为windows下的命令行程序）\n\n- 反向计算用户在每个时间点的好友数量，并可动态展示用户好友的增加过程，参考[视频](https://v.youku.com/v_show/id_XMzkxMDQ0NTcyMA==.html?spm=a2hzp.8244740.0.0)\n\n![](resource/image/newStyle.jpg)\n\n![](resource/image/newStyle2.jpg)\n\n### 系统架构图\n\n![](resource/image/sctructure.jpg)\n\n### 部署注意事项\n\n- 在本地分别启动后端和前端，端口号分别默认为5000和3000\n\n- 修改 QQZoneMood/src/web/static/constant.js中QQ\\_FRONT\\_LOCATION变量为前端地址,如\n\n\t\u003e http://localhost:3000\n\n- 修改 QQZoneSwipper/src/utils/constant.js中SERVER\\_HOST变量为后端地址，如：\n\n\t\u003e http://localhost:5000\n\n注意url末尾都不要加斜杠（/）\n\n\n### docker版简介\n\n- 本项目将网页配置版本打包为docker（以下简称docker版），本版本用于部署到线上\n\n- 此外，还有大量已完成的功能（爬取好友的动态、爬取图片等）未进行整合\n\n- docker版主要包括以下功能：\n\n\t\u003e 1.配置用户名、QQ号、校验码\n\n\t\u003e 2.根据1中配置获取QQ空间的动态数量和好友基本信息\n\n\t\u003e 3.数据可视化\n\n- 运行方式(请确保已经安装了docker和docker-compose)：\n\n\t\u003e 1.git clone https://github.com/Maicius/QQZoneMood.git\n\t\n\t\u003e 2.将 QQZoneMood/src/web/static/constant.js中QQ\\_FRONT\\_LACTION 修改为自己的前端项目地址（本地默认地址为localhost:3000）\n\n\t\u003e 3.cd QQZoneMood \u0026 docker-compose up -d\n\t\n\t\u003e 4.下载前端子项目\n\t\n\t\u003e git clone https://github.com/Maicius/QQZoneSwipper\n\t\n\t\u003e 5.将 QQZoneSwipper/src/utils/constant.js中的SERVER_HOST修改为服务器的地址（本地默认地址为localhost:80）\n\t\n\t\u003e 6.启动前端子项目，请确保已安装了npm\n\t\n\t\u003e \tcd QQZoneSwipper \u0026 npm install --save \u0026 npm run start\n\t\n\t\u003e 7.浏览器里输入地址: [http://localhost:80](http://localhost:80)\n\n\n- 关于校验码\n    \n    相当于用户在该网站的密码，为了安全请不要与QQ密码相同。设置校验码的目的是为了保证用户在该网站上只能查看自己的数据。\n    \n### 开发版运行方式 \n\n- 0.下载\n\n\t\u003e git clone https://github.com/Maicius/QQZoneMood.git\n\n\t\u003e cd QQZoneMood\n\n- 1.安装依赖\n\n\t\u003e pip3 install -r requirements.txt \n\t\n\t（不建议使用conda，因为sha1等库在conda的源中没有）\n\n- 2.修改配置文件\n\n\t\u003e 修改userinfo.json.example为文件userinfo.json，并填好QQ号、QQ密码、保存数据用的文件名前缀；\n\t\n\t\u003e [可选]修改需要爬取的好友的QQ号和保存数据用的文件名前缀\n\t\n- 3.\\_\\_init\\_\\_函数参数说明，请根据需要修改（所有参数都有默认值，即使不修改任何参与也能运行）\t\n\n\n\t\tdef __init__(self, use_redis=False, debug=False, mood_begin=0, mood_num=-1, stop_time='-1',\n                 download_small_image=False, download_big_image=False,\n                 download_mood_detail=True, download_like_detail=True, download_like_names=True, recover=False,\n                 cookie_text=None, from_web=False, username='', nickname='', no_delete=True, pool_flag='127.0.0.1'):\n\n        :param use_redis: If true, use redis and json file to save data, if false, use json file only.\n        :param debug: If true, print info in console\n        :param mood_begin: 开始下载的动态序号，0表示从第0条动态开始下载\n        :param mood_num: 下载的动态数量，最好设置为20的倍数\n        :param stop_time: 停止下载的时间，-1表示全部数据；注意，这里是倒序，比如，stop_time=\"2016-01-01\",表示爬取当前时间到2016年1月1日前的数据\n        :param recover: 是否从redis或文件中恢复数据（主要用于爬虫意外中断之后的数据恢复）。注意!!!此功能在多线程中不可用！！！\n        :param download_small_image: 是否下载缩略图，仅供预览用的小图，该步骤比较耗时，QQ空间提供了3中不同尺寸的图片，这里下载的是最小尺寸的图片\n        :param download_big_image: 是否下载大图，QQ空间中保存的最大的图片，该步骤比较耗时\n        :param download_mood_detail:是否下载动态详情\n        :param download_like_detail:是否下载点赞的详情，包括点赞数量、评论数量、浏览量，该数据未被清除\n        :param download_like_names:是否下载点赞的详情，主要包含点赞的人员列表，该数据有很多都被清空了\n        :param from_web: 表示是否来自web接口，如果为True，将该请求来自web接口，则不会读取配置文件\n        :param username: 在web模式中，传递过来的用户QQ号\n        :param nickname: 在web模式中，传递过来的用户昵称\n        :param no_delete: 是否在redis中缓存数据，如果为True,则不会删除，如果为False，则设置24小时的缓存时间\n        :param pool_flag: redis的连接池host，因为docker中host与外部不同，所以在启动程序时会自动判断是不是处于docker中\n        \n- 4.运行flask服务器\n\n\t\u003e python3 src/web/server.py\n\n- 5.其它程序入口可以参考test中测试用例\n\n\n### 已实现功能\n\n##### 1.基本功能\n\n\u003e 这部分主要是获取数据和进行基本的统计分析\n\n- QQ空间动态爬取，包括：\n\n\t\u003e 1. 所有说说信息\n\t\u003e 2. 每条说说的详细信息（比1中的信息更全面，1中数据只显示每条说说的前10个评论）  \n\t\u003e 3. 每条说说的点赞人列表\n\t\u003e 4. 更加详细的点赞人列表（3中获取的数据有很多被清空了，这里能稳定获取到点赞的人数量、浏览量和评论量）\n\t\u003e 5. 所有说说的图片（可选择是下载大图、缩略图还是都下载）\n\t\n- QQ空间好友基本信息爬取\n\t\n\t\u003e 1. 好友基本信息\n\t\u003e 2. 共同好友数量\n\t\u003e 2. 共同群组\n\t\u003e 3. 添加好友时间(可计算出用户在每个时间点的好友数量)\n\t\n- 数据分析\n\t\n\t\u003e 1. 数据清洗，将所有抓取的信息清洗为excel或csv\n\t\u003e 2. 包括各种点赞排行、评论排行、发送时间统计等\n\t\u003e 3. 历史说说一览表\n\n- 数据可视化\n\n\t\u003e 包括各种词云图、关系图\n\n- Web配置界面\n\n\t\u003e 使用Flask + avalon.js + echarts.js 搭建的简易web界面，为普通用户提供一个快速获取数据的方法\n\t\n\t\u003e 可视化爬虫过程\n\t\n\t\u003e 可视化用户数据、历史说说记录\n\t\n##### 2.衍生功能（这部分功能的代码没有完全添加到项目里）\n\n- QQ空间动态情感检测\n\n\t\u003e 基于[百度自然语言处理API](http://ai.baidu.com/tech/nlp/sentiment_classify),可免费使用\n\n- QQ空间照片评分\n\t\n\t\u003e 基于[Google NIMA模型](https://modelzoo.co/model/nima)\n\n- QQ空间好友关系演变图\n\t\n\t\u003e [戳这里查看视频演示](https://v.youku.com/v_show/id_XMzkxMDQ0NTcyMA==.html?spm=a2hzp.8253869.0.0)\n\n\n### 项目结构\n\n\u003cimg src=\"resource/image/file_structure.png\" style=\"width:300px\"\u003e\n\n说明如下：\n\n#### resource:存放数据文件（不包括web中的静态资源）\n#### src-spider:包括四个爬虫类和一个入口\n\n- BaseSpider(object): 爬虫基类，初始化各种变量和提供基础接口，统一管理爬虫的headers、数据的加载和存储\n- QQZoneSpider(BaseSpider):爬取QQ空间动态的主要逻辑，包括各种url的构建\n- QQZoneFriendSpider(QQZoneSpider): 爬取用户的好友基本信息和共同群组，计算用户在各个时间段的好友数量\n- QQZoneFriendMoodSpider(QQZoneSpider):爬取用户指定好友的动态\n- main: 程序入口，为web程序提供爬虫API\n\n#### src-analysis:\n\n- QQZoneAnalysis: 数据清洗，将爬虫得到的原始数据清洗为excel形式，并做简单的数据统计和分析\n- Average: 计算平均评论量、点赞量、浏览量等数据\n- SentimentClassify: 调用百度人工智能API进行情感分类\n- TrainMood：已废弃，以前计划用来对文本内容分类等等\n\n#### src-visual:\n\n- CreateGexf: 将用户好友数据生成Gephi软件可以接受的数据格式以进行聚类\n\n#### src-web：网站模块\n\n- src-web-entity: 实体类\n- static: 静态资源，外部引用的包主要使用cdn\n- templates：网页\n\n\n### 其它说明\n\n- python版本：3.6\n- 模拟登陆时若出现图形验证码，可以在点击登陆后设置5秒暂停，以手动完成验证\n- 数据存储方式：\n\n\t\u003e 目前提供了两种存储方式的接口（通过Spider中use_redis参数进行配置）:  \n\t\u003e 1. 存储到json文件中   \n\t\u003e 2. 存储到redis数据库中  \n\t\u003e 如果安装了redis，建议存储到redis中  \n\t\u003e 关于redis的安装和配置，请自行搜索  \n\t\u003e Redis使用中常见问题可以参考这篇博客:[Redis 踩坑笔记](http://www.xiaomaidong.com/?p=308)\n\n- *注意*：\n \t\n \t\u003e 程序提供了三种登陆的接口，分别是扫码登录、cookie登录、账号密码模拟登录，默认使用扫码登录\n \t\u003e 其中账号密码模拟登录依赖于selenium，需要手动下载chrome driver和chrome浏览器  \n\t\u003e 请注意版本匹配，可以查看这篇博客：  \n\t\u003e [selenium之 chromedriver与chrome版本映射表（更新至v2.32）](http://blog.csdn.net/huilan_same/article/details/51896672)\n\n- 运行结果例图：\n![IMAGE](resource/image/screen1.png)\n![image](resource/image/image2.png)\n![Image](resource/image/comment.jpg)\n![Image3](resource/image/comment_content.jpg)\n![Image](resource/image/bike2.png)\n![QQ好友成长图](resource/image/qqfriend.png)\n![抽奖小工具](resource/image/raffle.png)\n\n\u003e QQ动态关键字词云\n\n![QQ空间说说按点赞和评论数分类图](resource/image/shuoshuoPie.png)  \n\n\u003e QQ空间说说按点赞和评论数分类图\n\n![mobile](resource/image/mobileScreen.png)\n\n\u003e 手机端运行截图\n\n\n\n![Image](resource/image/relation.png)\n\u003e 使用Gephi软件生成的好友关系图\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaicius%2Fqqzonemood","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaicius%2Fqqzonemood","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaicius%2Fqqzonemood/lists"}