一种面向主流微博网站微博id的采集方法及工具的制作方法

文档序号:6511128阅读:620来源:国知局
一种面向主流微博网站微博id的采集方法及工具的制作方法
【专利摘要】一种面向主流微博网站微博ID的采集方法及工具,系统架构分为两个层次,分别为采集层和存储层,层次和系统间的接口清晰,每层内部都由若干模块组成,模块之间的松耦合,有利于每层功能的扩展。采集层实现认证用户微博ID的爬取以及长期的认证用户粉丝ID的采集;存储层实现将微博ID在本地进行数据库存储,并对外提供开放式的微博ID检索功能。该系统的用户可以是任何基于微博数据的第三方应用的开发人员,利用该系统提供的微博ID进行进一步的微博内容抓取、分析等相关第三方应用的开发;也可以是微博网站的管理人员,利用该系统提供的微博ID进行相关统计,从而对微博相关指标进行分析,如微博活跃程度分析、微博影响力分析等。
【专利说明】—种面向主流微博网站微博ID的采集方法及工具
【技术领域】
[0001]本发明涉及社交网站的ID采集技术特别是一种以主流微博网站开放API为基础的微博ID采集方法及工具。
【背景技术】
[0002]微博作为社交网络应用技术之一实现了基于用户关系的信息分享、传播以及获取平台,承载了大量基于社交网络的信息。用户通过WEB、WAP以及各种客户端组件个人社区,以140字左右的文字更新信息,并实现即时分享。中国互联网络信息中心(CNNIC)发布的《第31次中国互联网络发展状况统计报告》显示,截至2012年12月底,我国微博用户规模为3.09亿,较2011年底增长了 5873万。微博急速扩张的阶段已经结束,但年增幅仍能达到23.5%。巨大的用户量给微博带来了巨大的信息量,对微博信息进行再利用的应用也随之出现。新浪和腾讯等主流微博网站都开放了针对微博操作的API,用于支持和鼓励基于微博数据信息的第三方应用的发展。基于API的第三方应用开发模式将微博信息作为基础的数据信息,进一步提供针对微博的分类、分析、检索等等升级应用,提升了微博数据的利用价值,是推动社交网络信息有效地再利用的典范。现有已经出现部分应用在一定程度上实现了对微博信息的再利用,但是对信息的采集工作任然是一项艰巨的任务,截至2013年4月底,新浪微博的注册用户规模为5.03亿,日活跃用户4620万,用户id为int64(8Bytes),总的数据量约为4G ;腾讯微博的注册用户为5.4亿,日活跃用户I亿,用户id为32个char的字符串(32Bytes),总的数据量约为16G ;搜狐微博的注册用户约为I亿;以新浪微博为例,假设平均每个用户发布50条微博,每条微博平均含有20个汉字,每条微博平均包括4条评论,则微博信息的总体数据量为4G*50*20*2* (4+1)=400Τ。面对海量的微博信息,只能针对已知微博的URL链接采集微博数据,这种方式只是小范围采集微博信息,所以急需一种能够更加完整、全面的、并且支持大数据量存储的数据采集工具用于采集微博唯一标识符-微博ID,进而通过微博ID采集具体的微博信息,从而实现更广泛的微博信息的再利用,为上层应用提供更好的数据支持。

【发明内容】

