首页 存档 技术 查看内容

使用Python爬取社交网络数据分析

2018-3-30 13:00 |来自: 互联网 819 0

摘要: 回复「朝阳35处」可查看「说人话的大数据」系列合辑 数据抓取 一、直接抓取数据 二、模拟浏览器抓取数据 三、基于API接口抓取数据 数据预处理 可视化 数据分析 扩散深度 扩散速度 空间分布 节点属性 网络属性 ...

回复「朝阳35处」可查看「说人话的大数据」系列合辑



在线社交网站为人们提供了一个构建社会关系网络和互动的平台。每一个人和组织都可以通过社交网站互动、获取信息并发出自己的声音,因而吸引了众多的使用者。作为一个复杂的社会系统,在线社交网站真实地记录了社会网络的增长以及人类传播行为演化。通过抓取并分析在线社交网站的数据,研究者可以迅速地把握人类社交网络行为背后所隐藏的规律、机制乃至一般性的法则。

然而在线社交网络数据的获取方法有别于线下社会数据的获取(如普查、社会调查、实验、内容分析等)、数据的规模往往非常大(称之为“大数据”并不为过)、跨越的时间范围也相对较长(与社会调查中的横截面数据相比),常规的数据分析方法并不完全适用。例如传统的社会调查的数据往往样本量有限,而在线社交网络中的样本量可以达到千万甚至更多。因而,研究者迫切得需要寻找新的数据获取、预处理和分析的方法。本章的内容具体包括数据的抓取、数据预处理、数据可视化和数据分析部分。



数据抓取


目前社交网站的公开数据很多,为研究者检验自己的理论模型提供了很多便利。例如斯坦福的社会网络分析项目就分享了很多相关的数据集。社交网站为了自身的发展,往往也通过各种合作项目(例如腾讯的“犀牛鸟项目”)和竞赛(例如Facebook通过Kaggle竞赛公布部分数据)向研究者分享数据。

但是,有时候研究者还是**需要自己收集数据。受限于网站本身对于信息的保护和研究者自身的编程水平,互联网数据的抓取过程依然存在众多问题。以下,我们将从三个方面着手简要介绍使用Python进行数据抓取的问题:直接抓取数据、模拟登录抓取数据、基于API接口抓取数据。


一、直接抓取数据

通常的数据抓取遵循可见即可得的规律,即可以观察到的,就可以被抓取。对于网页内容的抓取,可以是把整个网页都存下来,回头再清洗。这样做比较简单有效,但是还是回避不了之后的从html文件中进行的数据提取工作。在下面的例子当中,我们将尝试抓取百度新闻页面(http://news.baidu.com/)的热点新闻。在这个例子当中,我们要使用urllib2这个类库来获取该网页的html文本。

在获取html之后,我们将使用一个流行的类库BeautifulSoup来解析html并提取我们需要的信息。现在的BeautifulSoup已经发展到第四个版本。可以使用easy_install或者pip install的方法安装。如果读者使用的是Spyder的话,可以点击Tools--Open command prompt。然后,在打开的命令窗口中输入:easy_install beautifulsoup4 就可以了。


easy_install beautifulsoup4


使用beautifulsoup解析中文html的时候遇到的主要问题多是由encoding造成的。需要使用sys设定默认的encoding方式为gbk,并在BeautifulSoup函数中指定from_encoding为gbk。




这样就可以抓取当天的热点新闻,输出的结果如下:





二、模拟浏览器抓取数据

越来越多的网站要求必须登录才能看到内容,这个时候就需要使用编程软件模拟浏览器登录。登录成功后,就可以抓取内容了。这里举一个抓取聊天论坛帖子列表的例子。这个网站的网络链接为:http://members.lovingfromadistance.com/forum.php, 我们首先写一个叫screen_login的函数。其核心是定义个浏览器对象br = mechanize.Browser()。这个时候,需要借用浏览器的cookie功能,主要借助于cookielib包。代码如下所示:




 br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 
Chrome/17.0.963.56 Fedora/3.0.1-1.fc9 Firefox/3.0.1'
)]
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)





为了从HTML文档提取cookies,首先使用cookielib模块的LWPCookieJar()函数创建一个cookie jar的实例。LWPCookieJar()函数将返回一个对象,该对象可以从硬盘加载Cookie,同时还能向硬盘存放Cookie。之后,通过 br.set_cookiejar(cj)将这个cookie jar关联到mechanize的浏览器对象br上。简单设置一些浏览器属性后,需要定义使用的user-agent。用户代理(User Agent)指的是代表使用者行为的软件,主要是设置浏览器的头文件。


