Hadoop综合大作业 要求:

  1. 用Hive对爬虫大作业产生的文本文件(或者英文词频统计下载的英文长篇小说)词频统计。

  2. 用Hive对爬虫大作业产生的csv文件进行数据分析

1. 用Hive对爬虫大作业产生的文本文件

这里的具体操作步骤如下:

  • 将网页上的歌词段落爬取下来
  • 通过jieba分词后将结果用txt文件保存,
  • 将txt文件放入Hadoop分布式文件系统
  • 使用hive将文件作为表数据导入
  • 使用hive查询统计歌词中单词的出现次数

首先,Python爬虫程序代码如下:

  1. import jieba
  2. import requests
  3. from bs4 import BeautifulSoup
  4. lyrics = ''
  5. headers = {
  6. 'User-Agent': 'User-Agent:*/*'
  7. }
  8. resp = requests.get('http://www.juzimi.com/writer/%E6%96%B9%E6%96%87%E5%B1%B1', headers=headers)
  9. resp.encoding = 'UTF-8'
  10. print(resp.status_code)
  11. soup = BeautifulSoup(resp.text, 'html.parser')
  12. page_url = 'http://www.juzimi.com/writer/%E6%96%B9%E6%96%87%E5%B1%B1?page={}'
  13. page_last = soup.select('.pager-last')
  14. if len(page_last) > 0:
  15. page_last = page_last[0].text
  16. for i in range(0, int(page_last)):
  17. print(i)
  18. resp = requests.get(page_url.format(i), headers=headers)
  19. resp.encoding = 'UTF-8'
  20. soup = BeautifulSoup(resp.text, 'html.parser')
  21. for a in soup.select('.xlistju'):
  22. lyrics += a.text + ' '
  23. # 保留爬取的句子
  24. with open('lyrics.txt', 'a+', encoding='UTF-8') as lyricFile:
  25. lyricFile.write(lyrics)
  26. # 加载标点符号并去除歌词中的标点
  27. with open('punctuation.txt', 'r', encoding='UTF-8') as punctuationFile:
  28. for punctuation in punctuationFile.readlines():
  29. lyrics = lyrics.replace(punctuation[0], ' ')
  30. # 加载无意义词汇
  31. with open('meaningless.txt', 'r', encoding='UTF-8') as meaninglessFile:
  32. mLessSet = set(meaninglessFile.read().split('\n'))
  33. mLessSet.add(' ')
  34. # 加载保留字
  35. with open('reservedWord.txt', 'r', encoding='UTF-8') as reservedWordFile:
  36. reservedWordSet = set(reservedWordFile.read().split('\n'))
  37. for reservedWord in reservedWordSet:
  38. jieba.add_word(reservedWord)
  39. keywordList = list(jieba.cut(lyrics))
  40. keywordSet = set(keywordList) - mLessSet # 将无意义词从词语集合中删除
  41. keywordDict = {}
  42. # 统计出词频字典
  43. for word in keywordSet:
  44. keywordDict[word] = keywordList.count(word)
  45. # 对词频进行排序
  46. keywordListSorted = list(keywordDict.items())
  47. keywordListSorted.sort(key=lambda e: e[1], reverse=True)
  48. # 将所有词频写出到txt
  49. for topWordTup in keywordListSorted:
  50. print(topWordTup)
  51. with open('word.txt', 'a+', encoding='UTF-8') as wordFile:
  52. for i in range(0, topWordTup[1]):
  53. wordFile.write(topWordTup[0]+'\n')

现在将word.txt放入HDFS中并用hive查询统计,命令如下:

  1. hdfs dfs -mkdir temp
  2. hdfs dfs -put news.csv temp
  3. hive
  4. hive>
  5. create database db_temp;
  6. use db_temp;
  7. create table tb_word(word string);
  8. load data inpath '/user/hadoop/temp/word.txt' into table tb_word;
  9. select word, count(1) as num from tb_word group by word order by num desc limit 50;

以上的运行结果截图如下:

2. 用Hive对爬虫大作业产生的csv文件进行数据分析