[0003]有鉴于此,本发明的目的是提供一种面向主流微博网站的微博ID采集方法及工具,本发明的方法及工具基于网络爬虫和微博开放API,结合现有的索引和非结构化数据库存储方法,提出一套面向主流微博网站微博ID的采集方法及工具,本发明能自动化采集已存在的微博账号ID,方便开发者进行再利用,为上层应用提供更好的数据支持。特有的分布式数据存储方法让本发明具备更好的可扩展性。
[0004]为了达到上述目的,本发明的目的是提供一种面向主流微博网站微博ID的采集方法及工具,其架构分为两个层次,分别为采集层和存储层。采集层实现微博ID的采集,存储层实现本地存储,并提供开放式的检索功能;其中:
[0005]采集层,实现认证用户ID爬取和认证用户粉丝ID的采集工作,由网络爬取模块和微博API模块组成。
[0006]存储层,负责对采集层中获取的微博ID进行去重操作以及将微博ID进行存储,提供微博ID查询接口,并预留字段,为后续操作提供一定的扩展性能。
[0007]所述采集层的各模块的功能分别是:
[0008]网络爬取模块,负责针对新浪、腾讯微博认证用户网页中微博ID的抓取工作,主要包括网页爬取及解析和本地存储的操作。其中网页爬取及解析操作通过编写浏览器插件的方式来完成,本地存储操作通过编写Webserver代码的方式来完成。包括请求微博认证用户首页,一级、二级和三级分类页面,解析页面中的分类名称及对应的URL,请求并解析各级分类页面中的微博ID,并将微博ID存储到本地的认证用户ID采集目录中的认证用户ID文件中。其中认证用户ID目录是本地目录,依据微博网站的认证用户分类等级以及名称自动分级建立;认证用户ID文件以换行符分隔各个ID,并以“最下级分类名称.txt”的格式命名。该模块包括微博ID爬取子模块和存储子模块。
[0009]微博API模块,使用新浪、腾讯微博开放平台提供的微博API,获取微博认证用户的粉丝ID。其操作流程包括首先获得两大微博开放平台的授权令牌,其次根据不同微博的API接口,构造不同的参数给相应的API接口,得到JSON格式的微博ID数据,并将解析出的微博ID存入本地的粉丝ID采集目录的粉丝ID文件中。其中,粉丝ID采集目录是一个存储粉丝ID文件的目录,粉丝ID文件是存放该模块获取的ID的文本文件,以换行符分隔各个ID,每个文件存放一定数量的ID,文件以“当前时间戳.txt”的格式命名。
[0010]所述存储层的各模块的功能分别是:
[0011]去重与索引模块,所述的去重与索引模块,为已采集过的微博ID进行去重操作并建立索引,其中新浪、腾讯微博对应的索引名称分别为化(1以_4和index_B,定期将微博ID导出到指定目录的文件中供数据存储模块处理,在索引中设置标记字段防止重复导出ID。索引中包括微博ID和标记两列,存储方式都是“不分词”。标记有三种取值:“未导出”、“已导出”和“已导入Hbase”。其中“未导出”表不微博ID未从Lucene中导出已导出”表不微博ID已从Lucene中导出,但未导入到Hbase中;“已导入Hbase”表不微博ID已导入到Hbase中。该模块包括索引建立子模块、ID导出子模块和标记更新子模块。索引建立模块实现将采集的ID去重,并将去重后的ID并入索引,将对应ID的标记字段置为“未导出”。ID导出子模块负责定期检索索引中未导出的ID,存入本地的微博ID导出目录中的微博ID导出文件(微博ID导出目录需要在系统运行前创建,微博ID导出文件在每次导出时自动创建),文件命名格式为“年-月-日_时-分.txt”,并提供给数据存储模块处理,将对应ID的标记置为“已导出”。标记更新子模块负责检查数据存储模块是否已处理完导出的ID,若处理完成,则将对应ID的标记置为“已导入Hbase”。
[0012]数据存储模块,负责从本地的微博ID导出目录中读取微博ID导出文件,并使用开源的分布式系统Hadoop中的存储工具Hbase将文件中的微博ID进行分布式存储,同时提供微博ID查询接口。该模块使用Linux的Crontab命令定期执行。每次执行时,读取本地的微博ID导出目录中的微博ID导出文件,将新浪微博ID和腾讯微博ID分别存储在Hbase的不同的表中,表的主键设计为“DDDDD微博ID”的格式,其中DDDDD表示一个五位十进制数字,该数字前缀是为后期的数据分析预留的标记空间,可以用于标记该微博ID的状态或者属性。该模块定期从Lucene中检索出标记值等于“未导出”的微博ID,调用Hbase提供的API,将这些微博ID存入Hbase相应的表中,并在Lucene中将这些微博ID对应的标记值改为“已导出”,以防止以后重复导出。
[0013]所述的网络爬取模块的各子模块的功能分别是:
[0014]微博ID爬取子模块,通过编写Chrome浏览器插件的方式请求并解析微博认证用户分类页面,并将解析出的ID发送给该模块的存储子模块。针对新浪、腾讯微博编写不同的浏览器插件进行爬取。为两个插件分别建立插件根目录,在插件根目录中创建manifest,json配置文件,指定在新浪微博认证用户首页加载完成之后加载jquery.js和content_script, js 两个 Javascript 文件,其中 jquery.js 是 jQuery 函数库,content_script.js 中为该子模块爬取认证用户ID的逻辑,通过配置文件中的permissions字段指定该插件能够请求认证用户页面和本地Webserver的任何资源。腾讯微博爬取插件的相关配置除了将新浪微博认证用户首页改为腾讯微博认证用户首页外其余项基本相同。新浪、腾讯微博的认证用户页面结构有所不同,具体的爬取过程也有所不同。针对新浪微博认证用户页面,首先使用jQuery获取所有class=nav_barMain的div元素中的ul元素中所有第一级Ii元素,再从每一个Ii元素中获取第一个a元素,其href属性即为一级分类的链接,a元素内的文字为一级分类的名称。其次获取第一级Ii元素中的ul元素,其内的Ii元素中的a元素内的文字及href属性为二级分类名称及链接。然后对于每一个二级分类,向其链接通过jQuery提供的$.post函数发送请求,在post函数返回的responseText中使用正则表达式找出三 级分类名称及链接。对于所有的三级分类链接,在链接后添上参数letter=a、letter=b、…、Ietter=Z构成26个新的链接,向这些链接分别发送post请求,在返回的页面中使用正则表达式找出出所有的微博ID。最后,将微博ID以及对应的分类分别构造成Javascript数组,调用jQuery提供的t post函数将该数组发送给该模块的存储子模块相应的的处理页面。针对腾讯微博认证用户页面,首先使用jQuery获取class=peopleNav的div元素中ul元素中的所有第一级Ii元素,每个Ii元素中第一个a元素的文本及href属性为一级分类名称及链接;其次使用jQuery触发每个Ii的mouseover事件,使得页面自动发送AJAX请求获取每个一级分类下的二级分类并写入当前页面。然后获取第一级Ii元素中class=navLayer的div元素,其中dt元素中的strong元素中的文本为二级分类名称,dt元素后的dd元素中所有的a元素的文本及href属性为三级分类名称及链接。对于每一个三级分类链接,在链接后添力口 sort=char&char=a、sort=char&char=b、...>sort=char&char=z 构成 26 个新的链接,向这些链接分别发送Post请求,在返回的页面中使用正则匹配表达式找出所有的微博ID。后续步骤与新浪微博相似,除了向存储子模块中对应腾讯微博ID的处理页面发送ID及对应的分类名称外,其他步骤基本相同。
[0015]存储子模块,使用PHP语言分别编写新浪、腾讯的saveld.php文件,接收新浪、腾讯微博ID爬取子模块的Get/Post请求,获取分类名称数组和微博ID数组,按照数组中除最后一级分类外的分类名称分别建立认证用户ID采集目录并以分类名称命名(如果目录已存在则不再建立),以“最后一级分类名称.txt”的格式创建认证用户ID文件,并将ID数组中的ID以换行符隔开存入认证用户ID文件(如果认证用户ID文件已存在则只往文件中添加ID)。其中建立目录和创建文件之前需要将不允许出现在目录名或文件名中的字符“/”和“ \ ”替换为“、”。如分类名称数组为[“娱乐”,“娱乐产业”,“策划/宣传”],则建立的目录应为“娱乐/娱乐产业/”,并在目录中创建文件“策划、宣传.txt”,将ID存入该文件中。
[0016]微博API模块,自动化获取授权令牌以支持长期地通过API的方式不断地获取认证用户的粉丝ID。其中新浪微博的授权令牌需要通过模拟HTTPS请求的方式自动化获取,腾讯微博的授权令牌只需要定期调用腾讯微博提供的令牌刷新API即可实现在3个月内自动化获取。通过API的方式获取的粉丝ID数量达到一定阈值时,将粉丝ID存入本地的粉丝ID采集目录的粉丝ID文件中,粉丝ID文件以换行符分隔各个ID,以“当前时间戳.txt”的格式命名。包括新浪授权令牌获取子模块、腾讯授权令牌获取子模块和粉丝采集子模块。
[0017]所述的微博API模块的各个子模块的功能分别是:
[0018]新浪授权令牌获取子模块,新浪微博开放平台的授权页面采用的是HTTPS协议,链接经过加密保护,如果采用常规方法,调用java.net.URLconnection建立通信将会失败。为此,需要采用其他方法:经过仔细调研,得到用户登录新浪微博授权页面需要的参数。采用Apache公司的HttpClient开源工具提供的相关接口,仓Il建一个PostMethod对象,将登陆新浪微博所需的参数加入到该对象中。然后创建一个消息头链表,链表中的每个元素初始化为一个HttpClient中的Header对象,构造请求消息的消息头,填入相关信息,包括Referer> Host、User_Agent。创建Protocol对象,填入相关参数从而打开到服务端的链接,具体如下:协议名称设为“https”,端口为443, ProtocolSocketFactory参数通过创建MySSLSocketFactory对象(由微博平台提供)得到。创建HttpClient对象,通过调用相关接口,提交消息头链表。从而得到服务端的返回信息,之后解析返回消息,切分字符串,便得至Ij了 AccessToken。
[0019]腾讯授权令牌获取子模块,通过定期调用腾讯微博提供的访问令牌刷新API获取新的令牌,以保证令牌在3个月内不过期。该模块需要用户在系统运行前进行一次手动授权,此后3个月内只需定期刷新授权令牌,而无需手动授权。
[0020]粉丝采集子模块,从认证用户ID采集目录中读取认证用户ID文件,获取并遍历认证用户ID,使用授权令牌调用新浪、腾讯微博开放的API,随机获取认证用户随机的至多5000名粉丝的ID,并将粉丝ID缓存在一个缓存文件中,当粉丝ID数量达到一定阈值时,将缓存文件中的ID存入粉丝ID采集目录的粉丝ID文件中,粉丝ID文件以“当前时间戳.txt”的格式命名。虽然遍历一次认证用户ID只能获取每位认证用户的至多5000名粉丝的ID,但是通过多次遍历使得获取的ID趋于完全。多次遍历需要调用较多次数的API,但新浪、腾讯微博对调用频率进行了限制,因此影响了采集的效率。通过使用多个微博应用测试用户轮询、多台机器同时抓取的方式,在不违背新浪微博、腾讯微博限制API调用次数的初衷的前提下提高采集的效率。其中微博应用测试用户(以下简称测试用户)是能够获取授权令牌的最小单位。微博对API调用次数的限制分为3个级别:测试用户级别(每小时内一个测试用户调用API的频率不能超过此上限),微博应用级别(每小时内同一微博应用中多个测试用户调用API的次数总和不能超过此上限)和IP级别(每小时内同一台机器上的多个微博应用调用API的次数总和不能超过此上限)。多测试用户方式轮询采集是指在同一个程序中首先使用多个测试用户分别获取授权令牌,其次轮询地使用这些授权令牌调用API,以增加每小时内API的调用次数,该方式能够使API调用频率达到IP级别的调用频率上限。在新浪、腾讯微博中,微博应用级别和IP级别的API调用频率上限相等,因此不需要研究在一台机器上通过多个微博应用同时采集的方式提高采集速率。多台机器同时抓取的方式是指将多测试用户方式轮询采集程序部署到多台机器上同时运行,每台机器的API调用频率都可以达到IP级别的API调用频率上限,因此该方式能够使API调用频率达到机器数*IP级别API调用频率上限。在使用多台机器同时抓取的采集方式时,每台机器分别将已采集的微博ID缓存在自己的缓存文件中,当缓存的ID数量达到一定阈值时,使用Ftp接口将缓存的文件上传至索引和去重模块所在机器的粉丝ID采集目录中。假设需要采集新浪微博的55000位认证用户的粉丝ID,需要遍历5次认证用户ID,如果不使用多个测试用户轮询、多台机器同时采集的方式,由于测试用户级别API调用频率限制(150次/小时),需要(55000*5)/150=1833.33小时=76.4天才能采集完成。如果需要更快地采集微博ID而不对微博网站构成潜在的风险,可以采用多测试用户的方式,由于IP级别API调用频率限制(1000次/小时),最多可以使用7个测试用户,则上述需求只需(55000*5)/1000=275小时=11.5天即可完成。如果还需要进一步提高采集的速率,可以采用多机器的方式,此时API调用频率可以达到1000*机器数/每小时,如果使用5台机器进行采集,则上述需求只需(55000*5)/(1000*5) =55小时?2.3天即可完成。用户可以根据具体需求及条件采取合适的采集方案。
[0021]所述的述的去重与索引模块的各个子模块的功能分别是:
[0022]索引建立模块,使用Linux的Crontab工具定期执行。模块使用Java编写,每次执行时从微博粉丝ID采集目录中读取粉丝ID文件,将文件中的ID存入HashSet容器实现自动去重(HashSet容器是基于哈希算法实现的容器,具有集合特性,能保证其中的元素不重复出现),在Lucene索引中查询HashSet容器中的ID,如果ID已存在于索引中,则将ID从HashSet容器中删除,然后将HashSet容器中的ID存入Lucene索引,将新并入索引的ID标记为“未导出”,将已处理的粉丝ID文件删除。
[0023]ID导出子模块,使用Linux的Crontab工具定期执行。每次执行时调用Lucene提供的API,从Lucene中检索出一定数量的标记为“未导出”的微博ID,在本地已建立好的微博ID导出目录中创建微博ID导出文件,将导出的微博ID以换行符分隔存入文件中,文件根据当前系统时间以“年-月-日_时-分.txt”的格式命名,并将对应ID的标记置为“已导出”。
[0024]标记更新子模块,使用Linux的Crontab工具定期执行。每次执行时检查本地的微博ID导出目录中的微博ID导出文件,如果文件名被存储模块处理并重命名为“Hbase-年-月_日_时-分.txt”的格式,则在Lucene中将该文件中的ID对应的标记置为“已导入Hbase”,并将该文件删除。
[0025]所述方法包括下列操作步骤:
[0026](I)工具通过采集层收集来自微博网站的微博ID ;
[0027](2)工具通过存储层对微博ID进行去重和分布式存储操作。
[0028]所述步骤(I)进一步包括下列操作:
[0029](1.1)采集层中的网络爬取模块通过编写浏览器插件的方式从新浪、腾讯两大微博网站上爬取所有认证用户的ID,并存储到本地的文件中;
[0030](1.2)采集层中的微博API模块首先自动获取新浪、腾讯微博的API调用授权令牌,其次通过调用API的方式获取认证用户的粉丝ID,最后将粉丝ID存储在本地的粉丝ID采集目录的粉丝ID文件中。[0031]所述步骤(1.1)中,网络爬取模块的爬取和存储的操作进一步包括下列内容:
[0032](1.1.1)通过编写Chrome浏览器插件的方式请求并解析微博认证用户分类页面,并将解析出的ID发送给该模块的存储子模块。针对新浪、腾讯微博编写不同的浏览器插件进行爬取。为两个插件分别建立插件根目录,在插件根目录中创建manifest, json配置文件,指定在新浪微博认证用户首页加载完成之后加载jquery.js和content_script.js两个Javascript文件,其中jquery.js是jQuery函数库,content_script.js中为该子模块爬取认证用户ID的逻辑,通过配置文件中的permissions字段指定该插件能够请求认证用户页面和本地Webserver的任何资源。腾讯微博爬取插件的相关配置除了将新浪微博认证用户首页改为腾讯微博认证用户首页外其余项基本相同。新浪、腾讯微博的认证用户页面结构有所不同,具体的爬取过程也有所不同。
[0033](1.1.2)针对新浪微博认证用户页面,爬取过程为:
[0034]首先使用jQuery获取所有class=nav_barMain的div元素中的ul元素中所有第一级Ii元素。
[0035]从每一个Ii元素中获取第一个a元素,其href属性即为一级分类的链接,a元素内的文字为一级分类的名称。
[0036]获取第一级Ii元素中的ul元素,其内的Ii元素中的a元素内的文字及href属性为二级分类名称及链接。
[0037]然后对于每一个二级分类,向`其链接通过jQuery提供的$.post函数发送请求,在post函数返回的responseText中使用正则表达式找出三级分类名称及链接。
[0038]对于所有的三级分类链接,在链接后添上参数letter=a、letter=b、…、Ietter=Z构成26个新的链接,向这些链接分别发送post请求,在返回的页面中使用正则表达式找出所有的微博ID。
[0039]最后,将微博ID以及对应的分类分别构造成Javascript数组,调用jQuery提供的$.post函数将该数组发送给该模块的存储子模块相应的的处理页面。
[0040](1.1.3)网络爬取模块中的腾讯微博ID爬取子模块,针对腾讯微博认证用户页面,爬取过程如下:
[0041]首先使用jQuery获取class=peopleNav的div元素中ul元素中的所有第一级Ii元素,每个Ii元素中第一个a元素的文本及href属性为一级分类名称及链接。
[0042]使用jQuery触发每个Ii的mouseover事件,使得页面自动发送AJAX请求获取每个一级分类下的二级分类并写入当前页面。
[0043]然后获取第一级Ii元素中class=navLayer的div元素,其中dt元素中的strong元素中的文本为二级分类名称,dt元素后的dd元素中所有的a元素的文本及href属性为三级分类名称及链接。
[0044]对于每一个三级分类链接,在链接后添加sort=char&char=a、sort=char&char=b>…、sort=char&char=z构成26个新的链接,向这些链接分别发送post请求,在返回的页面中使正则表达式找出所有的微博ID。
[0045]后续步骤与新浪微博相似,除了向存储子模块中相应的处理页面发送ID及对应的分类名称外,其他步骤基本相同。
[0046](1.1.4)网络爬取模块中的存储子模块,使用PHP语言编写新浪、腾讯的saveld.Php文件,接收新浪、腾讯微博ID爬取子模块在(1.1.2)与(1.1.3)中发送的Get/Post请求,获取分类名称数组和微博ID数组,按照数组中除最后一级分类外的分类名称分别建立认证用户ID采集目录并以分类名称命名(如果目录已存在则不再建立),以“最后一级分类名称.txt”的格式创建认证用户ID文件,并将ID数组中的ID以换行符隔开存入认证用户ID文件(如果认证用户ID文件已存在则只往文件中添加ID)。其中建立目录和创建文件之前需要将不允许出现在目录名或文件名中的字符“/”和“\ ”替换为“、”。如分类名称数组为[“娱乐”,“娱乐产业”,“策划/宣传”],则建立的目录应为“娱乐/娱乐产业/”,并在目录中创建文件“策划、宣传.txt”。
[0047]所述步骤(1.2)中,微博API模块的采集和存储的操作进一步包括下列内容:
[0048](1.2.1)微博API模块中的新浪授权令牌获取子模块,通过模拟HTTPS请求自动获取新浪微博SDK访问令牌,保证令牌不过期,其他模块只需利用得到的令牌,遵循0Auth2.0协议通过认证,即可对SDK提供的API进行调用。具体的方式是:
[0049]经过仔细调研,得到用户登录新浪微博授权页面需要的参数。
[0050]采用Apache公司的HttpClient开源工具提供的相关接口,仓Il建一个PostMethod对象,将登陆新浪微博所需的参数加入到该对象中。
[0051]创建一个消息头链表,链表中的每个元素初始化为一个HttpClient中的Header对象,构造请求消息的消息头,填入相关信息,包括Referer、Host、User_Agent。
[0052]创建Protocol对象,填入相关参数从而打开到服务端的链接,具体如下:协议名称设为 “https”,端口为 443, ProtocolSocketFactory 参数通过创建 MySSLSocketFactory对象(由微博平台提供)得到。
[0053]创建HttpClient对象,通过调用相关接口,提交消息头链表。
[0054]完成以上步骤之后即可得到服务端的返回信息,之后解析返回消息,切分字符串,便得到了 AccessToken。
[0055](1.2.2)微博API模块中的腾讯授权令牌获取子模块,程序运行前,用户手动运行使用一次手动授权之后得到的访问令牌,通过定期调用腾讯微博提供的访问令牌刷新API,获取新的令牌,以保证令牌在3个月内不过期。其中手动授权的过程为,运行授权程序,程序将弹出浏览器,显示腾讯微博授权页面,输入用户名密码后页面自动跳转,将跳转后页面的URL中#号后面的部分复制,粘贴到程序中并输入回车,即可完成一个测试用户的授权。
[0056](1.2.3)微博API模块中的粉丝采集子模块,从认证用户ID采集目录中读取认证用户ID文件,其中认证用户ID采集目录和认证用户ID文件由(1.1.4)产生,将文件中的所有ID存储于一个数组中;
[0057](1.2.4)对于(1.2.3)中的数组中的每一个认证用户ID,使用授权令牌调用新浪、腾讯微博开放的API,随机获取该认证用户随机的至多5000名粉丝的ID,并将粉丝ID保存在一个缓存文件中;
[0058](1.2.5)当粉丝ID数量达到一定阈值时,将缓存文件中的ID存入粉丝ID采集目录的粉丝ID文件中,粉丝ID文件以“当前时间戳.txt”的格式命名;
[0059](1.2.6)经以上步骤遍历认证用户ID,只能获取每位认证用户随机的至多5000名粉丝ID,因此需要重复(1.2.3) (1.2.4) (1.2.5)步骤,多次遍历认证用户ID抓取其粉丝ID,使得系统获取的ID逐渐趋于完整;[0060](1.2.7)在(1.2.6)中所述的多次重复遍历需要较多的API调用次数,但由于API调用次数存在限制,多次遍历需要较长时间。通过使用多个微博应用测试用户轮询、多台机器同时抓取的方式,在不违背新浪微博、腾讯微博限制API调用次数的初衷的前提下提高采集的效率。其中微博应用测试用户(以下简称测试用户)是能够获取授权令牌的最小单位。微博对API调用次数的限制分为3个级别:
[0061]表IAPI调用次数限制说明
[0062]
限制級别测试用户级别每小时内一个测试用户调用API #频率不能超过 此上限微博应用级别每小时内同一微博应用中多个测试用户调用API 的次数总和不能超过此上F艮IP级别每小时内同一台机器上的多个徽博应用调爾API 的次数总和不能超过此上跟
[0063]多测试用户方式轮询采集是指在同一个程序中首先使用多个测试用户分别获取授权令牌,其次轮询地使用这些授权令牌调用API,以增加每小时内API的调用次数,该方式能够使API调用频率达到IP级别的调用频率上限。
[0064]在新浪、腾讯微博中,微博应用级别和IP级别的API调用频率上限相等,因此不需要研究在一台机器上通过多个微博应用同时采集的方式提高采集速率。
[0065]多台机器同时抓取的方式是指将多测试用户方式轮询采集程序部署到多台机器上同时运行,每台机器的API调用频率都可以达到IP级别的API调用频率上限,因此该方式能够使API调用频率达到机器数*IP级别API调用频率上限。
[0066]在使用多台机器同时抓取的采集方式时,每台机器分别将已采集的微博ID缓存在自己的缓存文件中,当缓存的ID数量达到一定阈值时,使用ftp接口将缓存的文件上传至索引和去重模块所在机器的粉丝ID采集目录中。
[0067]经过加入多测试用户轮询、多台机器部署等机制,系统的性能有了明显改进。假设需要采集新浪微博的55000位认证用户的粉丝ID,需要遍历5次认证用户ID,如果不使用多个测试用户轮询、多台机器同时采集的方式,由于测试用户级别API调用频率限制(150次/小时),需要(55000*5)/150=1833.33小时=76.4天才能采集完成。如果需要更快地采集微博ID而不对微博网站构成潜在的风险,可以采用多测试用户的方式,由于IP级别API调用频率限制(1000次/小时),最多可以使用7个测试用户,则上述需求只需(55000*5)/1000=275小时=11.5天即可完成。如果还需要进一步提高采集的速率,可以采用多机器的方式,此时API调用频率可以达到1000*机器数/每小时,如果使用5台机器进行采集,则上述需求只需(55000*5)/(1000*5) =55小时?2.3天即可完成。用户可以根据具体需求及条件采取合适的采集方案。
[0068]所述步骤(2)进一步包括下列操作:
[0069](2.1)存储层中的去重与索引模块,去重与索引模块,调用Lucene提供的API为已采集过的微博ID建立索引,其中新浪、腾讯微博对应的索引名称分别为丨11(1以_4和index_B,定期将微博ID导出到指定目录的文件中供数据存储模块处理。索引中包括微博ID和标记两列。微博ID和标记都会被检索,存储方式都是“不分词”。标记有三种取值:“未导出”、“已导出”和“已导入Hbase”。其中“未导出”表不微博ID未从Lucene中导出;“已导出”表不微博ID已从Lucene中导出,但未导入到Hbase中;“已导入Hbase”表不微博ID已导入到Hbase中。
[0070](2.2)数据存储模块,负责从去重与索引模块导出已采集的微博ID,利用存储模块,将微博id存入Hbase中同时提供微博ID查询接口。该模块使用Linux的Crontab命令定期执行。每次执行时,调用Iucene提供的API从index_A和index_B两个索引中分别检索出数据存储模块,将新浪微博ID和腾讯微博ID分别存储在Hbase的不同的表中,表的主键为“DDDDD微博ID”的格式,其中DDDDD表示一个五位十进制数字,该数字前缀是为后期的数据分析预留的标记空间,可以用于标记该微博ID的状态或者属性。该模块定期从Lucene中检索出标记值等于“未导出”的微博ID,调用Hbase提供的API,将这些微博ID存入Hbase相应的表中,并在Lucene中将这些微博ID对应的标记值改为“已导出”,以防止以后重复导出。
[0071]所述步骤(2.1)中,去重与索引模块的操作进一步包括下列内容:
[0072](2.1.1)索引模块中的索引建立子模块调用Lucene提供的API索引建立模块,使用Linux的Crontab工具定期执行。每次执行时从微博粉丝ID采集目录中读取粉丝ID文件,将文件中的ID存入HashSet容器实现自动去重(HashSet容器是基于哈希算法实现的容器,具有集合特性,能保证其中的元素不重复出现),调用Lucene提供的检索API在Lucene索引中查询HashSet容器中的ID,如果ID已存在于索引中,则将ID从HashSet容器中删除,然后调用Lucene提供的索引API将HashSet容器中的ID并入Lucene索引,将新并入索引的ID标记为“未导出”,将已处理的粉丝ID文件删除。
[0073](2.1.2)索引模块中的ID导出子模块,使用Linux的Crontab工具定期执行。每次执行时调用Lucene提供的API,从Lucene中检索出一定数量的标记为“未导出”的微博ID,在本地已建立好的微博ID导出目录中创建微博ID导出文件,将导出的微博ID以换行符分隔存入文件中,文件根据当前系统时间以“年-月-日_时-分.txt”的格式命名,并将对应ID的标记置为“已导出”。
[0074](2.1.3)索引模块中的标记更新子模块,使用Linux的Crontab工具定期执行。每次执行时检查本地的微博ID导出目录中的是否存在文件名为“Hbase-年-月-日_时-分.txt”的格式的文件,如果存在,表示该文件中的ID已被数据存储模块处理完毕,则在Lucene中将这些文件中的ID对应的标记置为“已导入Hbase”,并将该文件删除。
[0075]所述步骤(2.2)中,数据存储模块的存储操作进一步包括下列内容:
[0076](2.2.1)利用Linux提供的Contab工具定期地从新浪、腾讯微博的微博ID导出目录中读取由(2.1.2)产生的以“年-月-日_时-分.txt”格式命名的文件,获取文件中的微博ID ;
[0077](2.2.2)调用Hbase提供的API,将(2.2.1)中获取的新浪、腾讯微博ID分别存入Hbase相应的微博ID表中,其中新浪微博ID存入表author_A中,腾讯微博ID存入表author_B中。表的主键设计为“DDDDD微博ID”的格式,其中DDDDD表示一个五位十进制数字,该数字前缀是为后期的数据分析预留的标记空间,可以用于标记该微博ID的状态或者属性;
[0078](2.2.3)调用Lucene提供的字段更新API,将新浪、腾讯微博的微博ID导出目录中已被(2.2.1)和(2.2.2)处理过的文件加上前缀“Hbase-”,即重命名为“Hbase-年-月-日_时-分.txt”的格式。
【专利附图】

【附图说明】
[0079]图1是本发明一种面向主流微博网站微博ID的采集方法及工具的架构组成示意图。
[0080]图2是面向主流微博网站微博ID的采集方法及工具的操作流程示意图。
【具体实施方式】
[0081]为使本发明的目的、技术方案和优点更加清楚,下面结合附图对本发明作进一步的详细描述。
[0082]参见图1,本发明的架构分为两个层次,分别为采集层和存储层,层次和系统间的接口清晰,每层内部都由若干模块组成,模块之间的松耦合,有利于每层功能的扩展。采集层实现微博ID的采集,存储层实现本地分布式存储,并提供检索功能;其中:
[0083]采集层,实现认证用户ID爬取和认证用户粉丝ID的采集工作,由网络爬取模块和微博API模块组成。
[0084]存储层,负责对采集层中获取的微博ID进行去重操作以及将微博ID进行分布式存储,并提供微博ID查询接口,由去重模块和数据存储模块组成。
[0085]所述采集层的各模块的功能分别是:
[0086]网络爬取模块,负责针对新浪、腾讯微博认证用户网页中微博ID的抓取工作,主要包括网页爬取及解析和本地存储的操作。其中网页爬取及解析操作通过编写浏览器插件的方式来完成,本地存储操作通过编写Webserver代码的方式来完成。包括请求微博认证用户首页,一级、二级和三级分类页面,解析页面中的分类名称及对应的URL,请求并解析各级分类页面中的微博ID,并将微博ID存储到本地的认证用户ID采集目录中的认证用户ID文件中。其中认证用户ID目录是本地目录,依据微博网站的认证用户分类等级以及名称自动分级建立;认证用户ID文件以换行符分隔各个ID,并以“最下级分类名称.txt”的格式命名。该模块包括微博ID爬取子模块和存储子模块。
[0087]微博API模块,使用新浪、腾讯微博开放平台提供的微博API,获取微博认证用户的粉丝ID。其操作流程包括首先获得两大微博开放平台的授权令牌,其次根据业务需求,构造不同的参数给相应的API接口,并发送Get/Post请求,得到JSON格式的微博ID数据,并将解析出的微博ID存入粉丝ID采集目录的粉丝ID文件中。其中,粉丝ID采集目录是一个存储粉丝ID文件的目录,粉丝ID文件是存放该模块获取的ID的文本文件,以换行符分隔各个ID,每个文件存放一定数量的ID,文件以“当前时间戳.txt”的格式命名。
[0088]所述存储层的各模块的功能分别是:
[0089]去重与索引模块,所述的去重与索引模块,为已采集过的微博ID进行去重操作并建立索引,其中新浪、腾讯微博对应的索引名称分别为化(1以_4和index_B,定期将微博ID导出到指定目录的文件中供数据存储模块处理,在索引中设置标记字段防止重复导出ID。索引中包括微博ID和标记两列,存储方式都是“不分词”。标记有三种取值:“未导出”、“已导出”和“已导入Hbase”。其中“未导出”表不微博ID未从Lucene中导出已导出”表不微博ID已从Lucene中导出,但未导入到Hbase中;“已导入Hbase”表不微博ID已导入到Hbase中。该模块包括索引建立子模块、ID导出子模块和标记更新子模块。索引建立模块实现将采集的ID去重,并将去重后的ID并入索引,将对应ID的标记字段置为“未导出”。ID导出子模块负责定期检索索引中未导出的ID,存入本地的微博ID导出目录中的微博ID导出文件(微博ID导出目录需要在系统运行前创建,微博ID导出文件在每次导出时自动创建),文件命名格式为“年-月-日_时-分.txt”,并提供给数据存储模块处理,将对应ID的标记置为“已导出”。标记更新子模块负责检查数据存储模块是否已处理完导出的ID,若处理完成,则将对应ID的标记置为“已导入Hbase”。
[0090]数据存储模块,负责从本地的微博ID导出目录中读取微博ID导出文件,并使用开源的分布式系统Hadoop中的存储工具Hbase将文件中的微博ID进行分布式存储,同时提供微博ID查询接口。该模块使用Linux的Crontab命令定期执行。每次执行时,读取本地的微博ID导出目录中的微博ID导出文件,将新浪微博ID和腾讯微博ID分别存储在Hbase的不同的表中,表的主键设计为“DDDDD微博ID”的格式,其中DDDDD表示一个五位十进制数字,该数字前缀是为后期的数据分析预留的标记空间,可以用于标记该微博ID的状态或者属性。该模块定期从Lucene中检索出标记值等于“未导出”的微博ID,调用Hbase提供的API,将这些微博ID存入Hbase相应的表中,并在Lucene中将这些微博ID对应的标记值改为“已导出”,以防止以后重复导出。
[0091]所述的网络爬取模块的各子模块的功能分别是:
[0092]新浪微博ID爬取子模块,通过编写浏览器插件的方式解析新浪微博的认证用户主页,获取一级分类列表及其URL,并对一级分类列表中的URL发送AJAX请求获取相应的页面,如果没有下一级分类,则向该分类中以每个字母开头的认证用户页面发送AJAX请求,从获取的页面中解析出认证用户ID,并使用Get/Post请求将解析出来的微博ID及其对应的分类发送给该模块的存储子模块。否则,从一级分类页面中解析出二级分类列表及其URL,进行同上的操作。
[0093]腾讯微博ID爬取子模块,通过编写浏览器插件的方式解析腾讯微博的认证用户主页,获取一级和二级分类列表及其URL,并对二级分类中以每个字母开头的认证用户页面发送AJAX请求,从获取的页面中解析出认证用户的ID,并使用Get/Post请求将解析出的微博ID及其对应的分类发送给该模块的存储子模块。
[0094]存储子模块,使用Webserver接收新浪、腾讯微博ID爬取子模块的Get/Post请求,按照一级、二级分类分别建立一级、二级目录并以分类名称命名,其中建立目录之前需要将不允许出现在目录名中的字符“/”和“\”替换为“、”,并将微博ID分类存入相应的文件中。[0095]微博API模块,自动化获取授权令牌以支持长期地通过API的方式不断地获取认证用户的粉丝ID。其中新浪微博的授权令牌需要通过模拟HTTPS请求的方式自动化获取,腾讯微博的授权令牌只需要定期调用腾讯微博提供的令牌刷新API即可实现自动化获取。通过API的方式获取的粉丝ID数量达到一定阈值时,将粉丝ID存入粉丝ID采集目录的粉丝ID文件中,粉丝ID文件以“当前时间戳.txt”的格式命名。包括新浪授权令牌获取子模块、腾讯授权令牌获取子模块和粉丝采集子模块。
[0096]所述的微博API模块的各个子模块的功能分别是:
[0097]新浪授权令牌获取子模块,通过模拟HTTPS请求自动获取新浪微博SDK访问令牌,保证令牌不过期,其他模块只需利用得到的令牌,遵循0Auth2.0协议通过认证,即可对SDK提供的API进行调用。具体的方式是:通过构造新浪微博授权页面登录动作所需要的参数,依据HTTPS协议的特点,利用Apache公司提供的HttpClient开源工具,构造请求所需消息头,设置PostMethod,加上开放平台提供的通用Socket接口连通客户端到服务器的通信,发送Post请求,从而成功获取服务器端的响应,并解析响应消息体,获取认证令牌。
[0098]腾讯授权令牌获取子模块,使用一次手动授权之后得到的访问令牌,通过定期调用腾讯微博提供的访问令牌刷新API,获取新的令牌,以保证令牌在3个月以内不过期。其中手动授权的过程为,运行授权程序,程序将弹出浏览器,显示腾讯微博授权页面,输入用户名密码后页面自动跳转,将跳转后页面的URL中#号后面的部分复制,粘贴到程序中并输入回车,即可完成一个测试用户的授权。
[0099]粉丝采集子模块,从认证用户ID采集目录中读取认证用户ID文件,获取并遍历认证用户ID,使用授权令牌调用新浪、腾讯微博开放的API,随机获取认证用户随机的至多5000名粉丝的ID,并将粉丝ID缓存在一个缓存文件中,当粉丝ID数量达到一定阈值时,将缓存文件中的ID存入粉丝ID采集目录的粉丝ID文件中,粉丝ID文件以“当前时间戳.txt”的格式命名。该模块通过使用多个微博应用测试用户、多台机器同时抓取的方式,突破新浪微博、腾讯微博对于API调用次数的限制。其中微博应用测试用户(以下简称测试用户)是能够获取授权令牌的最小单位。由于一个测试用户在一个IP上的一个应用中每小时的API调用次数不能超过150次,而多个测试用户在一个IP上的一个或多个应用中每小时API调用次数的总和不能超过1000次,因此该模块采用多测试用户、多台机器的方式以增加API的调用次数。
[0100]参看图2,所述的面向主流微博网站的微博ID采集方法及工具的具体操作流程为:爬取新浪、腾讯微博认证用户微博ID,并存储在本地文件中;获取新浪、腾讯微博授权令牌,使用授权令牌调用相关API,获取认证用户的粉丝ID,并存储在本地文件中,受新浪、腾讯微博API调用次数的限制,该操作需要较长时间;定期将上一步骤采集的粉丝ID去重并为其建立索引;定期从索引中检索出ID,将其存入Hbase中。
[0101]所述方法包括下列操作步骤:
[0102](I)工具通过采集层收集来自微博网站的微博ID ;
[0103](2)系统通过存储层对微博ID进行去重和分布式存储操作。
[0104]所述步骤(I)进一步包括下列操作:
[0105](1.1)采集层中的网络爬取模块通过编写浏览器插件的方式从新浪、腾讯两大微博网站上爬取所有认证用户的ID,并存储到本地的文件中;[0106](1.2)米集层中的微博API模块首先自动获取新浪、腾讯微博的API调用授权令牌,其次通过调用API的方式获取认证用户的粉丝ID,并将粉丝ID存储在本地的粉丝ID采集目录的粉丝ID文件中。
[0107]所述步骤(1.1)中,网络爬取模块的爬取和存储的操作进一步包括下列内容:
[0108](1.1.1)通过编写Chrome浏览器插件的方式请求并解析微博认证用户分类页面,并将解析出的ID发送给该模块的存储子模块。针对新浪、腾讯微博编写不同的浏览器插件进行爬取。为两个插件分别建立插件根目录,在插件根目录中创建manifest, json配置文件,其中新浪微博爬取插件的manifest, json文件中的相关配置代码为:
[0109]
【权利要求】
1.一种面向主流微博网站微博ID的采集方法及工具,其特征在于:所述系统架构分为两个层次,分别为采集层和存储层,层次和系统间的接口清晰,每层内部都由若干模块组成,模块之间的松耦合,有利于每层功能的扩展。采集层实现微博ID的采集,存储层实现本地数据库存储,并提供开放式检索功能。其中:采集层,实现认证用户ID爬取和认证用户粉丝ID的采集工作,由网络爬取模块和微博API模块组成。存储层,负责对采集层中获取的微博ID进行去重操作以及将微博ID进行分布式存储,并提供微博ID查询接口,由去重与索引模块和数据存储模块组成。
2.根据权利要求1所述的面向主流微博网站微博ID的采集方法及工具,其特征在于:所述采集层的各模块的功能分别是:网络爬取模块,负责针对新浪、腾讯微博认证用户网页中微博ID的抓取工作,主要包括网页爬取、ID解析和ID本地存储的操作。其中网页爬取及ID解析操作通过编写浏览器插件的方式来完成,本地存储操作通过编写Webserver代码的方式来完成。流程包括请求微博认证用户首页,一级、二级和三级分类页面,解析页面中的分类名称及对应的URL,请求并解析各级分类页面中的微博ID,并将微博ID存储到本地的认证用户ID采集目录中的认证用户ID文件中。微博API模块,使用新浪、腾讯微博开放平台提供的微博API,获取微博认证用户的粉丝ID。其操作流程包括首先获得两大微博开放平台的授权令牌,其次根据不同微博的API接口,构造不同的参数给相应的API接口,得到JSON格式的微博ID数据,并将解析出的微博ID存入本地的粉丝ID采集目录的粉丝ID文件中。
3.根据权利要求1所述 的面向主流微博网站微博ID的采集方法及工具,其特征在于:所述存储层的各模块的功能分别是:去重与索引模块,负责利用开源的索引工具Lucene对微博API模块采集的微博ID进行去重操作并建立索引,定期从索引中导出微博ID以供数据存储模块处理。导出的微博ID存储在本地的微博ID导出目录的微博ID导出文件中。数据存储模块,负责从本地的微博ID导出目录中读取微博ID导出文件,并使用开源的分布式系统Hadoop中的存储工具Hbase将文件中的微博ID进行分布式存储,同时提供微博ID查询接口。
4.根据权利要求2所述的采集层,其特征在于:所述的网络爬取模块的各子模块的功能分别是:微博ID爬取子模块,通过编写浏览器插件的方式请求并解析微博认证用户分类页面,并将解析出的ID发送给该模块的存储子模块。由于浏览器插件使用Javascript语言编写,采用jQuery等Javascript库简化请求页面和解析HTML文档的操作;由于浏览器插件代码会在浏览器加载完指定的页面后自动执行,通过设置代码在微博登陆后执行来避开对微博登陆过程的开发;利用Javascript能够向同一域名内的任何资源发起Get/Post请求的特性,请求到所有的微博认证用户的页面;利用浏览器插件支持跨域XMLHttpRequest请求的特点(XMLHttpRequest是Javascript发送Get/Post请求的基础),将爬取的ID通过Get/Post请求发送到自己编写的Webserver上进行本地存储。存储子模块,使用Webserver接收新浪、腾讯微博ID爬取子模块的Get/Post请求,按照一级和二级分类分别在本地建立一级和二级认证用户ID采集目录并以分类名称命名,并将微博ID按照所属分类存入相应的认证用户ID采集目录的认证用户ID文件中。
5.根据权利要求2所述的采集层,其特征在于:所述的微博API模块,自动化获取授权令牌以支持长期地通过API的方式不断地获取认证用户的粉丝ID。其中新浪微博的授权令牌需要通过模拟HTTPS请求的方式自动化获取,腾讯微博的授权令牌只需要定期调用腾讯微博提供的令牌刷新API即可在3个月内实现自动化获取。通过API的方式获取的粉丝ID数量达到一定阈值时,将粉丝ID存入粉丝ID采集目录的粉丝ID文件中,粉丝ID文件以换行符分隔各个ID,以“当前时间戳.txt”的格式命名。包括新浪授权令牌获取子模块、腾讯授权令牌获取子模块和粉丝采集子模块。
6.根据权利要求3所述的存储层,其特征在于:所述的去重与索引模块,为已采集过的微博ID进行去重操作并建立索引,定期将微博ID导出到指定目录的文件中供数据存储模块处理,在索引中设置标记字段防止重复导出ID。索引中包括微博ID和标记两列,存储方式都是“不分词”。标记有三种取值:“未导出”、“已导出”和“已导入Hbase”。其中“未导出”表不微博ID未从Lucene中导出;“已导出”表不微博ID已从Lucene中导出,但未导入到Hbase中;“已导入Hbase”表示微博ID已导入到Hbase中。该模块包括索引建立子模块、ID导出子模块和标记更新子模块。索引建立模块实现将采集的ID去重,并将去重后的ID并入索引,将对应ID的标记字段置为“未导出”。ID导出子模块负责定期检索索引中未导出的ID,存入本地的微博ID导出目录中的微博ID导出文件(微博ID导出目录需要在系统运行前创建,微博ID导出文 件在每次导出时自动创建),文件命名格式为“年-月-日_时-分.txt”,并提供给数据存储模块处理,将对应ID的标记置为“已导出”。标记更新子模块负责检查数据存储模块是否已处理完导出的ID,若处理完成,则将对应ID的标记置为“已导入Hbase”。新浪微博ID和腾讯微博ID分别存储在Hbase的不同的表中,表的主键设计为“DDDDD微博ID”的格式,其中DDDDD表示一个五位十进制数字,该数字前缀是为后期的数据分析预留的标记空间,可以用于标记该微博ID的状态或者属性。该模块定期从微博ID导出目录中读取以“年-月-日_时-分.txt”格式命名的文件,调用Hbase提供的API将文件中的微博ID存入Hbase相应的表中,将该文件重命名为“Hbase-年-月-日_时-分.txt”。
7.根据权利要求5所述的微博API模块,其特征在于:所述的各个子模块的功能分别是:新浪授权令牌获取子模块,通过模拟HTTPS请求自动获取新浪微博SDK访问令牌,保证令牌不过期,其他模块只需利用得到的令牌,遵循0Auth2.0协议通过认证,即可对SDK提供的API进行调用。腾讯授权令牌获取子模块,通过定期调用腾讯微博提供的访问令牌刷新API获取新的令牌,以保证令牌在3个月内不过期。该模块需要用户在系统运行前进行一次手动授权(即通过腾讯微博开发平台规定的方式进行授权),此后3个月内只需定期刷新授权令牌,而无需手动授权。粉丝采集子模块,从认证用户ID采集目录中读取认证用户ID文件,获取并遍历认证用户ID,使用授权令牌调用新浪、腾讯微博开放的API,随机获取认证用户随机的至多5000名粉丝的ID,并将粉丝ID缓存在一个缓存文件中,当粉丝ID数量达到一定阈值时,将缓存文件中的ID存入粉丝ID采集目录的粉丝ID文件中。
8.根据权利要求6所述的去重与索引模块,其特征在于:所述的各个子模块的功能分别是:索引建立模块,定期从微博粉丝ID采集目录中读取粉丝ID文件,将文件中的ID存入Set容器实现自动去重,在Lucene索引中查询Set容器中的微博ID,如果ID已存在于索引中,则将其从Set容器中删除,然后将Set容器中剩余的ID存入Lucene索引,将新并入索引的ID标记为“未导出”,将已处理的粉丝ID文件删除。ID导出子模块,定期从Lucene中检索出一定数量的标记为“未导出”的微博ID,在本地已建立好的微博ID导出目录中创建微博ID导出文件,将导出的微博ID以换行符分隔存入文件中,文件根据当前系统时间以“年-月-日_时-分.txt”的格式命名,并将对应ID的标记置为“已导出”。标记更新子模块,定期检查本地的微博ID导出目录中的微博ID导出文件,如果文件名被存储模块处理并被重命名为“Hbase-年-月_日_时-分.txt”的格式,则在Lucene中将该文件中的ID对应的标记置为“已导入Hbase”,并将该文件删除。
9.根据权利要求7所述的微博API模块,其特征在于:所述的新浪授权令牌获取子模±夹,新浪微博开放平台对测试用户的授权有效时间是24小时,测试授权的用户每隔24小时就需要登录授权页面重新申请新的AccessToken,这给第三方应用开发团队带来了很大的不便。而新浪授权令牌获取子模块则可以将这一手动过程自动化,从而使得低权限的第三方开发团队能忽略这一限制,实现自动化采集数据,为微博用户提供更好的服务。
10.根据权利要求7所述的微博API模块,其特征在于:所述的粉丝采集子模块,通过使用多个微博应用测试用户轮询、多台机器同时抓取的方式,在不违背新浪微博、腾讯微博限制API调用次数的初衷的前 提下提高采集的效率。多测试用户方式轮询采集是指在同一个程序中首先使用多个测试用户分别获取授权令牌,其次轮询地使用这些授权令牌调用API,以增加每小时内API的调用次数,该方式能够使API调用频率达到IP级别的调用频率上限。多台机器同时抓取的方式是指将多测试用户方式轮询采集程序部署到多台机器上同时运行,每台机器的API调用频率都可以达到IP级别的API调用频率上限,因此该方式能够使API调用频率达到机器数*IP级别API调用频率上限。在使用多台机器同时抓取的采集方式时,每台机器分别将已采集的微博ID缓存在自己的缓存文件中,当缓存的ID数量达到一定阈值时,使用Ftp接口将缓存的文件上传至索引和去重模块所在机器的粉丝ID采集目录中。
【文档编号】G06F17/30GK103440139SQ201310412348
【公开日】2013年12月11日 申请日期:2013年9月11日 优先权日:2013年9月11日
【发明者】闫丹凤, 杨翔, 张丽莹, 蓝田, 黄俊霖, 唐皓瑾, 邹文涛, 徐佳 申请人:北京邮电大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1