基于新浪微博的用户信息爬虫及分析.doc
《基于新浪微博的用户信息爬虫及分析.doc》由会员分享,可在线阅读,更多相关《基于新浪微博的用户信息爬虫及分析.doc(32页珍藏版)》请在冰点文库上搜索。
目录
摘要 I
Abstract II
1引言 3
1.1选题背景与意义 3
1.2系统开发工具 3
1.2.1vs2008 3
1.2.2oracle11g 3
1.2.3boost库 3
1.2.4GZIP压缩算法函数库 3
1.2.5JSON格式文件转换函数库 4
2系统需求分析与设计 5
2.1系统需求 5
2.1.1名词说明 5
2.1.2系统功能需求说明 5
2.1.3系统总体功能设计 7
2.2系统数据库构建 9
2.2.1数据库设计 9
2.2.2数据库详细设计 9
3系统详细设计与实现 12
3.1爬虫系统详细设计 12
3.1.1HTTP请求数据包 12
3.1.2HTTP返回数据包 13
3.1.3数据分析与提取 13
3.1.4AnaData类 13
3.1.5数据入库 15
3.2服务端详细设计 16
3.3客户端详细设计 17
3.3.1登录页面 17
3.3.2注册新用户和忘记密码页面 18
3.3.3用户关注列表查询界面 19
3.3.4微博用户标签分类查询 20
3.3.4发布微博并@列表框中的微博用户昵称 20
3.3.5微博用户昵称模糊搜索 21
3.3.6微博用户微博查询 21
4系统部署与测试 22
4.1系统部署图 22
4.2系统测试 22
5结束语 29
参考文献 30
致谢 31
-31-
摘要
随着互联网信息技术的发展,在这个信息时代,数据量的增长速度已经远远超过的我们的想象。
迅速的对这些数据进行处理,进行信息的提取已经成为目前计算机领域一个巨大的难题。
而且无论是政府还是企业,对于大数据的掌握都可以起着至关重要的作用。
数据处理技术蕴含的巨大的商业价值必将被慢慢的挖掘出来。
本文以新浪微博作为信息载体。
对新浪微博的用户信息进行收集和分析,对新浪微博信息数据转化成价值的可行性进行了尝试。
设计出了一个可以获取新浪微博信息的数据收集系统,并进行一定的数据分析和数据展示。
关键词:
C++,新浪微博,数据挖掘
Abstract
WiththeInternetdevelopmentofinformationtechnology,inthisageofinformation,theamountofdatagrowthhasfarexceededourimagination.Rapidprocessingofthesedata,theextractionofinformationhasbecomeahugeprobleminthecomputerfield.Andwhethergovernmentorcorporate,cangraspforbigdataplaysavitalrole.Thetremendouscommercialvalueofdataprocessingtechnologyisboundtobeslowlyexcavated.
Inthispaper,SinaWeiboasaninformationcarrier.SinaWeibouserinformationcollectionandanalysistheSinamicrobloggingdataintothevalueofthefeasibilityofatry.DesignonecangetthetheSinamicroblogginginformationsystemofdatacollectionanddataanalysisanddatapresentation.
Keywords:
c++,SinaWeibo,DataMining
1引言
1.1选题背景与意义
随着互联网信息技术的发展,目前的信息增长的速度已经进入了飞速膨胀的阶段。
“如果说IBM的主机拉开了信息化革命的大幕,那么‘大数据’才是第3次浪潮的华彩乐章。
”著名未来学家、当今世界最具影响力的社会思想家之一托夫勒在《第三次浪潮》中说过的内容如今已将逐渐成为事实,大数据正在改变这我们的生活。
IDC(国际数据公司)在2011年6月的数据统计[1],全球数据量在2011年已达到1.8ZB,在过去5年时间里数据量增加了5倍。
1.8ZB是什么样的概念?
1ZB等于1万亿GB,1.8ZB也就相当于18亿个1T的硬盘。
有效的对这些数据处理,去噪和提取信息,将数据转换成价值的技术已成为目前市场最为广阔的研究课题。
例如数据挖掘,分布式计算,机器学习等等新的信息技术的产生,他们目的都是为了能够从这无比巨大的数据中,获取能够用于商业决策和企业管理的信息[2]。
新浪微博于2009年正式上线,至2010年11月,新浪召开首届微博开发者大会时披露其微博用户突破5000万。
2011年3月,新浪CEO曹国伟在发布财报时介绍称,其微博的注册用户总数已超过1亿。
目前,新浪微博用户量已达到5亿。
因此,新浪微博的数据具有极大的开发潜力。
新浪微博数据平台是一个良好的数据载体。
除了足够大的数据量,相比与腾讯QQ空间,百度贴吧等,新浪微博还具有其他一些优点,如:
1)具有一定的实名制,一些社会名人的加入提高了微博的影响力。
2)可追寻的关系链。
3)具有极快速的传播能力。
因此,我选择了新浪微博作为爬虫进行用户分析的数据载体。
1.2系统开发工具
1.2.1vs2008
1.2.2oracle11g
1.2.3boost库
Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。
Boost库有些内容有望成为下一代C++标准库内容。
甚至替代现在的STL库。
boost库在多线程处理上具有更多的优势,可以在linux和window系统中使用而不用修改代码,除了强大的可移植性,boost在运行中也具有极大的稳定性,因为加入了智能指针的概念,提高了开发效率。
[3]
1.2.4GZIP压缩算法函数库
从新浪接口获取的数据数经过gzip压缩加密的数据,进行解压后即可获得json文件格式的数据。
GZIP最早由Jean-loupGailly和MarkAdler创建,最初用于UNIX系统的文件压缩。
而现今它已经成为Internet上使用非常普遍的一种数据压缩格式,或者说一种文件格式,可以很好的对数据进行压缩。
GZIP编码是可以很好的提高WEB应用程序的性能。
大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。
当访问服务器中的网站时,服务器将网页内容压缩在进行传输,一般对纯文本内容可压缩到原大小的40%.[4]
1.2.5JSON格式文件转换函数库
因为新浪微博的数据接口格式为json。
为了获取微博数据,必须从JSON数据里面提取需要的信息。
JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。
JSON采用完全独立于语言的文本格式,JSON是一种理想的数据交换语言。
易于人阅读和编写,同时也易于机器解析和生成。
[5]
2系统需求分析与设计
2.1系统需求
2.1.1名词说明
1)微博用户信息:
指的是新浪微博的用户的ID、粉丝数、关注数、注册时间等信息、
2)微博信息:
指的是微博用户发布的微博的ID、内容、发布时间,评论数,转发数等信息。
3)用户:
指的是使用本系统的用户。
2.1.2系统功能需求说明
微博开放平台是一个基于新浪微博客系统的开放的信息订阅、分享与交流平台。
微博开放平台提供了海量的微博信息、粉丝关系、以及随时随地发生的信息裂变式传播渠道。
系统分成三个部分:
数据爬虫,服务器端,客户端。
(1)数据爬虫通过调用微博开放平台的接口,获取微博用户及其相应的信息,进行分析后存入数据库。
(2)服务器部分接收客户端的请求,从服务器数据库或新浪平台获取数据后返回相应的数据给客户端。
(3)客户端用于数据的展示。
1)微博数据爬虫部分:
为了实现数据爬虫的功能,需要解决的问题是数据的获取,这就需要了解相关的基本的网络知识。
理解了数据传输的原理,并利用现有的开源函数库,就可以完成数据获取函数的编写。
其中,主要要处理的问题有:
(1)实现HTTP请求报文的生成
(2)实现HTTP返回报文的接收和解压
(3)实现对解压后的json文件进行分析和信息提取,如果需要入库,存入入库队列。
2)微博数据爬虫基本需求:
(1)数据信息初始化:
读取数据库中已有的信息,存入微博用户缓存队列。
为爬虫系统的运行做好准备。
(2)微博用户发现:
自动爬取获取新的微博用户信息,如果发现新的微博用户ID,则将该用户信息存入。
(3)微博信息爬取:
从微博用户队列中获取微博用户ID,然后进行微博爬取。
(4)微博用户信息更新模块:
对数据库中的微博用户信息中的微博数,关注数,粉丝数进行更新。
(5)关注列表信息更新:
定期的对关注列表的微博数,总评论数,总转发数等数据。
(6)微博用户信息入库。
将等待入库的数据容器里的数据存入数据库。
(7)微博信息入库。
将等待入库的数据容器里的数据存入数据库。
(8)微博用户标签入库。
将等待入库的数据容器里的数据存入数据库。
(9)数据更新。
当数据库已存在的该数据是,对数据进行更新。
2)服务器部分:
(1)命令接收及处理:
接收客户的请求,并从数据库和微博平台中获取信息并返回给客户端。
新增的关注微博用户的微博爬取:
(2)当客户端新增了微博用户的关注时,进行数据爬取。
微博信息入库。
3)客户端部分:
(1)登录模块:
(2)新用户注册模块:
(3)通过邮箱获取注册验证码进行注册。
(3)忘记密码模块:
(4)向注册邮箱发送用户名和密码。
(5)用户关注的微博用户列表查询。
(6)获取关注列表的详细信息。
(7)查询数据库中的用户标签分类后产生的数据:
(8)通过标签类别和拟合度两个参数向服务器请求信息。
(9)微博用户模糊联想搜索:
(10)通过微博平台的联想搜索接口查询数据。
(11)发布微博并对列表框的微博账号进行@。
2.1.3系统总体功能设计
1)爬虫系统流程如图2-1所示:
图2-1爬虫系统流程图
2)接口调用处理流程如图2-2所示:
图2-2数据接口调用流程图
3)服务器流程如图3-3所示:
图2-3服务器流程图
4)客户端流程图如图2-4所示:
图2-4客户端流程图
2.2系统数据库构建
2.2.1数据库设计
系统采用oracle11g数据库。
数据库名称weibo。
数据库weibo包含5个表:
1)USER_TABLE,用于存储注册用户信息;
2)WEIBO_USER_FOCUS_LIST,用于存储用户的微博用户关注列表;
3)WEIBO_USER_INFO,用于存储微博用户信息;
4)WEIBO_WEIBO_INFO用于存储微博信息;
5)TABLEKEYS_INFO用于存储微博用户标签信息.
2.2.2数据库详细设计
1)WEIBO_WEIBO_INFO表主键为ID字段,USERID字段为外键,并为ID字段,USERID字段建立索引。
表结构如图2-5所示:
图2-5WEIBO_WEIBO_INFO表结构图
2)WEIBO_USER_INFO表主键为ID字段,ID字段,SCREEN_NAME字段建立索引。
表结构如图2-6所示:
图2-6WEIBO_USER_INFO表结构图
3)WEIBO_USER_FOCUS_LIST表ID字段为外键,表结构如图2-7所示:
图2-7WEIBO_USER_FOCUS_LIST表结构图
4)USER_TABLE表结构如图2-8所示:
图2-8USER_TABLE表结构图
5)TABLEKEYS_INFO表主键为USERID字段,表结构如图2-9所示:
图2-9TABLEKEYS_INFO表结构图
3系统详细设计与实现
详细设计阶段的根本任务是确定应该怎样具体实现所要求的系统,也就是经过这个阶段的设计工作,应该得出对目标系统的精确描述,并使之后的编码阶段根据此说明可以实现系统的大部分功能。
3.1爬虫系统详细设计
3.1.1HTTP请求数据包
为了实现获取新浪微博平台的数据,必须向新浪微博服务器发送数据请求报文进行数据请求。
因此,我构造了一个PostData类,用于生成http包的字符串。
HTTP报文格式:
一个HTTP请求报文由状态行(requestline)、首部行(header)、空行和请求数据4个部分组成,请求报文的一般格式如图3-1所示:
图3-1HTTP报文格式图
利用HTTPWatch抓取在浏览器中收取新浪微博数据时发送的HTTP数据包,HttpWatch抓取的数据包内容如图3-2所示:
图3-2HTTP数据包
经过分析,可以知道请求方法为POST,请求的
url地址为
Accept-Encoding为gzip,deflate。
请求数据为一个以apiurl开头的字符串。
Apiurl之后请求数据由一下几个部分组成:
接口url,请求类型,请求参数,access_token等组成。
3.1.2HTTP返回数据包
每向发送一个HTTP请求数据包后,都可以获得相应的数据包。
分析获取HTTP应答报文中的Conten-Length参数可以获取数据长度。
知道了数据长度后用zlib库的函数对数据进行解压。
当然,数据并不是每一次都是正确,导致数据出错的原因有很多,但我们只要判断数据格式是否正确,当数据格式不正确或不完整时,将直接丢弃报文,打印数据格式错误信息。
3.1.3数据分析与提取
将得到的json字符串,利用提取json数据的函数库对字符串进行处理和提取我们需要的字段内容。
3.1.4AnaData类
AnaData类结构如图3-3所示:
图3-3AnaData类结构图
这是爬虫系统的最主要的类,该类对发送请求报文,分析应答报文,数据分析和提取等各个功能函数进行了整合和封装。
在该类中,以do开头的方法为爬虫函数,用于调用Start函数获取数据,并将需要入库的数据转存到入库缓存容器中。
以Start开头的方法为数据获取和分析函数,用于设置参数从新浪服务器获取数据并调用ana函数分析数据。
以ana开头的方法为数据分析函数,用于从start获得的m_data数据流中提取数据并存于weiboMessageList或weiboUserList容器中。
类中的各个方法和字段协调合作,完成数据爬取分析和存储。
以下是几个do函数实现的功能介绍:
doUserWeibo()对微博用户ID列表的微博进行爬取,获取微博信息并进行标签归类。
doRunning()微博用户ID发现,获取微博用户的详细信息。
doUserCounts()对微博用户信息的更新。
3.1.5数据入库
入库函数包括了微博用户入库(StoreToUserDB),微博用户更新(UpdateUserDB),微博入库(storeWeiboToDB),微博用户标签入库(storeTableKey)。
每个入库函数都开启一个独立的线程。
当相应的缓存容器中的数据达到一定的数量时,对数据容器进行锁定,相应的爬虫函数暂停,开始对数据进行入库,入库后该数据从缓存容器删除,入库接收后解除锁定,继续爬虫。
下面的代码微博微博用户信息入库的函数主要代码。
voidStoreToUserDB()
{
oracledbm_oracle;
m_oracle.ConnectDB("weibo","chen","LISTENER_WEIBOORACLE");
intdatatcount=m_moniterUserList.size();//m_moniterUserList是一个map容器。
用来存储数据库已存在的微博用户信息的ID。
intdbcount=0;
while
(1)
{
cout<<"stroedbisrunning"< Sleep(20000);//当等待入库的缓存容器为空时,入库线程进入休眠状态
if(!
weiboUserList.empty())
{
boost:
:
mutex:
:
scoped_locklock(oracledbMutex);//互斥锁,boost的互 斥锁可以自动的在析构是释放锁
for(map:
:
iterator it=weiboUserList.begin();it!
=weiboUserList.end();)
{
map:
:
iteratorfindmoniter;
findmoniter=m_moniterUserList.find(it->second.ID);//数据库中 是否有该函数
if(findmoniter==m_moniterUserList.end())
{
m_oracle.insertUserInfo(it->second);//执行oracle插入语句
MoniterUserminfo;
minfo.id=it->second.ID;
minfo.friends_count=it->second.friends_count;
minfo.lastTime=0;
minfo.isMoniter=false;
m_moniterUserList.insert(make_pair(minfo.id,minfo));
dbcount++;
datatcount++;
}
it=weiboUserList.erase(it);
if(dbcount==1000)//commit频率
{
m_oracle.CommitSql();
cout<<"allcount"< cout<<"count"< dbcount=0;
}
}
}
}
m_oracle.disConnectDB();
}
其他的几个入库函数与微博用户信息入库类似。
3.2服务端详细设计
1)监听线程:
服务器运行时启动监听线程,当发现客户端有请求命令时,对请求命令进行解析,并进行相应的操作。
服务器与客户端数据传输采用UDP协议,因为客户端发送的请求命令的数据长度相对较小,而且客户端与服务器不需要建立可靠连接。
这样,使用UDP协议,可以极大的提高数据的传输速度,并大大的降低服务器的压力。
Select函数可以实现socket的非阻塞方式进行工作。
一般初学socket的人都不使用select函数,认为使用send和recv就可以实现socket的功能了。
但是,作为一个网络程序,必须使用select才是合格的网络程序。
通过使用select,就可以是UDP就可以基本实现TCP的功能,当客户端没有收到服务器返回的命令时,可以根据需要是否重发操作命令或者直接放弃操作,不重发数据包。
客户端向服务器请求的命令字符串包括三个部分:
cmd字段,type字段和data字段。
前两个字段用来确定命令的类型,data为命令的参数。
2)客户端向服务器命令执行函数及其功能:
showweibo :
获取微博信息
showtablekeys :
获取标签分类
showfocusana :
获取关注的微博用户的分析统计信息
showfocusList :
获取用户关注的微博用户列表
showsearchuser :
获取模糊搜索信息
Postnormalweibo :
发布微博
cancelfocus :
用户取消关注微博用户
addfocus :
用户增肌微博用户关注
login :
登录
reg :
注册
forget :
忘记密码
3)关注微博用户信息获取:
为了使客户端新增的关注微博用户的信息及时的入库,在服务器端增加一个信息获取函数和一个入库函数。
4)服务器端与客户端的数据传输格式:
数据格式类似于xml格式,在每一个数据字段的头部和尾部都添加了一个字段名作为标记位。
3.3客户端详细设计
3.3.1登录页面
登录页面如图3-4所示
图3-4登录页面
3.3.2注册新用户和忘记密码页面
注册页面如图3-5所示:
图3-5注册新用户界面
1)随机验证码的生成:
通过获取当前的格林时间,生成随机数。
2)邮箱验证功能:
邮箱验证功能是一个可以防止无限注册账号的解决方法,而且通过注册邮箱,当用户忘记密码时,可以很轻松的通过邮箱获取用户登录信息。
SMTP-简单邮件传输协议(SimpleMailTransferProtocol),是定义邮件传输最常用的协议,它是基于TCP服务的应用层协议
用户注册时必须填写正确的邮箱,才能收到邮件获得验证码,从而进行注册。
该功能用到了CSendMail类,CSendMail是一个通过socket与邮箱服务器建立连接,通过SMTP协议,发送SMTP数据报文通过设置的邮箱账号和密码,发送相应的登录验证报文,成功实现邮件的发送。
3忘记密码功能:
当用户忘记密码时,只要输入注册邮箱,发送请求给服务端,服务器查询数据库,当USER_TABLE有该邮箱的注册信息时,获取该邮箱的用户名和密码,发送用户信息给该邮箱。
忘记密码界面如图3-6所示:
图3-6忘记密码界面
3.3.3用户关注列表查询界面
获取该登录用户关注的微博用户的信息,包括昵称,关注数,粉丝数。
当用户双击某行的数据是,弹出数据详情对话框,可以查看该微博用户的总发布的微博数,及所有微博的总评论数和总转发数。
并可以查看该用户各个时段发布微博的数量的直方图。
可以非常容易的看出该微博用户使用新浪微博的规律。
下面是该按钮控件的单击响应函数。
voidMainWin:
:
OnBnClickedButton1()
{
isFocus=true;
//生成请求数据包
chartemp[128];
sprintf(temp,"cmd:
show;type:
focusList;date:
%s;",login_name);
stringstr;
m_clien