本项目仓库:GitHub:WFACat
此文章为 WFACat v2.0
一 软件概况
- 软件功能概述:
可以分析任意微博用户的二度人脉(全部为互关好友)情况,人脉深度为 2(生成数据可视化软件 Gephi 所需要的节点文件和边文件 node.csv、edge.csv)。
模块化设计,可以直接使用 main.py;也可以单独使用 get_data.py 来获取到 n 度好友的详细信息;或单独使用 analysis_store_data.py 来对已有(之前 get_data.py 模块下载好的)文件生成 node.csv、edge.csv。
软件使用前需要设置:
可以通过一个小号,分析数据包获得微博授权的 api 链接(详见我的博文 《通过微博手机客户端爬取数据的分析》),通过此链接可以获得某用户互关好友列表的 json 文件。生成 temp 文件夹存放每个用户的互关好友列表文件(以该用户 uid 命名);生成 data 文件夹存放要生成的 node.csv、dege.csv 文件。
temp 文件夹中以数字命名的文件夹是存几度人脉的好友信息文件。其中每个文件以该用户 uid 命名。
- 软件功能功能小结:
需要准备:一个用来获得授权的链接(通过微博账号)、所要研究的用户其用户名。
通过此软件能得到:
a)tools 模块:某用户信息查询、某用户互关好友列表查询。
b)用于 Gephi 数据可视化软件分析的 node.csv、edge.csv 文件。
c)深度分析的信息(更新中):查询
:
某任意用户信息实时查询;/ 某一互关好友信息实时查询;/ 某一用户信息本地查询(数据库直接能查到的);/ 某个(或全部)一度好友可能通过哪些人认识另外的一度好友;/ 某个(或全部)圈内二度人脉能连接哪些好友,连接几个、哪个是连接最多的(视图)。统计(mysql query 模块)
:
所有一度人脉信息;/ 所有除节点度为 1 的二度人脉信息;/ 能关联最多一度好友的二度好友,排序;/ 总人数、一度好友数、圈内二度好友数、二度好友数;/ 数据库中若干属性统计(分为总体、一度、二度圈内好友、二度好友)。推测
:
根据统计的结果做出一些有趣的推测(该用户真实生活城市、在哪个城市生活过(通过一度人脉位置统计)等)。
二 软件使用方法
- 使用方法:
运行 main.py,使用 help 命令查看可以使用的命令。
conf 命令进行配置(配置授权链接(必填)、要研究对象的微博名称(只使用 tools 模块可以不填)),此配置供生成 csv 文件和数据写入 MySQL 使用。
想生成 csv 文件和数据写入 MySQL,必须先使用 get 命令获得基本的原始数据。
然后分别用 tocsv、tomysql 命令生成 csv 文件供 Gephi 使用,写入数据库供 mysql_query 模块使用(用 detail 命令)。
如果想获得详细的分析结果,使用 detail 命令(首先必须 get、tomysql 将数据写入数据库)。
tool 命令可以查某一个微博用户的详细信息;查某一个微博用户的相互关注的人列表及其互关人的详细信息。(此模块运行只需要配置授权链接即可)
- 生成的文件夹:
所有基本数据会在 WFACat_data 文件夹中。
data 文件夹存放生成的 node.csv、edge.csv 文件,供数据可视化软件 Gephi 分析。
temp 文件夹存放互关好友数据。person.json 是研究对象的个人信息,用来提取其 uid 然后生成 1 度人脉文件夹,获取他自己的一度人脉信息(2 度人脉以他的一度人脉信息为种子,遍历下载一度人脉每个好友的好友信息)。数字文件夹表示第几度人脉,其中以 uid 命名的文件夹表示用户,其中的 json 文件是该用户的互关好友信息。
- 生成的 MySQL 数据库数据:
表 peopleinfo 里存放整个二度人脉每个人的详细信息(除研究对象)。其中 rel_me 属性 1 表示一度好友、2 表示圈内二度好友、2.1 表示节点度为一的二度好友;/ connect_to_my_friends 属性是研究对象与一度好友间共同关注的一度好友;/ connect_to_two_level_friends 属性表示圈内二度好友列表;/ total_number 属性表示一共的互关好友数。
表 mutualinfo 里存放每个一度好友的互关好友信息。
表 u 开头的是每个一度好友可以间接认识的人,通过谁(除节点度为 1 的二度好友),一共几个人。
三 软件运行逻辑概述
1 准备(settings.py)
main.py 中初始化生成一个配置文件 config.json。
进行配置(授权用的私有链接、需要研究的用户微博名)、读取配置。
将授权的私有链接拆解,组装成可以下载某用户信息文件的链接、组装成可以获取某用户互关好友列表文件的链接。
2 下载数据文件(get_data.py)
下载所要分析用户的用户信息文件,获取其 uid,然后下载其互关好友列表文件(一度人脉),文件名以他的 uid 命名。
通过此,所要研究的用户的互关好友列表文件作为启动种子文件,以此为起点。存放在
\WFACat_data\temp\1\XX(uid)XX
文件夹中。以人脉深度为循环次数,从文件夹 1 开始 -> 遍历用户文件夹 -> 遍历用户文件夹中的 json 文件 -> 遍历 json 中每个 uid,根据此 uid 下载好友信息的 json 文件。存在下一度人脉文件夹中对应 uid 用户文件夹中(注意,下载该用户全部好友信息的 json 文件写成函数,page 参数累加构造请求来下载)。
3 生成 csv 或写入 MySQL
获取到所有基本信息文件后。以人脉深度为循环次数,从文件夹 1 开始 -> 遍历用户文件夹 -> 遍历用户文件夹中的 json 文件 -> 遍历 json 中每个 uid 等信息。
生成 csv 文件或写入 MySQL(具体方法见上面分析)。核心在于怎样遍历,读取到用户信息,然后根据此信息分析写入数据。
四 软件运行逻辑详解(思维导图)
1 解释
整个二度人脉所有人(节点)集合可分为四类:
研究对象(如自己)、一度好友、圈内二度好友(连接各个一度好友)、圈外二度好友(节点的度为 1,大概率与自己朋友圈无关,本项目不研究)。自己的互关好友列表(用一个字典 A 表示:自己的 uid 为键,互关列表为值)。
my_friendinfo_dict
。若干个一度好友的互关列表(同样用一个字典 B 表示:该一度好友的 uid 为键,互关列表为值)。
friends_friendinfo_dict
。圈内二度好友(除节点度为 1 的二度好友)集合 C:
通过字典 B 中每个值(一度好友互关列表)两两取交集,然后除去自己和所有一度好友。two_level_useful_friends_list
。计算每个一度好友与自己共同关注的一度好友:
字典 B 中某值与字典 A 中值取交集,直接写入数据库。计算每个一度好友的圈内二度好友(用字典 D 表示:键为该一度好友 uid,值为圈内二度好友列表):
字典 B 中某值与 C 取交集。friends_two_level_friendinfo_dict
。计算每个一度好友能间接认识哪些一度好友:
字典 D 的值(圈内二度好友列表)两两取交集,有交集表示可以间接认识,交集部分是通过谁认识的。
有交集则创建彼此 uid 的表,分别将对方 uid 写入自己的表,并写入交集部分,交集列表长度即通过多少人认识。
2 补充
两两取交集的意思:
通过两层循环(外循环遍历从第一个元素到倒数第二个元素;内循环拿外循环这个元素分别与自己的下一个元素比较,到最后一个元素),有若干个元素两两比较,不重复比较。总比较次数为排列组合中 C n 2 次。如图假设自己共 30 个互关的一度人脉好友。
3 对数据库深度分析(mysql_query.py)
- 查询:
通过微博用户名查某用户基本信息
通过 uid 查某用户基本信息
通过微博用户名查某用户的互关好友列表及其好友信息
通过微博用户名查某一度好友能通过圈内二度好友认识的一度好友
所有一度好友信息
- 统计:
总体概况:总人数、一度好友数、圈内二度好友数、二度好友数
能关联最多一度好友的圈内二度好友(取 10 条排序),能关联谁
一度好友中与其他一度好友互关最多的人(排序)、与圈内二度好友互关最多的人;分别是哪些人
一度好友 / 圈内二度好友 / 二度好友中认证情况统计
一度好友地理位置统计、性别统计、关注数、粉丝数、状态数、点赞数、微博创建时间、互关好友总数、客户端
圈内二度好友地理位置统计、性别统计、关注数、粉丝数、状态数、点赞数、微博创建时间、互关好友总数、客户端
二度好友地理位置统计、性别统计、关注数、粉丝数、状态数、点赞数、微博创建时间、互关好友总数、客户端
- 推测:
根据统计的结果做出一些有趣的推测(如统计手机客户端型号等)。
五 遇到的问题
- 拆分授权链接、拆分授权链接中请求参数
- 组装请求链接
- 判断、创建文件夹
- 读写 json、csv 文件
- 下载文件,判断是否有下载异常
- 通过循环、多层遍历访问文件夹、文件
- Python 中使用 MySQL
- 所要获得的数据计算思路
- 判断某数据库是否存在
- 根据想要获得存储的信息设计数据库、表(数据库要用 utf8mb4,否则无法存储 4 字节的 Emoji 表情)
- 读取 json 文件想要的信息时的对数据的处理:判断某个键是否存在。/ 用正则表达式转义特殊字符。/ 用正则表达式过滤想要的字符串。
- 通过写入数据库的基本信息,设计 mysql_query.py 模块做深度分析(基本数据查询、统计、推测判断)。
六 使用部分截图
所有操作都通过 main.py 完成。