• / 27
  • 下载费用:10 金币  

社交网络数据采集算法的设计(软件工程课程设计报告).doc

关 键 词:
社交网络数据采集算法的设计(软件工程课程设计报告).doc
资源描述:
软件工程课程设计社交网络数据收集算法的设计组号 第 21 组组长 姓名:盖云东 学号:130104010049组员 姓名:任志成 学号:130104010121组员 姓名:马剑楠 学号:130104010004组员 姓名:陈海涛 学号:130104010045摘要随着互联网的发展,人们正处于一个信息爆炸的时代。社交网络数据信息量大、主题性强,具有巨大的数据挖掘价值,是互联网大数据的重要组成部分。一些社交平台如 Twitter、新浪微博、人人网等,允许用户申请平台数据的采集权限,并提供了相应的API 接口采集数据,通过注册社交平台、申请 API 授权、调用API 方法等流程获取社交信息数据。但社交平台采集权限的申请比较严格,申请成功后对于数据的采集也有限制。因此,本文采用网络爬虫的方式,利用社交账户模拟登录社交平台,访问社交平台的网页信息,并在爬虫任务执行完毕后,及时返回任务执行结果。相比于过去的信息匮乏,面对现阶段海量的信息数据,对信息的筛选和过滤成为了衡量一个系统好坏的重要指标。本文运用了爬虫和协同过滤算法对网络社交数据进行收集。关键词:软件工程;社交网络;爬虫;协同过滤算法目录摘要 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 2 -目录 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 3 -课题研究的目的 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 1 -1.1 课题研究背景 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 1 -2 优先抓取策略--PageRank ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 2 -2.1 PageRank 简介 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 2 -2.2 PageRank 流程 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 2 -3 爬虫 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 4 -3.1 爬虫介绍 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 4 -3.1.1 爬虫简介 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 4 -3.1.2 工作流程 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 4 -3.1.3 抓取策略介绍 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 5 -3.2 工具介绍 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 6 -3.2.1 Eclipse∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 7 -3.2.2 Python 语言 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 7 -3.2.3 BeautifulSoup ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 7 -3.3 实现 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 8 -3.4 运行结果 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 9 -4 算法部分 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 10 -4.1 获取数据的三种途径 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 10 -4.1.1 通过新浪微博模拟登录获取数据 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 10 -4.1.2 通过调用微博 API 接口获取用户微博数据 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 11 -4.2 基于用户的协同过滤算法 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 14 -4.2.1 集体智慧和协同过滤 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 14 -4.2.2 深入协同过滤核心 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 15 -4.3 算法实现 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 18 -结论 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 22 -参考文献 ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙- 23 -- 1 -课题研究的目的1.1 课题研究背景互联网导致一种全新的人类社会组织和生存模式悄然走进我们,构建了一个超越地球空问之上的、巨大的群体 ——网络群体,21 世纪的人类社会正在逐渐浮现出崭新的形态与特质,网络全球化时代的个人正在聚合为新的社会群体。随着社交网站的兴起,网络社交蓬勃发展,新的互联网热再次升温,有分析人士甚至说,网络社交将缔造人际交往的新模式。互联网的兴起打破了传统的社会交往方式,简单、快捷和无距离的社交体验推动社交网络快速发展,以 Facebook、Twitter、微博等为代表的应用吸引了大量活跃网络用户,社交网络信息呈现爆发式的增长。社交网络信息反映了用户的网络行为特征,通过对这些信息的研究,可以实现社会舆论监控、网络营销、股市预测等。社交网络信息的重要价值在于实时性,如何快速、准确、有效地获取目标信息非常重要。但社交网络属于 Deep Web 的专有网络,信息量大、主题性强,传统搜索引擎无法索引这些 Deep Web 页面,只有通过网站提供的查询接口或登录网站才能访问其信息,这增加了获取社交网络信息的难度。目前国外有关社交网络数据采集模型的研究较少,对社交网络的研究主要集中在社会网络分析领域。国内社交网络平台的数据采集技术研究有一定成果,如文献提出并实现一种利用新浪微博应用程序接口(Application Programming Interface,API)和网络数据流相结合的方式采集数据,文献利用人人网开发平台提供的API 实现数据采集,并通过 WebBrowser 和HttpFox 监测信息- 2 -交互时的数据包,实现动态获取Ajax 页面信息等。2 优先抓取策略--PageRank2.1 PageRank 简介PageRank,即网页排名,又称网页级别、Google 左侧排名或佩奇排名是 Google 创始人拉里 ·佩奇和谢尔盖 ·布林于 1997年构建早期的搜索系统原型时提出的链接分析算法,自从Google 在商业上获得空前的成功后,该算法也成为其他搜索引擎和学术界十分关注的计算模型。目前很多重要的链接分析算法都是在 PageRank 算法基础上衍生出来的。2.2 PageRank 流程首先 PageRank 的计算充分利用了两个假设:数量假设和质量假设。步骤如下:1) 在初始阶段:网页通过链接关系构建起 Web 图,每个页面设置相同的 PageRank 值,通过若干轮的计算,会得到每个页面所获得的最终 PageRank 值。随着每一轮的计算进行,网页当前的 PageRank 值会不断得到更新。2) 在一轮中更新页面 PageRank 得分的计算方法:在一轮更新页面 PageRank 得分的计算中,每个页面将其当前的 PageRank值平均分配到本页面包含的出链上,这样每个链接即获得了相应的权值。而每个页面将所有指向本页面的入链所传入的权值求和,即可得到新的 PageRank 得分。当每个页面都获得了更新后的PageRank 值,就完成了一轮 PageRank 计算。- 3 -然后,引入阻尼系数 p,p 的值一般为 0.85。完整公式如下:𝑃𝑎𝑔𝑒𝑅𝑎𝑛𝑘(𝑝𝑖)=1‒𝑞𝑁+𝑞Σ𝑃𝑎𝑔𝑒𝑅𝑎𝑛𝑘(𝑝𝑗)𝐿(𝑝𝑗)𝑝1,𝑝2,…,𝑝𝑁是被研究的页面, 是 链入页面的数量, 是 链出页面的数量,而 N 是所有页面的数量。使用幂法求 PageRank。那公式可以转换为求解 的值,其中矩阵为 A = q × P + ( 1 一 q) * /N 。 P 为概率转移矩阵, 为 n 维的全 1 行。𝐴=𝑞×𝑃+(1‒𝑞)∗𝑒𝑒𝑡/𝑁1. 计算 P 概率转移矩阵:1) 用矩阵表示连通图2) 网页链接概率矩阵3) 概率转移矩阵 P2. 计算 A 矩阵:1) 计算 /N2) 计算 A 矩阵- 4 -3. 循环迭代计算 PageRank3 爬虫3.1 爬虫介绍3.1.1 爬虫简介网络爬虫(又被称为网页蜘蛛,网络机器人,在 FOAF 社区中间,更经常被称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本,已被广泛应用于互联网领域。3.1.2 工作流程网络爬虫的基本工作流程如下:(1) 选取想爬取的网页的 URL。(2) 将这些 URL 放入待爬取 URL 队列。(3) 根据待爬取队列中的 URL 获取对应的网页。(4) 分析获取的网页,解析 DNS,从中得到数据以及新的 URL,并将已经抓取的 URL 放入已爬取 URL 队列。(5) 将新的 URL 放入待爬取 URL 队列,数据输出,存入本地下载库中。具体流程图如下:- 5 -图 3-1 爬虫工作流程3.1.3 抓取策略介绍在爬虫应用中,待爬取 URL 队列是很重要的一部分。待爬取队列中的 URL 以怎样的顺序爬取同样很重要,这决定这数据的获取顺序。决定待爬取队列中的 URL 以怎样的顺序爬取,这就是抓取策略。下面介绍几种常见的抓取策略:1. 广度优先遍历策略:广度优先遍历策略是指在抓取过程中,在完成与当前结点直接链接的结点的抓取后,才选择其中一个结点继续向下一层抓取。这种方法的思想是认为在与初始 URL 在一定链接距离内的网页具有最大的主题相关性。这种方法的缺点是,随着抓取网页数量的增加,大量无关网页会被下载,造成不必要的浪费。2. 深度优先遍历策略:深度优先遍历策略是指在抓取开始,选择与当前结点相链接- 6 -的一个结点,分析其 URL,然后在选择其中一个进行抓取,这样重复下去,直到其中一条链路抓取完毕,然后再重新选择一个未抓取的 URL 进行抓取。显然这种方法的深度决定着抓取的命中率及效率。随着深度的增大,命中率及效率会成倍的下降。3. 最佳优先遍历策略最佳优先遍历算法根据一定的网页分析算法,算出网页与初始网页的相关性,相关性高的网页优先抓取,这样,爬虫程序只抓取那些根据计算得到的“有用的”网页,但是这样可能导致在抓取路径上一些相关网页被遗漏。4. Partial PageRank 策略Partial PageRank 策略借鉴了 PageRank 算法的思想,根据已经下载网页的 URL 以及待爬取 URL 队列,计算每个网页的PageRank 值,根据值得大小进行抓取排序。为防止部分相关网页因 PageRank 值小而一直不能被抓取,一般抓取 K 次后重新计算 PageRank 值。因为一些新下载的网页没有 PageRank 值,所以将这个网页的所有入链传递的 PageRank 值汇总,就够成了这些页面的 PageRank 值,从而参与排序。3.2 工具介绍本爬虫的实现以及运行都是基于 Eclipse 的,Eclipse 安装Pydev 插件后即配置好 Python 语言的开发环境,在解析模块还使用了 BeautifulSoup 插件。下面介绍主要用到的这三种工具:- 7 -3.2.1 EclipseEclipse 是一个开源的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。本文通过安装 Pydev 插件构建 Python 语言的开发环境。3.2.2 Python 语言Python 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum 于 1989 年发明,第一个公开发行版发行于1991 年。Python 的设计哲学是“优雅、明确、简单” 。其特点是易读、易维护以及强制用空白符作为语句缩进,使得不好的编程习惯(例如 if 语句下一行不向右缩进)都不能通过编译。Python 具有丰富和强大的库,它常被称为胶水语言,能够把用其它语言制作的各种模块(尤其是 C\C++)很轻松的联结在一起。需要注意的是在使用某些扩展类库的时候可能需要考虑平台问题,某些可能不提供跨平台的实现。Python 具有良好的可扩展性。Python 还可以以交互模式运行,比如主流操作系统Linux、 Mac、Windows 都可以直接在命令模式下直接运行Python 交互环境。直接下达操作指令即可实现交互操作。Python 目前已经公布了 Python3.x 版本,本爬虫使用Python27 编写。- 8 -3.2.3 BeautifulSoupBeautifulSoup 是 Python 的一个插件,用于解析 HTML 和XML,是替代正则表达式的利器,本爬虫使用 BeautifulSoup4。BeautifulSoup 会产生一个 DOM 树,尽可能和源文档的含义内容一致,这种措施通常能够满足搜集数据的需求。BeautifulSoup 下载地址为:http://www.crummy.com/software/BeautifulSoup 安装过程如下:(1)下载完成后解压缩。(2)打开命令提示符,将工作目录切换到 BS 的目录下。(3)运行 setup.py build。(4)运行 setup.py install。(5)输入 Python,进入 Python 模块,然后输入 from bs4 import BeautifulSoup 检测是否成功。3.3 实现主要含有主调度函数、URL 管理、HTML 下载器、HTML解析器、HTML 输出这五个模块。系统结构图如下:- 9 -图 3-2 爬虫功能结构图下面是主要的调度函数:from baike_spider import url_manager, html_downloader, html_parser,html_outputerclass SpiderMain(object):def __init__(self):self.urls = url_manager.UrlManager()self.downloader = html_downloader.HtmlDownloader()self.parser = html_parser.HtmlParser()self.outputer = html_outputer.HtmlOutputer()def craw(self, root_url):count = 1self.urls.add_new_url(root_url)while self.urls.has_new_url():try:new_url = self.urls.get_new_url()print 'craw %d : %s' %(count,new_url) html_cout = self.downloader.download(new_url)new_urls, new_data = self.parser.parse(new_url,html_cout)self.urls.add_new_urls(new_urls)self.outputer.collect_data(new_data)if count == 20:- 10 -breakcount = count + 1except:print 'carw failed' self.outputer.output_html()if __name__==“__main__“:root_url = “http://baike.baidu.com/view/21087.htm“obj_spider = SpiderMain()obj_spider.craw(root_url)3.4 运行结果本次测试爬取百度百科中 Python 的 20 条相关词条。由于时间以及技术有限,尚不能完美运行,爬虫在爬取到主页面后就会停止运行,错误还没有找到,以后会尽量完善。4 算法部分4.1 获取数据的三种途径- 11 -4.1.1 通过新浪微博模拟登录获取数据模拟登录功能的实现方式是读取包含账号信息的配置文件,模拟网页登录新浪微博的过程,获取访问新浪微博页面时所需要的有效认证信息,即需要保存在本地的 cookie 信息。程序向新浪服务器发送经过加密的用户名(username) 和密码 (password),服务器从传递的 URL 参数中提取字符串并解密得到原用户名和密码。其中对 username 和 password 的加密是模拟登录过程中的关键步骤。对 username 进行 Base64 编码得到用户名的加密结果。但 password 的加密过程比较复杂。首先利用 HttpClient 对象访问新浪服务器获取服务器时间(servertime)、一个随机生成的字符串(nonce)2 个参数。然后利用新浪服务器给出的 pubkey 和 rsakv 值创建 RSA 算法公钥(key)。将 servertime,nonce 和 password 按序拼接成新的字符串 message,使用 key 对 message 进行 RSA 加密并将加密结果转化为十六进制,得到 password 的加密结果。将加密后的用户名和密码一起作为请求通行证的 URL 请求的报头信息传递给新浪服务器,新浪服务器经过验证无误后,返回登录成功信息,HttpClient 保存有效的 Cookies 值。模拟登录成功后,程序向服务端请求数据获取任务,否则结束本次任务。4.1.2 通过调用微博 API 接口获取用户微博数据利用微博系统的 SDK 获取数据的工作流程,调用 API 需要通过用户身份的鉴权,目前使用 OAuth 鉴权。其优点是数据准- 12 -确快捷,很少因微博平台的变化而变化,但缺点是接口提供商限制的因素多且不稳定。(1)新浪微博开放平台目前,新浪微博提供了相应的 API 供本系统使用,通过调用这些 API,本系统可以获取如微博内容、用户关系、用户信息、用户标签等信息。要使用这些 API,需要先创建一个自己的应用,然后进行认证,认证完成后即可使用 API 获取新浪微博的数据了。但是现在新浪微博加大了对 API 接口的限制,只有公司用户才可以申请微服务应用(里面有访问数据的接口),这对个人数据采集的实践造成较大困难。(2)微博 JAVA SDK微博 JAVA SDK 是新浪为 JAVA 开发者提供的专门用于访问新浪微博的接口,通过微博 JAVA SDK,第三方微博应用可以很方便的访问微博提供的 API 接口,获取到需要的信息。微博 JAVA SDK 的整体架构包含如下几个:src:weibo4j 封装了大部分接口,包括授权,timeline ,用户等常见接口 ;weibo4j.http 包含了 https 请求的封装;weibo4j.model 包含了 user,status 等实体类 ;weibo4j.org.json 完成 json 解析的各种方法; weibo4j.util 包含了请求 api 接口时候所需要的工具类; examples:里面包含了封装接口的各个测试。(3)微博应用创建首先使用自己的新浪微博账号进行登陆,如果没有的话,就要先注册,然后再登陆到新浪的微博开放平台。成功登陆以后,- 13 -首先要填写个人的基本信息,填写了个人信息后,就可以获得开发者的身份,这时就可以创建应用了。创建应用时,除了填写应用的基本信息,包括名称、用途、应用网址以外,最重要的是应用的类型。站内应用可以获得更高的权限和更高的 API 调用频率。创建完站内应用后,应用将会获得一个 App Key 和一个Secret Key,这两个 Key 是以后会用到的。其中 App Key 是应用在开放平台中的身份标志,每次应用要调用 API 时,都需要提供 App Key 和使用人账号,这样方便新浪统计某个应用的使用频率,这样既能保证某个应用不能频繁调用 API,避免出现恶意攻击新浪的事件,另一方面,新浪也可以通过使用频率来进行热门应用的推荐。而 App Secret 是新浪微博分配给某个应用的密码,这是为了保证其真实性,这个是唯一的,这样可以防止其他应用冒充某个热门应用。(4)微博内容获取总体的大致流程如图 4-1。- 14 -创建微博开放平台的应用获取 A p p k e y 和 A p p s e c r e tO A u t h 2 . 0 认证获取 A c c e s s T o k e n调用 A P I 接口A P I 文档A P I 接口代码类构造相应 A P I的参数返回 J S O N 数据流关键词匹配信息显示与保存图 4-1 通过微博 API 接口获取数据大致流程在采集过程中,首先需要的是获取新浪微博的身份验证,即申请 Access Token 码,从而获取对新浪微博开发的权限。进行身份验证以后,就可以开始对新浪微博进行开发了。在调用 API接口 Timeline 获得授权用户所有的微博信息以后,就可以通过输入关键词对微博信息进行关键词匹配,如果匹配成功,就将微博信息中的 id 和微博内容显示在框架并以 txt 文件的形式保存下来。由于新浪微博对 API 接口调用的次数和频率有限制,一旦达到限制, 系统将等待几分钟后才能进行采集。4.2 基于用户的协同过滤算法- 15 -4.2.1 集体智慧和协同过滤集体智慧是指在大量的人群的行为和数据中收集答案,帮助你对整个人群得到统计意义上的结论,这些结论是我们在单个个体上无法得到的,它往往是某种趋势或者人群中共性的部分。协同过滤是利用集体智慧的一个典型方法。要理解什么是协同过滤 (Collaborative Filtering, 简称 CF),首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐, 而我们一般更倾向于从口味比较类似的朋友那里得到推荐。这就是协同过滤的核心思想。协同过滤一般是在海量的用户中发掘出一小部分和你品位比较类似的,在协同过滤中,这些用户成为邻居,然后根据他们喜欢的其他东西组织成一个排序的目录作为推荐给你。如图 4-2 所示,基于用户的协同过滤算法示意图。- 16 -图 4-2 基于用户的协同过滤算法示意图4.2.2 深入协同过滤核心首先,要实现协同过滤,需要一下几个步骤:收集用户偏好;找到相似的用户或物品;计算推荐。(1)收集用户偏好从用户的行为和偏好中发现规律,并基于此进行推荐,所以如何收集用户的偏好信息成为系统推荐效果最基础的决定因素。用户有很多种方式向系统提供自己的偏好信息,比如:评分,投票,转发,点赞,评论,收藏,点击流,页面停留时间等等。用户行为都会多于一种,那么如何组合这些不同的用户行为- 17 -呢 ?基本上有如下两种方式。(1)将不同的行为分组一般可以分为点赞和评论、转发,然后基于不同的用户行为,计算不同用户或者物品的相似度。(2)不同行为产生的用户喜好对它们进行加权对不同行为产生的用户喜好进行加权,然后求出用户对物品的总体喜好。好了,当我们收集好用户的行为数据后,还要对数据进行预处理,最核心的工作就是减噪和归一化。减噪: 因为用户数据在使用过程中可能存在大量噪音和误操作,所以需要过滤掉这些噪音。归一化:不同行为数据的取值相差可能很好,例如用户的查看数据肯定比购买数据大得多。通过归一化,才能使数据更加准确。(2)找到相似的用户或物品当已经对用户行为进行分析得到用户喜好后,我们可以根据用户喜好计算相似用户和物品,然后基于相似用户或者物品进行推荐。关于相似度的计算,现有的几种基本方法都是基于向量(Vector)的,其实也就是计算两个向量的距离,距离越近相似度越大。在推荐的场景中,在用户 - 物品偏好的二维矩阵中,我们可以将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度,或者将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度。下面我们详细介绍几种常用的相似度计算方法:欧几里德距离(Euclidean Distance)- 18 -最初用于计算欧几里德空间中两个点的距离,假设 x,y 是 n 维空间的两个点,它们之间的欧几里德距离是:𝑑(𝑥,𝑦)=(∑(𝑥𝑖‒𝑦𝑖)2)可以看出,当 n=2 时,欧几里德距离就是平面上两个点的距离。当用欧几里德距离表示相似度,一般采用以下公式进行转换:距离越小,相似度越大。皮尔逊相关系数(Pearson Correlation Coefficient)皮尔逊相关系数一般用于计算两个定距变量间联系的紧密程度,它的取值在 [-1,+1] 之间。当取值大于 0 时表示两个变量是正相关的,即一个变量的值越大,另一个变量的值也会越大;当取值小于 0 时表示两个变量是负相关的,即一个变量的值越大,另一个变量的值反而会越小。sx, sy 是 x 和 y 的样品标准偏差。𝑝(𝑥,𝑦)=∑𝑥𝑖𝑦𝑖‒𝑛𝑥𝑦(𝑛‒1)𝑠𝑥𝑠𝑦- 19 -4.3 算法实现/** * @return double * @param pm1 * @param pm2 * @Description 获取两个用户之间的皮尔逊相似度,相关系数的绝对值越大,相关度越大 */ public static double getUserSimilar(Map pm1, Map pm2) { int n = 0;// 数量 n int sxy = 0;// Σxy=x1*y1+x2*y2+xn*yn int sx = 0;// Σx=x1+x2+xn int sy = 0;// Σy=y1+y2+.yn int sx2 = 0;// Σx2=(x1)2+(x2)2+(xn)2 int sy2 = 0;// Σy2=(y1)2+(y2)2+(yn)2 for (Entry pme : pm1.entrySet()) { String key = pme.getKey(); Integer x = pme.getValue(); Integer y = pm2.get(key); if (x != null sxy += x * y; sx += x; sy += y; sx2 += Math.pow(x, 2); sy2 += Math.pow(y, 2); } } // p=(Σxy-Σx*Σy/n)/Math.sqrt((Σx2-(Σx)2/n)(Σy2-(Σy)2/n)); - 20 -double sd = sxy - sx * sy / n; double sm = Math.sqrt((sx2 - Math.pow(sx, 2) / n) * (sy2 - Math.pow(sy, 2) / n)); return Math.abs(sm == 0 ? 1 : sd / sm); } /** * @return double * @param pm1 * @param pm2 * @Description 获取两个用户之间的欧几里得距离,距离越小越好 */ public static double getEuclidDistance(Map pm1, Map pm2) { double totalscore = 0.0; for (Entry test : pm1.entrySet()) { String key = test.getKey(); Integer a1 = pm1.get(key); Integer b1 = pm2.get(key); if (a1 != null totalscore += Math.abs(a); } } return Math.sqrt(totalscore); } /** * @return String * @param simUserObjMap * @param simUserSimMap *@Description 根据相关系数得到推荐物品 */ public static String getRecommend(Map simUserObjMap, Map simUserSimMap) { Map objScoreMap = new HashMap(); - 21 -for (Entry simUserEn : simUserObjMap.entrySet()) { String user = simUserEn.getKey(); double sim = simUserSimMap.get(user); for (Entry simObjEn : simUserEn.getValue().entrySet()) { double objScore = sim * simObjEn.getValue(); String objName = simObjEn.getKey(); if (objScoreMap.get(objName) == null) { objScoreMap.put(objName, objScore); }else { double totalScore = objScoreMap.get(objName); objScoreMap.put(objName, totalScore + objScore); } } } List enList = new ArrayList(objScoreMap.entrySet()); Collections.sort(enList, new Comparator() { public int compare(Map.Entry o1, Map.Entry o2) { Double a = o1.getValue() - o2.getValue(); if (a == 0) { return 0; }else if (a 0) { return 1; }Else{ return -1; } } }); return enList.get(enList.size() - 1).getKey(); - 22 -} } 简单测试结果:图 4-3 结果示意图- 23 -结论这一次我们的题目是新课题,对于本科生的我们真的难度很大。社交网络是当今互联网研究前沿。最新技术一直是专家学者保持着。网上的资料很少。而我们又没有这方面的基础。因此对我们做这次课程设计造成很多困难。不过,通过这次课程设计实践,我们了解了网络爬虫的原理流程,细致研究了基于用户的协同过滤算法,让我们对社交网络数据采集又有了新的认识。数据挖掘是大数据时代最常提及的。若我们以后从事这方面工作,这次课程设计为我们提供了良好的开端。- 24 -参考文献[1] 黄延炜,刘嘉勇.新浪微博数据获取技术研究[J].信息安全与通信保密,2013,(6);71-73.[2] 邓夏玮.基于社交网络的用户行为研究[D]. 北京;北京交通大学,2012.[3] Mark Lutz.Python 学习手册(第 3 版),2009.[4] 罗刚.自己动手写网络爬虫,2010.
展开阅读全文
  微传网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
0条评论

还可以输入200字符

暂无评论,赶快抢占沙发吧。

关于本文
本文标题:社交网络数据采集算法的设计(软件工程课程设计报告).doc
链接地址:https://www.weizhuannet.com/p-10039279.html
微传网是一个办公文档、学习资料下载的在线文档分享平台!

网站资源均来自网络,如有侵权,请联系客服删除!

 网站客服QQ:80879498  会员QQ群:727456886

copyright@ 2018-2028 微传网络工作室版权所有

     经营许可证编号:冀ICP备18006529号-1 ,公安局备案号:13028102000124

收起
展开