“社交网络”分析

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

“社交网络”分析 - 更上一层楼!
- 博客频道 - CSDN.NET

更上一层楼!

一切安排都是最好的,剩下的就交给时间!

【活动】2017 CSDN博客专栏评选

&nbsp

【5月书讯】流畅的Python,终于等到你!
   &nbsp

CSDN日报20170517 ——《怎样和虐死人的老项目谈恋爱》

“社交网络”分析

标签:
社交网络模块化图形爬虫

2017-05-18 15:27
51人阅读
评论(0)
收藏
举报

本文章已收录于:

.embody{
padding:10px 10px 10px;
margin:0 -20px;
border-bottom:solid 1px #ededed;
}
.embody_b{
margin:0 ;
padding:10px 0;
}
.embody .embody_t,.embody .embody_c{
display: inline-block;
margin-right:10px;
}
.embody_t{
font-size: 12px;
color:#999;
}
.embody_c{
font-size: 12px;
}
.embody_c img,.embody_c em{
display: inline-block;
vertical-align: middle;
}
.embody_c img{
width:30px;
height:30px;
}
.embody_c em{
margin: 0 20px 0 10px;
color:#333;
font-style: normal;
}


分类:

Python(84)

作者同类文章X

版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。转载时请标注http://blog.csdn.net/marksinoberg.

    • 前言
    • 环境
      • virtualenv
      • 第三方库
    • 模块化
      • 爬虫模块

        • 关于模拟登陆
        • 爬取数据
      • 图形化
        • 步骤
        • 中文节点问题
      • 实战
    • 总结

前言

最近国产的一部电视剧《人民的名义》突然的就火了,随之而来的是各大Coder们的社交网络分析。针对剧本中出现的人名,事件,词频等以图形化的界面展示,清晰化的显示出了剧本的特色。

而对于CSDN的关注人和粉丝的图形化展示,也恰好符合这一个主题(暂且这么认为吧)。本来想做的是公共粉丝(比如哪个人既关注了A,又关注了B),但是在博客中由于权限的问题,获取不到相关的数据,于是只能做下关注人和粉丝的图形化展示了。

先来看下最终效果图。

环境

从上面的效果图上也可以看出,命令行前面有一个(env)的前缀,这是使用了virtualenv的缘故。

virtualenv

使用virtualenv可以很好的隔绝本地的Python环境,而且也不是很占用磁盘空间,对每一个项目使用一个单独的环境还能大大减少出现意外的频率,更好的维护代码,排查错误。

安装virtualenv也非常的简单。

pip install virtualenv

安装好之后,就可以在任意的目录下,使用命令行执行下面的命令。比如我在桌面新建了一个名为nerwork的文件夹,我就可以进入到这个文件夹内部,打开命令行,执行:

virtualenv env

这样network文件夹下就会多出一个env的目录,里面的环境就是根据我们本地的Python环境而新建的一个隔离区。

这样还不算完成,最后一步就是激活这个虚拟环境。执行:

env\Scripts\activate.bat

如果前缀变成了(env)XXX,那就说明虚拟环境激活成功了,我们只需要在这个虚拟环境中进行开发就可以了。

第三方库

这里需要用到一些第三方的库,通过pip freeze命令,可以详细的查看每一个库的名称以及精确的版本号。

(env) C:\Users\biao\Desktop\network\code\relationanalysis>pip freeze
appdirs==1.4.3
beautifulsoup4==4.6.0
csdnbackup==0.0.1
cycler==0.10.0
decorator==4.0.11
matplotlib==2.0.2
networkx==1.11
numpy==1.12.1
packaging==16.8
pyparsing==2.2.0
python-dateutil==2.6.0
pytz==2017.2
requests==2.14.2
six==1.10.0

但是我们需要安装的却不多,因为很多库是与之关联的,pip命令会自动把依赖的包帮我们安装。我们需要安装的包如下:

  • networkx: pip install networkx
  • csdnbackuo: 这个包是我之前写过的一个关于CSDN博客备份的工具库,源码上传到了GitHub。而且为了方便使用,我把它做成了一个.whl包,下面是下载地址:

    https://github.com/guoruibiao/csdn-blog-backup-tool

    下载里面适合自己Python版本的whl文件,然后执行

    pip install csdnbackup-0.0.1-py2.py3-none-any.whl 即可。