最后是关键的一步,打开登录页面,输入用户名和用户密码。需要使用br.select_form(nr = 0)来找到登录表格。这里nr的设置比较灵活,不同网站的数值不同。然后输入用户名和密码。比如:br['vb_login_username'] = 'Your registered User name', 这里的vb_login_username也会随着网站本身使用的具体内容而不同。运行br = screen_login()就可以模拟登录成功,然后就可以开始数据抓取和使用BeautifulSoup来进行信息提取的工作了。



三、基于API接口抓取数据


好在随着数字化媒体浪潮的到来,第三方开发的网站应用已经成为社交网络必不可少的一部分。社交网站为了自身的发展,往往选择向外界开放部分资源,以方便第三方发展基于该社交网站的产品,进而更好吸引使用者使用。比如新浪微博上有着各种不同的APP,这些应用的数据接口(API)就是由新浪微博所提供的。


不同的编程语言与通用的API接口之间是由软件开发工具包SDK(Software Development Kit)衔接在一起的。仍然以新浪微博的SDK为例,打开其页面(http://open.weibo.com/wiki/SDK)我们会发现对应于各种编程语言的SDK,有些由新浪微博官方提供的,有些则是由广大使用者编写的。就Python而言,新浪微博官方推荐的Python SDK是sinaweibopy。sinaweibopy是纯Python编写的单个文件,代码简洁,无依赖,运行可靠。


安装sinaweibopy的方法非常简单,只需要打开的命令窗口中输入:easy_install sinaweibopy 就可以了(https://pypi.python.org/pypi/sinaweibopy/1.1.3)。



easy_install sinaweibopy

数据抓取的第一步,就是建立数据连接的工作,以获取社交网站开放数据流的许可。当然,这首先需要使用者注册一个app。以新浪微博为例,研究者可到其应用开发页面注册 。这样,使用者可以获取一个APP_KEY和对应的APP_SECRET。



现在流行的方式是使用OAuth获取连接社会化媒体的API的使用权限。它工作的原理非常简单:1.首先使用者发出使用请求,2.然后新浪微博在收到请求后向使用者发出一个授权码,3.获取授权码之后使用者依据授权码从新浪微博获取连接码(ACCESS TOKEN),4.使用连接码,使用者就可以连接到新浪微博的数据库并获取数据了。以上过程可以使用以下Python代码来实现:






在上述代码中,我们定义了一个名为weiboClient的函数。完成以上步骤之后,使用者只需要运行client = weiboClient()的程序,就可以连接到新浪微博的API接口了。



下一步是通过查阅社交网站的API文档,选取适当的API接口,就可以很方便地从社交网站抓取数据了。因为直接从网站数据库获取数据,因而数据结构化较好。获取数据使用许可之后,其使用就非常方便灵活了。2014年8月,云南鲁甸县发生大地震,人民日报官方微博8月7日 19:51来自人民日报微博 |举报发微博报道了最新的死亡人数。消息内容称:


人民日报:#云南鲁甸县地震#【遇难人数增至615人[蜡烛]】据抗震救灾指挥部消息,截至今天19时,地震共造成615人死亡,其中鲁甸县526人、巧家县76人、昭阳区1人、会泽县12人;目前仍有114人失踪,其中鲁甸县109人、巧家县5人;另有3143人受伤。



这里需要注意的是每一条微博的号码有两种表示形式:一种是字母和数字的组合,另一种是数字。由该条微博的网络链接,我们可以得到前者为

'Bhd8k0Jv8'。这个时候,我们可以通过statuses__queryid这个API接口可以将它转化为纯数字的形式。其它更多的新浪微博API接口可以参阅http://open.weibo.com/wiki/API鏂囨。_V2



mid = client.get.statuses__queryid(mid = 'Bhd8k0Jv8', isBase62 = 1, type = 1)['id']

这里,我们想要看一下这条微博的转发网络,并计算其网络特征。将主要用到的是API接口中的statuses__repost_timeline。在这个数据抓取过程中,每次可以抓取一个页面上的200条转发信息,根据总转发量,我们可以计算需要抓取的页面总数。由此,我们需要先定义一个函数,以确定转发页面的数量。如以下代码所示:



   print 
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部