我这里选择了爬取校园新闻并生产csv文件来分析,首先编写爬虫,主要代码如下:

  1. import requests
  2. from bs4 import BeautifulSoup
  3. from datetime import datetime
  4. import re
  5. import pandas
  6. news_list = []
  7. def crawlOnePageSchoolNews(page_url):
  8. res0 = requests.get(page_url)
  9. res0.encoding = 'UTF-8'
  10. soup0 = BeautifulSoup(res0.text, 'html.parser')
  11. news = soup0.select('.news-list > li')
  12. for n in news:
  13. # print(n)
  14. print('**' * 5 + '列表页信息' + '**' * 10)
  15. print('新闻链接:' + n.a.attrs['href'])
  16. print('新闻标题:' + n.select('.news-list-title')[0].text)
  17. print('新闻描述:' + n.a.select('.news-list-description')[0].text)
  18. print('新闻时间:' + n.a.select('.news-list-info > span')[0].text)
  19. print('新闻来源:' + n.a.select('.news-list-info > span')[1].text)
  20. news_list.append(getNewDetail(n.a.attrs['href']))
  21. return news_list
  22. def getNewDetail(href):
  23. print('**' * 5 + '详情页信息' + '**' * 10)
  24. print(href)
  25. res1 = requests.get(href)
  26. res1.encoding = 'UTF-8'
  27. soup1 = BeautifulSoup(res1.text, 'html.parser')
  28. news = {}
  29. if soup1.select('#content'):
  30. news_content = soup1.select('#content')[0].text
  31. news['content'] = news_content.replace('\n', ' ').replace('\r', ' ').replace(',', '·')
  32. print(news_content) # 文章内容
  33. else:
  34. news['content'] = ''
  35. if soup1.select('.show-info'): # 防止之前网页没有show_info
  36. news_info = soup1.select('.show-info')[0].text
  37. else:
  38. return news
  39. info_list = ['来源', '发布时间', '点击', '作者', '审核', '摄影'] # 需要解析的字段
  40. news_info_set = set(news_info.split('\xa0')) - {' ', ''} # 网页中的 获取后会解析成\xa0,所以可以使用\xa0作为分隔符
  41. # 循环打印文章信息
  42. for n_i in news_info_set:
  43. for info_flag in info_list:
  44. if n_i.find(info_flag) != -1: # 因为时间的冒号采用了英文符所以要进行判断
  45. if info_flag == '发布时间':
  46. # 将发布时间字符串转为datetime格式,方便日后存储到数据库
  47. release_time = datetime.strptime(n_i[n_i.index(':') + 1:], '%Y-%m-%d %H:%M:%S ')
  48. news[info_flag] = release_time
  49. print(info_flag + ':', release_time)
  50. elif info_flag == '点击': # 点击次数是通过文章id访问php后使用js写入,所以这里单独处理
  51. news[info_flag] = getClickCount(href)
  52. else:
  53. news[info_flag] = n_i[n_i.index(':') + 1:].replace(',', '·')
  54. print(info_flag + ':' + n_i[n_i.index(':') + 1:])
  55. print('————' * 40)
  56. return news
  57. def getClickCount(news_url):
  58. click_num_url = 'http://oa.gzcc.cn/api.php?op=count&id={}&modelid=80'
  59. click_num_url = click_num_url.format(re.search('_(.*)/(.*).html', news_url).group(2))
  60. res2 = requests.get(click_num_url)
  61. res2.encoding = 'UTF-8'
  62. click_num = re.search("\$\('#hits'\).html\('(\d*)'\)", res2.text).group(1)
  63. print('点击:' + click_num)
  64. return click_num
  65. print(crawlOnePageSchoolNews('http://news.gzcc.cn/html/xiaoyuanxinwen/'))
  66. pageURL = 'http://news.gzcc.cn/html/xiaoyuanxinwen/{}.html'
  67. res = requests.get('http://news.gzcc.cn/html/xiaoyuanxinwen/')
  68. res.encoding = 'UTF-8'
  69. soup = BeautifulSoup(res.text, 'html.parser')
  70. newsSum = int(re.search('(\d*)条', soup.select('a.a1')[0].text).group(1))
  71. if newsSum % 10:
  72. pageSum = int(newsSum / 10) + 1
  73. else:
  74. pageSum = int(newsSum / 10)
  75. for i in range(2, pageSum + 1):
  76. crawlOnePageSchoolNews(pageURL.format(i))
  77. # with open('news.txt', 'w') as file:
  78. # file.write()
  79. dit = pandas.DataFrame(news_list)
  80. dit.to_csv('news.csv')
  81. print(dit)

因为csv是用逗号分隔,而文章内容有逗号和换行符容易造成影响,所以在爬取数据时做了相应处理,将换行逗号等使用其他代替。爬取后将文件放入HDFS系统,并将第一行的数据删除,这里使用insert语句覆盖原先导入的表即可,然后通过hive查询做出相应操作分析文章作者在什么时候发表的量比较多。

  1. hdfs dfs -put news.csv temp/
  2. hive
  3. hive>
  4. create table tb_news(id string, content string, author string, publish timestamp, verify string, photo string, source string, click int)row format delimited fields terminated by ',';
  5. load data inpath '/user/hadoop/temp/news.csv' overwrite into table tb_news;
  6. insert overwrite table tb_news select * from tb_news where content != 'content';
  7. select time_publish, count(1) as num from (select hour(publish) as time_publish from tb_news) tb_time group by time_publish order by num desc;



