1、 基 于 Python 语 言 的 网 络 数 据 挖 掘 实 验指 导 书电 子 科 技 大 学 信 息 与 软 件 工 程 学 院二 一 四 年 6月一 、 实 验 教 学 目 的 和 要 求 :实 验 目 的 :本 课 程 实 验 旨 在 加 深 学 生 对 于 网 络 大 数 据 挖 掘 的 理 解 , 培 养 学 生 分 析 、 设 计 、实 现 基 于 Python语 言 的 网 络 数 据 挖 掘 算 法 , 掌 握 科 学 的 实 验 方 法 , 为 以 后 其 他专 业 课 的 学 习 打 下 坚 实 的 基 础 。 该 实 验 内 容 采 用 循 序 渐 进 的 方 式 ,
2、 从 Python语言 的 基 本 语 法 入 手 , 在 加 深 学 生 对 于 Python语 言 熟 悉 的 基 础 上 突 出 数 据 挖 掘 应用 。 实 验 提 供 功 能 要 求 , 学 生 自 己 确 定 设 计 方 案 和 需 要 思 考 如 何 设 计 最 优 化 的 算法 , 并 完 成 结 果 记 录 和 分 析 , 充 分 发 挥 学 生 的 创 造 性 和 主 动 性 。实 验 要 求 :了 解 并 掌 握 Python语 言 的 基 本 语 法 、 能 够 使 用 Python读 取 或 写 入 数 据 表 、获 取 并 分 析 网 络 文 本 数 据 、 获 取
3、 并 处 理 图 像 数 据 等 。二 、 Python 开 发 环 境 简 介 :本 课 程 实 验 使 用 的 Python开 发 环 境 为 PythonIDLE, 其 用 户 界 面 图 见 图 1所示 。 IDLE是 开 发 python程 序 的 基 本 集 成 开 发 环 境 , 具 备 基 本 的 IDE的 功 能 , 是Python教 学 的 不 错 的 选 择 。 当 安 装 好 python以 后 , IDLE 就 自 动 安 装 好 了 , 不 需要 另 外 去 找 。 同 时 , 使 用 Eclipse 这 个 强 大 的 框 架 时 IDLE 也 可 以 非 常 方
4、 便 的 调试 Python程 序 。 其 基 本 功 能 包 括 语 法 加 亮 、 段 落 缩 进 、 基 本 文 本 编 辑 、 TABLE键 控 制 、 调 试 程 序 。打 开 Idle 后 出 现 一 个 增 强 的 交 互 命 令 行 解 释 器 窗 口 ( 具 有 比 基 本 的 交 互 命令 提 示 符 更 好 的 剪 切 、 粘 贴 、 回 行 等 功 能 ) 。 除 此 之 外 , 还 有 一 个 针 对 Python 的编 辑 器 ( 无 代 码 合 并 , 但 有 语 法 标 签 高 亮 和 代 码 自 动 完 成 功 能 ) 、 类 浏 览 器 和 调试 器 。 菜
5、 单 为 TK “ 剥 离 ” 式 , 也 就 是 点 击 顶 部 任 意 下 拉 菜 单 的 虚 线 将 会 将 该菜 单 提 升 到 它 自 己 的 永 久 窗 口 中 去 。 特 别 是 “Edit“ 菜 单 , 将 其 “ 靠 ” 在 桌 面 一角 非 常 实 用 。 Idle 的 调 试 器 提 供 断 点 、 步 进 和 变 量 监 视 功 能 。图 1PythonIDLE 界 面 图三 、 实 验 项 目 名 称 及 目 的 要 求 :实 验 项 目 1 Python语 言 的 基 本 语 法 及 简 单 应 用1、 实 验 目 的1) 掌 握 Python语 言 的 基 本 语
6、 法2) 掌 握 Python语 言 中 创 建 模 块 的 方 法3) 了 解 Python语 言 中 定 义 类 及 其 使 用 方 法4) 学 习 使 用 Python语 言 输 出 斐 波 那 契 数 列 的 方 法5) 学 习 使 用 Python语 言 实 现 删 除 一 个 list 里 面 的 重 复 元 素 的 方 法2、 实 验 内 容1) 根 据 Python基 本 语 法 功 能 设 计 出 实 现 输 出 斐 波 那 契 数 列 的 方 法 , 并 比 较 不 同实 现 方 法 的 性 能 。2) 根 据 Python语 言 中 的 排 序 和 循 环 功 能 , 实
7、 现 删 除 一 个 list 里 面 的 重 复 元 素3、 实 验 原 理1) 设 计 输 出 斐 波 那 契 数 列 的 Python程 序 : 首 先 调 用 raw_input输 入 要 打 印 的 斐波 那 契 数 列 的 长 度 , 然 后 把 斐 波 那 契 数 列 存 储 于 一 个 序 列 当 中 , 并 逐 个 打 印 序 列的 元 素 。此 实 验 部 分 实 现 代 码 如 下#通 过 输 入 斐 波 那 契 数 列 的 长 度 打 印 斐 波 那 契 数 列FibonacciUptoNumer = int(raw_input(Please input a Fibon
8、acci Series up toNumber:)n=FibonacciUptoNumerfibs=0,1fornumberinrange(n):fibs.append(fibs-2+fibs-1)2) 设 计 删 除 一 个 list 里 面 的 重 复 元 素 程 序 : 首 先 调 用 List.sort()对 序 列 进 行 排 序 ,然 后 调 用 last =List-1语 句 从 后 向 前 找 出 重 复 的 元 素 , 并 逐 个 打 印 非 重 复 的 元素 。 此 实 验 部 分 实 现 代 码 如 下ifList:List.sort()last=List-1foriin
9、range(len(List)-2,-1,-1):iflast=Listi:delListielse:last=ListiprintList4、 实 验 步 骤1) 设 计 输 出 斐 波 那 契 数 列 的 Python程 序 分 析 实 验 要 求 逐 个 打 印 输 出 斐 波 那 契 数 列 的 元 素 记 录 程 序 代 码 记 录 并 分 析 实 验 结 果2) 设 计 程 序 删 除 一 个 list 里 面 的 重 复 元 素 分 析 实 验 要 求 对 list 进 行 排 序 从 后 向 前 查 找 并 删 除 list 中 的 重 复 元 素 记 录 程 序 代 码 记
10、录 并 分 析 实 验 结 果实 验 项 目 2 使 用 Python 读 写 Excel数 据1、 实 验 目 的1) 强 化 Python程 序 的 设 计 和 编 程 能 力2) 学 习 两 种 读 取 的 Excel 数 据 的 方 法3) 学 习 写 入 Excel 数 据 的 方 法4) 掌 握 如 何 读 写 其 他 格 式 数 据 的 方 法5) 掌 握 如 何 比 较 不 同 读 写 方 法 的 运 算 性 能2、 实 验 内 容1) 用 xlrd模 块 中 的 open_workbook实 现 打 开 Excel 数 据 表 , 并 设 计 使 用 索 引 和名 称 两 种
11、 方 法 读 取 Excel 数 据 , 最 终 写 入 csv文 件 中 。2) 用 datetime模 块 中 的 datetime.now来 计 算 两 种 不 同 的 读 取 方 法 所 用 CPU时 间 ,从 而 比 较 并 分 析 不 同 算 法 的 性 能 。3、 实 验 原 理1) Python语 句 读 取 Excel 表 数 据 时 , 首 先 要 调 用 xlrd模 块 , 然 后 使 用 语 句 data=xlrd.open_workbook(excelFile.xls)打 开 Excel表 格 。当 一 个 Excel 表 格 中 包 含 多 个 Sheet时 , 可
12、 以 通 过 索 引 或 者 名 称 顺 序 获 取 某一 个 Sheet中 的 数 据 。 使 用 的 语 句 分 别 为 table =data.sheet_by_index(0)和 table =data.sheet_by_name(uSheet1)。当 获 取 某 个 Sheet 的 数 据 并 存 储 在 工 作 表 table 后 , 获 取 获 取 整 行 和 整 列 的值 ( 数 组 ) 的 语 句 为 table.row_values(i)和 table.col_values(i), 获 取 行 数 和 列 数 的语 句 为 nrows=table.nrows和 ncols=
13、table.ncols, 循 环 获 取 行 数 据 的 语 句 为 foriinrange(nrows):printtable.row_values(i)。此 实 验 部 分 实 现 代 码 如 下#根 据 索 引 获 取 Excel 表 格 中 的 数 据defexcel_table_byindex(file=abc.xls,colnameindex=0,by_index=0):data=open_excel(file)table=data.sheets()by_indexnrows=table.nrows#行 数colnames= table.row_values(colnameinde
14、x)#某 一 行 数 据list =forrownuminrange(1,nrows):row=table.row_values(rownum)ifrow:app=foriinrange(len(colnames):appcolnamesi=rowilist.append(app)returnlistdefexcel_table_byname(file=abc.xls,colnameindex=0,by_name=abc):data=open_excel(file)table=data.sheet_by_name(by_name)nrows=table.nrows#行 数colnames= t
15、able.row_values(colnameindex)#某 一 行 数 据list =forrownuminrange(1,nrows):row=table.row_values(rownum)ifrow:app=foriinrange(len(colnames):appcolnamesi=rowilist.append(app)returnlist在 该 实 验 中 , 学 生 需 用 前 述 的 Excel 数 据 操 作 语 句 实 现 读 取 某 一 个 Sheet数据 的 功 能 , 并 在 此 基 础 上 , 思 考 如 何 读 取 其 他 格 式 的 数 据 , 记 录 Py
16、thon代 码 ,并 分 析 实 验 结 果 。2) Python语 句 写 入 Excel 表 数 据 时 , 首 先 要 调 用 pyExcelerator模 块 , 然 后 使 用语 句 w=Workbook()和 ws=w.add_sheet(excelFile.xls)创 建 一 个 空 白 的 工 作 表 。在 某 一 个 cell 写 入 数 据 的 语 句 为 ws.write(i,j,string), 而 w.save(mini.xls)实 现 了存 储 写 入 后 的 Excel 文 件 。此 实 验 部 分 实 现 代 码 如 下frompyExceleratorimpo
17、rt*w=Workbook() #创 建 一 个 工 作 簿ws=w.add_sheet(test) #创 建 一 个 工 作 表ws.write(0,0,uestc) #在 1行 1列 写 入 uestcws.write(0,1,Sofrware) #在 1行 2列 写 入 Softwarews.write(1,0,cs) #在 2行 1列 写 入 csw.save(mini.xls) #保 存 至 mini.xls 文 件 中在 该 实 验 中 , 学 生 需 用 前 述 的 Excel 数 据 操 作 语 句 实 现 写 入 某 一 个 Sheet数据 的 功 能 , 并 在 此 基 础
18、 上 , 思 考 如 何 写 入 其 他 格 式 的 数 据 ( 如 csv格 式 ) , 记 录Python代 码 , 并 分 析 实 验 结 果 。3) 比 较 两 种 不 同 的 读 取 Excel 数 据 的 方 法 时 , 需 要 计 算 每 种 方 法 的 运 行 时 间 。首 先 导 入 datetime 模 块 , 并 调 用 datetime.now()函 数 , 记 录 某 一 段 代 码 运 行 前 后的 时 间 点 , 通 过 开 始 和 结 束 的 时 间 点 的 差 值 计 算 出 程 序 运 行 的 时 间 。此 实 验 部 分 实 现 代 码 如 下startt
19、ime=datetime.datetime.now()tables=excel_table_byindex()forrowintables:printrowendtime =datetime.datetime.now()printendtime-starttimestarttime=datetime.datetime.now()tables=excel_table_byname()forrowintables:printrowendtime =datetime.datetime.now()printendtime-starttime在 该 实 验 中 , 学 生 需 用 前 述 的 CPU时
20、间 控 制 语 句 实 现 计 算 某 一 段 代 码 的 运算 时 间 , 并 在 此 基 础 上 , 比 较 并 分 析 两 种 Excel 数 据 读 取 方 法 的 性 能 。 记 录 Python代 码 , 并 分 析 实 验 结 果 。4、 实 验 步 骤1) 设 计 按 名 称 和 按 索 引 读 取 Excel 数 据 的 程 序 分 析 实 验 要 求 按 行 打 印 Excel表 中 的 数 据 记 录 程 序 代 码 记 录 并 分 析 实 验 结 果2) 设 计 写 入 Excel 数 据 的 程 序 分 析 实 验 要 求 按 行 将 数 据 写 入 Excel表 中
21、 记 录 程 序 代 码 记 录 并 分 析 实 验 结 果3) 设 计 计 算 程 序 运 行 时 间 的 程 序 分 析 实 验 要 求 记 录 程 序 代 码 比 较 并 分 析 实 验 结 果 总 结 , 撰 写 实 验 报 告实 验 项 目 3 使 用 Python 实 现 网 络 爬 虫 算 法1、 实 验 目 的1) 强 化 Python程 序 的 设 计 和 编 程 能 力2) 学 习 网 络 爬 虫 算 法 的 原 理3) 学 习 使 用 Python语 言 实 现 网 络 爬 虫 算 法2、 实 验 内 容1) 理 解 网 络 爬 虫 算 法 的 原 理 , 并 设 计 使
22、 用 Python语 言 获 取 网 页 数 据 的 程 序 。2) 用 Python语 言 中 的 threading 和 GetUrl模 块 对 网 站 中 URL进 行 搜 集 。3、 实 验 原 理1) 爬 虫 算 法 原 理 :网 络 爬 虫 ( 又 被 称 为 网 页 蜘 蛛 , 网 络 机 器 人 , 网 页 追 逐 者 ) , 是 一 种 按 照 一定 的 规 则 , 自 动 的 抓 取 万 维 网 信 息 的 程 序 或 者 脚 本 。 很 多 搜 索 引 擎 都 使 用 爬 虫 提供 最 新 的 数 据 , 搜 索 引 擎 利 用 用 户 访 问 过 页 面 的 一 个 副
23、 本 进 行 索 引 , 以 提 供 快 速的 访 问 。 网 络 爬 虫 也 可 以 在 web上 用 来 自 动 执 行 一 些 任 务 , 例 如 检 查 链 接 , 确认 html代 码 ; 也 可 以 用 来 抓 取 网 页 上 某 种 特 定 类 型 信 息 , 例 如 抓 取 电 子 邮 件 地址 。 本 实 验 中 使 用 的 网 络 爬 虫 算 法 是 广 度 优 先 搜 索 (BFS)。 广 度 优 先 搜 索 策 略 是指 在 抓 取 过 程 中 , 在 完 成 当 前 层 次 的 搜 索 后 , 才 进 行 下 一 层 次 的 搜 索 。 有 很 多 研究 将 广 度
24、优 先 搜 索 策 略 应 用 于 聚 焦 爬 虫 中 。 其 基 本 思 想 是 认 为 与 初 始 URL在 一定 链 接 距 离 内 的 网 页 具 有 主 题 相 关 性 的 概 率 很 大 。 另 外 一 种 应 用 是 将 广 度 优 先 搜索 与 网 页 过 滤 技 术 结 合 使 用 , 先 用 广 度 优 先 策 略 抓 取 网 页 , 再 将 其 中 无 关 的 网 页过 滤 掉 。 这 些 方 法 的 缺 点 在 于 , 随 着 抓 取 网 页 的 增 多 , 大 量 的 无 关 网 页 将 被 下 载并 过 滤 , 算 法 的 效 率 将 变 低 。2) Python语
25、 句 在 某 一 个 网 页 上 获 取 数 据 时 , 首 先 要 分 析 网 页 的 HTML源 代 码 ,我 们 以 淘 宝 网 页 中 的 商 品 分 类 (http:/ 例 , 获 取所 有 一 级 类 别 和 二 级 类 别 的 标 题 。本 实 验 中 要 调 用 urllib2 和 sgmllib.SGMLParser 模 块 , 并 使 用 语 句 content =urllib2.urlopen(网 页 URL).read()来 获 取 网 页 的 内 容 。 并 使 用 list.feed(content)语 句将 网 页 内 容 存 入 列 表 , 进 行 处 理 。此
26、 实 验 部 分 实 现 代 码 如 下classListName1(SGMLParser):def_init_(self):SGMLParser._init_(self)self.is_h4=“self.name =defstart_h4(self, attrs):self.is_h4=1defend_h4(self):self.is_h4=“defhandle_data(self, text):ifself.is_h4=1:self.name.append(text)classListName2(SGMLParser):def_init_(self):SGMLParser._init_(s
27、elf)self.is_h5=“self.name =defstart_h5(self, attrs):self.is_h5=1defend_h5(self):self.is_h5=“defhandle_data(self, text):ifself.is_h5=1:self.name.append(text)content=urllib2.urlopen(http:/ 该 实 验 中 , 学 生 需 用 前 述 的 爬 虫 算 法 实 现 语 句 实 现 写 入 读 取 淘 宝 网 页 商 品分 类 标 题 的 功 能 , 并 在 此 基 础 上 , 思 考 如 何 实 现 读 取 其 他
28、网 页 数 据 的 方 法 , 记 录Python代 码 , 并 分 析 实 验 结 果 。3) 在 获 取 网 站 上 的 URL 时 , 需 要 调 用 GetUrl模 块 。 本 实 验 中 通 过 调 用 threading模 块 采 用 多 线 程 算 法 实 现 网 站 URL 的 获 取 。此 实 验 部 分 实 现 代 码 如 下defCraw(self,entryUrl): #这 是 一 个 深 度 搜 索 , 到 g_toDlUrl为 空 时 结 束g_toDlUrl.append(entryUrl)self.logfile.write(Entry:n)self.logfi
29、le.write(entryUrl)depth=0while len(g_toDlUrl)!=0anddepthDepth+str(depth)+:nself.logfile.write(content)i=0while i+g_toDlUrli+nself.logfile.write(content)i+=1classCrawlerThread(threading.Thread):def_init_(self, url,fileName):threading.Thread._init_(self)self.url=url #本 线 程 下 载 的 urlself.fileName=fileN
30、amedefrun(self): #线 程 工 作 下 载 html页 面globalg_mutexglobalg_failedUrlglobalg_dledUrltry:f=urllib.urlopen(self.url)s=f.read()fout=file(self.fileName,w)fout.write(s)fout.close()except:g_mutex.acquire() #线 程 锁 锁 上g_dledUrl.append(self.url)g_failedUrl.append(self.url)g_mutex.release() #线 程 锁 释 放printFaile
31、ddownloadingandsaving,self.urlreturnNone #记 着 返 回 !g_mutex.acquire() #线 程 锁 锁 上g_pages.append(s)g_dledUrl.append(self.url)g_mutex.release() #线 程 锁 释 放在 该 实 验 中 , 学 生 需 用 上 述 网 络 爬 虫 算 法 和 多 线 程 控 制 语 句 实 现 获 取 某 一 网站 所 有 URL 的 程 序 , 并 在 此 基 础 上 , 比 较 并 分 析 采 用 不 同 线 程 数 时 算 法 的 性 能 。记 录 Python代 码 ,
32、并 分 析 实 验 结 果 。4、 实 验 步 骤1) 设 计 某 一 个 网 页 上 获 取 数 据 的 程 序 分 析 实 验 要 求 打 印 网 页 上 获 取 的 数 据 记 录 程 序 代 码 记 录 并 分 析 实 验 结 果2) 设 计 多 线 程 的 获 取 网 站 URL 的 程 序 分 析 实 验 要 求 打 印 网 站 上 相 关 的 URL 比 较 不 同 线 程 数 的 算 法 性 能 记 录 程 序 代 码 记 录 并 分 析 实 验 结 果实 验 项 目 4 使 用 Python 获 取 社 交 网 络 数 据1、 实 验 目 的1) 强 化 Python程 序
33、的 设 计 和 编 程 能 力2) 学 习 社 交 网 络 OAUTH协 议 的 原 理3) 学 习 使 用 Python语 言 获 取 社 交 网 络 数 据2、 实 验 内 容1) 理 解 社 交 网 络 OAUTH 协 议 的 原 理 , 并 学 习 获 取 CONSUMER_KEY、CONSUMER_SECRET、 USER_TOKEN、 USER_SECRET的 方 法 。2) 用 Python 语 言 中 的 Json、 OS、 Linkedin 模 块 对 LinkedIn 网 站 中 联 系 人 名 单进 行 搜 集 。3、 实 验 原 理1) 社 交 网 络 OAUTH协 议
34、 原 理 :OAUTH协 议 为 用 户 资 源 的 授 权 提 供 了 一 个 安 全 的 、 开 放 而 又 简 易 的 标 准 。与 以 往 的 授 权 方 式 不 同 之 处 是 OAUTH的 授 权 不 会 使 第 三 方 触 及 到 用 户 的 帐 号信 息 ( 如 用 户 名 与 密 码 ) , 即 第 三 方 无 需 使 用 用 户 的 用 户 名 与 密 码 就 可 以 申 请 获得 该 用 户 资 源 的 授 权 , 因 此 OAUTH是 安 全 的 。本 实 验 中 Linkedin 网 站 的 OAUTH协 议 是 采 用 HMAC-SHA1加 密 的 。 开 发者 需
35、 要 注 册 LinkedIn 账 户 , 获 得 CONSUMER_KEY( 即 API Key) 和CONSUMER_SECRET。 KEY 跟 SECRET的 使 用 方 式 跟 其 他 一 些 协 议 中 的 公 钥私 钥 的 方 案 相 类 似 , 你 可 以 使 用 你 所 熟 悉 的 编 程 语 言 将 KEY和 SECRET结 合 ,为 你 发 出 的 每 个 请 求 添 加 签 名 , 以 此 来 向 Linkedin开 放 平 台 表 明 自 己 身 份 的 合 法性 。 然 后 根 据 CONSUMER_KEY和 CONSUMER_SECRET获 取 USER_TOKEN
36、和 USER_SECRET。 这 个 步 骤 主 要 有 两 个 目 的 : 第 一 , 告 诉 Linkedin 将 要 做 什么 ; 第 二 , 告 诉 Linkedin 在 callback 里 要 做 什 么 。 此 外 , USER_TOKEN 和USER_SECRET可 以 帮 助 提 供 ACCESSTOKEN。实 现 代 码 如 下 :access_token_url=https:/ =oauth.Client(consumer,token)resp,content=client.request(access_token_url,“POST“)access_token=dict
37、(urlparse.parse_qsl(content)print“AccessToken:“print“-oauth_token=%s“%access_tokenoauth_tokenprint“-oauth_token_secret=%s“%access_tokenoauth_token_secretprintprint“Youmaynowaccessprotectedresourcesusingtheaccesstokensabove.“Print在 该 实 验 中 , 学 生 需 用 前 述 的 OAUTH协 议 原 理 实 现 获 取 Linkedin 社 交 网 络的 ACCESS
38、TOKEN, 并 在 此 基 础 上 , 思 考 如 何 实 现 读 取 其 他 社 交 网 络 (如 新 浪 微博 )ACCESSTOKEN的 方 法 , 记 录 Python代 码 , 并 分 析 实 验 结 果 。2) Python语 句 获 取 社 交 网 站 用 户 信 息 时 , 首 先 要 获 得 ACCESSTOKEN, 然 后调 用 os.path.join 语 句 将 用 户 相 关 信 息 存 储 到 CSV 或 者 XLS 文 件 中 , 最 后 调 用PrettyTable 模 块 打 印 用 户 信 息 表 。此 实 验 部 分 实 现 代 码 如 下#Instan
39、tiatethedeveloperauthenticationclassauth=linkedin.LinkedInDeveloperAuthentication(CONSUMER_KEY,CONSUMER_SECRET, USER_TOKEN, USER_SECRET, RETURN_URL,permissions=linkedin.PERMISSIONS.enums.values()#Passitintotheapp.app=linkedin.LinkedInApplication(auth)#Usetheapp.app.get_profile()importjsonimportoscon
40、nections=app.get_connections()connections_data = os.path.join(“C:/“, “Users“, “ 用 户 名 “, “Desktop“,“save.csv“)f=open(connections_data,w)f.write(json.dumps(connections,indent=1)f.close()fromprettytableimportPrettyTable#pipinstallprettytablept=PrettyTable(field_names=Name,Location)pt.align=lpt.add_row
41、(cfirstName+clastName,clocationname)forcinconnectionsvaluesifc.has_key(location)在 该 实 验 中 , 学 生 需 用 前 述 的 社 交 网 络 信 息 获 取 语 句 实 现 授 权 用 户 的LinkedIn联 系 人 信 息 , 并 在 此 基 础 上 , 思 考 如 何 实 现 获 取 其 他 社 交 网 络 (微 博 )用户 信 息 的 方 法 , 记 录 Python代 码 , 并 分 析 实 验 结 果 。4、 实 验 步 骤1) 设 计 社 交 网 络 授 权 用 户 ACCESSTOKEN的 程
42、 序 分 析 实 验 要 求 记 录 程 序 代 码2) 设 计 社 交 网 络 授 权 用 户 联 系 人 信 息 的 程 序 分 析 实 验 要 求 打 印 授 权 用 户 联 系 人 信 息 导 入 授 权 用 户 联 系 人 的 信 息 记 录 程 序 代 码 记 录 并 分 析 实 验 结 果实 验 项 目 5 使 用 Python 统 计 分 析 社 交 网 络 数 据1、 实 验 目 的1) 强 化 Python程 序 的 设 计 和 编 程 能 力2) 学 习 社 交 网 络 数 据 清 洗 和 数 据 统 计 分 析 的 方 法3) 学 习 使 用 Python语 言 统 计
43、 分 析 社 交 网 络 数 据2、 实 验 内 容1) 学 习 社 交 网 络 中 联 系 人 职 位 、 公 司 、 年 龄 等 信 息 的 数 据 清 洗 和 统 计 分 析 方 法 。2) 用 Python语 言 中 的 Counter、 itemgetter等 模 块 对 LinkedIn网 站 中 联 系 人 名 单信 息 进 行 初 步 的 统 计 分 析 。3、 实 验 原 理1) 数 据 清 洗 :数 据 清 洗 是 指 发 现 并 纠 正 数 据 文 件 中 可 识 别 的 错 误 , 包 括 检 查 数 据 一 致 性 ,处 理 无 效 值 和 缺 失 值 等 。 由 于
44、 数 据 仓 库 中 的 数 据 是 面 向 某 一 主 题 的 数 据 的 集 合 ,这 些 数 据 从 多 个 业 务 系 统 中 抽 取 而 来 而 且 包 含 历 史 数 据 , 这 样 就 避 免 不 了 有 的 数据 是 错 误 数 据 、 有 的 数 据 相 互 之 间 有 冲 突 , 这 些 错 误 的 或 有 冲 突 的 数 据 显 然 是 我们 不 想 要 的 , 称 为 “脏 数 据 ”。 我 们 要 按 照 一 定 的 规 则 把 脏 数 据 清 除 , 这 就 是 数 据清 洗 。 而 数 据 清 洗 的 任 务 是 过 滤 那 些 不 符 合 要 求 的 数 据 ,
45、 将 过 滤 的 结 果 交 给 业 务主 管 部 门 , 确 认 是 否 过 滤 掉 还 是 由 业 务 单 位 修 正 之 后 再 进 行 抽 取 。 不 符 合 要 求 的数 据 主 要 是 有 不 完 整 的 数 据 、 错 误 的 数 据 、 重 复 的 数 据 三 大 类 。本 实 验 中 使 用 的 数 据 来 源 是 Linkedin网 站 中 联 系 人 信 息 , 需 要 清 洗 的 数 据 主要 是 由 于 数 据 名 称 不 统 一 造 成 的 。 例 如 , 联 系 人 公 司 中 很 多 都 带 有 后 缀 Inc., Co.等 , 联 系 人 职 位 中 很 多
46、带 有 Prof.,Dr.等 , 这 些 信 息 在 统 计 时 会 有 干 扰 作 用 。 例 如IBMInc.和 IBM代 表 的 都 是 IBM公 司 , 但 程 序 在 进 行 统 计 分 析 时 会 误 认 为 是 两个 不 同 的 公 司 。实 现 代 码 如 下 :transforms =(, Inc., ),(, Inc, ), (, LLC, ), (, LLP, ), (LLC, ), (Inc., ),(Inc,)csvReader=csv.DictReader(open(CSV_FILE),delimiter=,quotechar=“)contacts=rowforro
47、wincsvReadercompanies=cCompany.strip()forcincontactsifcCompany.strip()!=fori,_inenumerate(companies):fortransformintransforms:companiesi=companiesi.replace(*transform)在 该 实 验 中 , 学 生 需 用 前 述 的 数 据 清 洗 方 法 实 现 对 Linkedin社 交 网 络 联 系 人信 息 进 行 数 据 清 洗 , 并 在 此 基 础 上 , 思 考 如 何 实 现 清 洗 其 他 社 交 网 络 (如 新 浪 微
48、博 )联 系 人 信 息 的 方 法 , 记 录 Python代 码 , 并 分 析 实 验 结 果 。2) Python语 句 分 析 清 洗 后 的 社 交 网 站 联 系 人 信 息 时 , 首 先 要 调 用 Counter模 块语 句 将 联 系 人 相 关 信 息 进 行 统 计 , 并 调 用 PrettyTable 模 块 将 联 系 人 信 息 存 储 在 表中 , 最 后 调 用 print语 句 按 照 降 序 打 印 用 户 信 息 表 。此 实 验 部 分 实 现 代 码 如 下pt=PrettyTable(field_names=Company,Freq)pt.align=c