这样,依赖的库就基本上安装成功了。

模块化

完成一个任务,首先并不是上来就写代码。而是先搞清楚需求。比如这里,要做的是关注人和粉丝的图形化展示。那么仔细想想,不难发现可以细化这个大任务。

  • 获取粉丝信息
  • 获取关注人信息
  • 关于图形化展示的部分

这样一来,我们只需要每次完成一个小任务,最终通过集成测试就能完成任务了。下面针对每一个小任务进行实现。

爬虫模块

这里的爬虫模块不是必须要用我那个库,你也可以自己写。但是重复造轮子是一件很枯燥的事,人生苦短,咱还是用轮子吧

关于模拟登陆

from csdnbackup.login import Login

然后使用下面的代码即可实现模拟登陆。

# coding: utf8

# @Author: 郭 璞
# @File: logintest.py
# @Time: 2017/5/18
# @Contact: [email protected]
# @blog: http://blog.csdn.net/marksinoberg
# @Description: csdnbackup模拟登陆测试
from csdnbackup.login import Login
import getpass
#
username = input(‘请输入您的账号:‘)
password = getpass.getpass(prompt=‘请输入您的密码:‘)

loginer = Login(username=username, password=password)
session = loginer.login()
headers = loginer.headers
headers[‘Host‘] = ‘blog.csdn.net‘
response = session.get(‘http://blog.csdn.net/marksinoberg‘, headers=headers)
print(response.status_code)
print(response.text)
print("网页总长度:", len(response.text))

没有图不足以证实此轮子的好用。

爬取数据

巧妇难为无米之炊,下面来弄点出来。

# coding: utf8

# @Author: 郭 璞
# @File: spider.py
# @Time: 2017/5/18
# @Contact: [email protected]
# @blog: http://blog.csdn.net/marksinoberg
# @Description: 爬虫,爬取博主的粉丝信息

from csdnbackup.login import Login
from bs4 import BeautifulSoup
import math
import numpy as np

class Fans(object):

    def __init__(self, domain, password):
        self.domain = domain
        self.loginer = Login(username=domain, password=password)
        self.session = self.loginer.login()
        # set the headers
        self.headers = self.loginer.headers
        self.headers[‘Referer‘] = ‘http://blog.csdn.net/{}‘.format(self.domain)
        self.headers[‘Host‘] = ‘my.csdn.net‘

    def get_fans_number(self):
        url = ‘http://my.csdn.net/{}‘.format(self.domain)

        response = self.session.get(url=url, headers=self.headers)
        # print(response.text)
        if response.status_code == 200:
            soup = BeautifulSoup(response.text, ‘html.parser‘)
            return soup.find(‘a‘, {‘href‘: ‘/my/fans‘}).get_text()
        else:
            return 0

    def get_fans(self):

        fans = []

        url = ‘http://my.csdn.net/{}‘.format(self.domain)
        fans_number = self.get_fans_number()
        pages = math.ceil(int(fans_number)/20)
        # pages+1
        for index in range(1, pages):
            url = ‘http://my.csdn.net/my/fans/{}‘.format(index)
            response = self.session.get(url=url, headers=self.headers)
            if response.status_code == 200:
                soup = BeautifulSoup(response.text, ‘html.parser‘)
                user_names = soup.find_all(‘a‘, {‘class‘: ‘user_name‘})
                fans.extend([str(username.attrs[‘href‘]).lstrip(‘/‘) for username in user_names])
            else:
                raise Exception("获取第{}页数据失效".format(index))
        return fans

    def get_follow_number(self):
        url = ‘http://my.csdn.net/{}‘.format(self.domain)

        response = self.session.get(url=url, headers=self.headers)
        # print(response.text)
        if response.status_code == 200:
            soup = BeautifulSoup(response.text, ‘html.parser‘)
            return soup.find(‘a‘, {‘href‘: ‘/my/follow‘}).get_text()
        else:
            return 0

    def get_follow(self):
        follows = []

        url = ‘http://my.csdn.net/{}‘.format(self.domain)
        follow_number = self.get_follow_number()
        pages = math.ceil(int(follow_number) / 20)
        # pages+1
        for index in range(1, pages):
            url = ‘http://my.csdn.net/my/follow/{}‘.format(index)
            response = self.session.get(url=url, headers=self.headers)
            if response.status_code == 200:
                soup = BeautifulSoup(response.text, ‘html.parser‘)
                user_names = soup.find_all(‘a‘, {‘class‘: ‘user_name‘})
                follows.extend([str(username.attrs[‘href‘]).lstrip(‘/‘) for username in user_names])
            else:
                raise Exception("获取第{}页数据失效".format(index))
        return follows

class ListUtils(object):
    """
    利用numpy 进行数据的筛选
    """
    def __init__(self):
        pass

    @staticmethod
    def comminInList(self, x=[], y=[]):
        return np.intersect1d(ar1=x, ar2=y, assume_unique=True)

if __name__ == ‘__main__‘:
    fans = Fans(domain=‘你的用户名‘, password=‘你的密码‘)
    # fans1 = fans.get_fans(username=‘marksinoberg‘)
    # result = ListUtils.comminInList(fans1, fans2)
    # print(result)
    follows = fans.get_follow()
    print(follows)

对照一下运行结果,关注人信息获取如下。

图形化

图形化需要借助matplotlib来画图,而载体就是networkx,所以我们需要对此进行安装。在此不再过多叙述。

然后就是对于networkx的使用了。

步骤

一般有如下几个步骤:

  • 声明graph
  • 填充节点和边
  • 画出图形

中文节点问题

默认的matplotlib 对于中文支持的不太友好。为了解决这一个问题,可以通过如下步骤实现。

  • 到matplotlib的安装目录下找到字体文件夹, 比如我的是

    C:\Users\biao\Desktop\network\env\Lib\site-packages\matplotlib\mpl-data\fonts\ttf

  • 然后从本地的字体库(比如C:\Windows\Fonts\XX.ttf)中拷贝一份,重命名为DejaVuSans.ttf,放置到刚才的matplotlib字体文件夹下即可。为什么要这么做?答案就是matplotlib默认使用DejaVuSans.ttf

实战

下面实战一下CSDN的关注人和粉丝跟自己的关系演示。因为粉丝人数过多的话,会导致生成的图片重叠度较大,所以这里选取前20个关注人和前20个粉丝。

import networkx as nx
import matplotlib.pyplot as plt
import spider

fans = spider.Fans(domain=‘你的用户名‘, password=‘你的密码‘)
fans_names = fans.get_fans()[:20]
follow_names = fans.get_follow()[:20]
nodes = fans_names
relations1 = [(‘我‘, username) for username in fans_names]
relations2 = [(username, ‘我‘) for username in follow_names]
colors = [‘red‘, ‘orange‘, ‘yellow‘, ‘green‘, ‘blue‘, ‘purple‘]
graph = nx.DiGraph()

graph.add_node(‘我‘)
graph.add_nodes_from(fans_names)
graph.add_edges_from(relations1)
graph.add_edges_from(relations2)
nx.draw(graph, with_labels=True,  hold=True, node_color=colors)
plt.title(‘CSDN 博客关注与粉丝图形化显示‘)
plt.axis(‘off‘)
plt.show()

生成的图片如下:

总结

对于networkx,这里讲的并不是很多,也可以说就没怎么讲。这是因为官方文档的却是够详细了。而且越往深处看,越觉惊喜。基本上对于社交网络的分析,它是一个很不错的选择了。

还有就是关于轮子,平时多写一些可靠的轮子,说不一定哪天就用到了。

时间: 2024-10-04 08:40:13

“社交网络”分析的相关文章

基于社交网络的情绪化分析II

基于社交网络的情绪化分析II By 白熊花田(http://blog.csdn.net/whiterbear) 转载需注明出处,谢谢. 上一篇进行了微博数据的抓取,这一篇进行数据的处理介绍. 无意义微博的定义 观察发现微博中有很多的微博是用户参与某些活动而转发的微博,比如:"SmashHit,作者:MediocreAB.推荐!"http://t.cn/8Fkgg9k":"刚刚下载了豆丁文档:项目公司运营简报模板"http://t.cn/RPjFZKf&qu

基于社交网络的情绪化分析IV

基于社交网络的情绪化分析IV By 白熊花田(http://blog.csdn.net/whiterbear) 转载需注明出处,谢谢. 前面进行了微博数据的抓取,简单的处理,相似度分析,后面两篇进行学校微博的情感分析. 微博情感分析 这里试图通过字典分析的方式计算学校微博的情感倾向,主要分为积极情感,消极情感,客观. 这里字典分析的情感分析和机器学习方式进行情感分析均参考rzcoding的博客,这里只是根据他的思路和代码改装成了微博的情感分析. 字典分析 字典分析的原理是,给定一句微博,判断这句

基于社交网络的情绪化分析III

基于社交网络的情绪化分析III By 白熊花田(http://blog.csdn.net/whiterbear) 转载需注明出处,谢谢. 前面进行了微博数据的抓取,简单的处理,这一篇进行学校微博的相似度分析. 微博相似度分析 这里试图计算任意两个学校之间的微博用词的相似度. 思路:首先对学校微博进行分词,遍历获取每个学校的高频用词词典,组建用词基向量,使用该基向量构建每个学校的用词向量,最后使用TF-IDF算法和余弦函数计算两个学校微博之间的相似度. 注:TF-IDF算法和余弦函数使用可以参照我

基于hadoop的社交网络的分析

昨天终于hadoop的项目验收完成了,终于可以松一口气了,总体还是比较满意的. 首先说一下项目流程,用mapreduce对数据进行预处理,然后用mahout中的聚类算法(kmeans)对数据进行处理,最后用peoplerank对数据进行处理. 根据老师交给我们的数据,包括Google+和Twitter的部分社交网络数据.以下是两个数据下载的链接 http://snap.stanford.edu/data/egonets-Gplus.html(Google+) http://snap.stanfo

企业社交网络流行,小W的分析状况

随着现在的网络发展趋势,企业社交网络正式现在所流行的,我自己也在网上搜了很多有关社交的网站,但是很难下决定说选择哪个平台更适合企业用.我就问了我在做网站的朋友,他让我每个社交都可以尝试下并推荐体验下网信商务社交,同时我也觉得可以试下,反正要试过才知道适不适合. 在朋友的解说下,完全认识了企业社交网络.大概的看了一眼,了解了整个架构.然而网信这个平台可以给小W带来以下功能: 1. 积累人脉 用户在商务社交网络上的人脉会迅速扩张,这样可以建立起一张强大的人际关系网,并不断认识新的商业伙伴和朋友. 2

survival analysis 生存分析与R 语言示例 入门篇

生存分析,survival analysis,顾名思义是用来研究个体的存活概率与时间的关系.例如研究病人感染了病毒后,多长时间会死亡:工作的机器多长时间会发生崩溃等.  这里“个体的存活”可以推广抽象成某些关注的事件. 所以SA就成了研究某一事件与它的发生时间的联系的方法.这个方法广泛的用在医学.生物学等学科上,近年来也越来越多人用在互联网数据挖掘中,例如用survival analysis去预测信息在社交网络的传播程度,或者去预测用户流失的概率. R里面有很成熟的SA工具. 本文介绍生存分析的

社会友谊和人群移动:基于位置的社交网络中的用户移动(一)

原文标题:Friendship and Mobility: User Movement In Location-Based Social Networks 作者单位:斯坦福大学    发表日期:2011年 会议:第十七届 ACM SIGKDD 国际会议--知识发现和数据挖掘 引用:Cho E, Myers S A, Leskovec J. Friendship and mobility: user movement in location-based social networks[C]// P

企业社交网络正在催生新的知识

短短几年,企业社交网络就成为一种影响深远的社会和经济现象.用户用微博.微信来沟通并分享内容,参与网络社区.组织活动.获取他人建议和经验,这一切规模庞大且没有边界的限制.社交网络是互联网上使用最多的功能,94%的人利用它进行学习,78%的人利用它分享知识,49%的人利用它与专家互动.每天有20亿的社会连接,超过30多亿的社交消息,企业社交网络正在催生新的知识经济. 然而最近通过朋友了解很多有关社交网络的问题,看了几个网站的评价好像还不错,可是我还是觉得这些企业社交网站有什么区别呢.然而开始一步步的

FastText总结,fastText 源码分析

文本分类单层网络就够了.非线性的问题用多层的. fasttext有一个有监督的模式,但是模型等同于cbow,只是target变成了label而不是word. fastText有两个可说的地方:1 在word2vec的基础上, 把Ngrams也当做词训练word2vec模型, 最终每个词的vector将由这个词的Ngrams得出. 这个改进能提升模型对morphology的效果, 即"字面上"相似的词语distance也会小一些. 有人在question-words数据集上跑过fastT