根据以上截图的结果可以看出,小编在发布时间大部分都是在0时,我只能说,熬夜不好

Hadoop综合大作业的更多相关文章

  1. 大数据应用期末总评——Hadoop综合大作业

    作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 Hadoop综合大作业 要求: 1.将爬虫大作业产生的csv文件 ...

  2. 【大数据应用期末总评】Hadoop综合大作业

    作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 一.Hadoop综合大作业 要求: 1.将爬虫大作业产生的csv ...

  3. 《Hadoop综合大作业》

    作业要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 我主要的爬取内容是关于热门微博文章“996”与日剧<我要 ...

  4. 菜鸟学IT之Hadoop综合大作业

    Hadoop综合大作业 作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3363 1.将爬虫大作业产生的csv文件上传到HDF ...

  5. 大数据应用期末总评Hadoop综合大作业

    作业要求来源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 1.将爬虫大作业产生的csv文件上传到HDFS 此次作业选取的 ...

  6. Hadoop综合大作业1

    本次作业来源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3363 一.课程评分标准: 分数组成: 考勤 10 平时作业 30 爬 ...

  7. 【大数据应用技术】作业十二|Hadoop综合大作业

    本次作业的要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 前言 本次作业是在<爬虫大作业>的基础上进行的 ...

  8. hadoop 综合大作业

    作业要求来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 本次作业是在期中大作业的基础上利用hadoop和hive技术进行 ...

  9. 大数据应用期末总评(hadoop综合大作业)

    作业要求源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3363 一.将爬虫大作业产生的csv文件上传到HDFS (1)在/usr ...

随机推荐

  1. 你真的了解ASP.NET Core 部署模型吗?

    ----------------------------   以下内容针对 ASP.NET Core2.1,2.2出现IIS进程内寄宿 暂不展开讨论-------------------------- ...

  2. k8s日志收集方案

    k8s日志收集方案 三种收集方案的优缺点: 下面我们就实践第二种日志收集方案: 一.安装ELK 下面直接采用yum的方式安装ELK(源码包安装参考:https://www.cnblogs.com/De ...

  3. 图解:HTTP 范围请求,助力断点续传、多线程下载的核心原理

    题图:by Charles Loyer 一.序 Hi,大家好,我是承香墨影! HTTP 协议在网络知识中占据了重要的地位,HTTP 协议最基础的就是请求和响应的报文,而报文又是由报文头(Header) ...

  4. 微服务(入门一):netcore安装部署consul

    环境准备  vs开发环境:vs2017 consul版本: 1.4.4 netcore版本:2.1 安裝Consul  1.从官网下载consul到本地,选择系统对应的版本进行下载到本地,下载地址:h ...

  5. 使用LXD搭建Web网站

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由独木桥先生 发表于云+社区专栏 介绍 Linux的容器是Linux的一组进程,通过使用Linux内核功能与系统隔离.它是一个类似于虚拟 ...

  6. Mybatis框架的简单运用

    一.配置流程 1.流程示意图(通过XML映射文件实现): 2.流程: 2.1 导入包: 2.1.1 下载包 数据库驱动包(本文以MySQL为例):https://mvnrepository.com/a ...

  7. 14 ,CSS 文字与文本

    1.CSS 中长度与颜色 2.CSS 中的文字属性 3.CSS 中的文本属性 14.1 CSS 中长度与颜色 长度单位 说明 in 英寸 cm 公分 mm 公里 cm 以目前字体高度为单位 ex 以小 ...

  8. 底部导航栏-----FragmentTabHost

    [说明] 1.主界面上添加父容器:FragmentTabHost 属于v4兼容包 需要指定该id为android:id/tabhost,不能修改,表示由android系统来托管这个id. 本身是一个F ...

  9. Redis入门教程(二)

    推荐阅读: Redis入门教程(一)https://www.cnblogs.com/jichi/p/10285346.html 5. Redis 的数据结构 5.1 Redis 数据结构介绍 redi ...

  10. V8引擎的垃圾回收策略

    V8 的垃圾回收策略主要基于分代式垃圾回收机制.所谓分代式,就是将内存空间分为新生代和老生代两种,然后采用不同的回收算法进行回收. 新生代空间 新生代空间中的对象为存活时间较短的对象,大多数的对象被分 ...