Hadoop综合大作业
Hadoop综合大作业 要求:
用Hive对爬虫大作业产生的文本文件(或者英文词频统计下载的英文长篇小说)词频统计。
用Hive对爬虫大作业产生的csv文件进行数据分析
1. 用Hive对爬虫大作业产生的文本文件
这里的具体操作步骤如下:
- 将网页上的歌词段落爬取下来
- 通过jieba分词后将结果用txt文件保存,
- 将txt文件放入Hadoop分布式文件系统
- 使用hive将文件作为表数据导入
- 使用hive查询统计歌词中单词的出现次数
首先,Python爬虫程序代码如下:
import jieba
import requests
from bs4 import BeautifulSoup
lyrics = ''
headers = {
'User-Agent': 'User-Agent:*/*'
}
resp = requests.get('http://www.juzimi.com/writer/%E6%96%B9%E6%96%87%E5%B1%B1', headers=headers)
resp.encoding = 'UTF-8'
print(resp.status_code)
soup = BeautifulSoup(resp.text, 'html.parser')
page_url = 'http://www.juzimi.com/writer/%E6%96%B9%E6%96%87%E5%B1%B1?page={}'
page_last = soup.select('.pager-last')
if len(page_last) > 0:
page_last = page_last[0].text
for i in range(0, int(page_last)):
print(i)
resp = requests.get(page_url.format(i), headers=headers)
resp.encoding = 'UTF-8'
soup = BeautifulSoup(resp.text, 'html.parser')
for a in soup.select('.xlistju'):
lyrics += a.text + ' '
# 保留爬取的句子
with open('lyrics.txt', 'a+', encoding='UTF-8') as lyricFile:
lyricFile.write(lyrics)
# 加载标点符号并去除歌词中的标点
with open('punctuation.txt', 'r', encoding='UTF-8') as punctuationFile:
for punctuation in punctuationFile.readlines():
lyrics = lyrics.replace(punctuation[0], ' ')
# 加载无意义词汇
with open('meaningless.txt', 'r', encoding='UTF-8') as meaninglessFile:
mLessSet = set(meaninglessFile.read().split('\n'))
mLessSet.add(' ')
# 加载保留字
with open('reservedWord.txt', 'r', encoding='UTF-8') as reservedWordFile:
reservedWordSet = set(reservedWordFile.read().split('\n'))
for reservedWord in reservedWordSet:
jieba.add_word(reservedWord)
keywordList = list(jieba.cut(lyrics))
keywordSet = set(keywordList) - mLessSet # 将无意义词从词语集合中删除
keywordDict = {}
# 统计出词频字典
for word in keywordSet:
keywordDict[word] = keywordList.count(word)
# 对词频进行排序
keywordListSorted = list(keywordDict.items())
keywordListSorted.sort(key=lambda e: e[1], reverse=True)
# 将所有词频写出到txt
for topWordTup in keywordListSorted:
print(topWordTup)
with open('word.txt', 'a+', encoding='UTF-8') as wordFile:
for i in range(0, topWordTup[1]):
wordFile.write(topWordTup[0]+'\n')
现在将word.txt
放入HDFS中并用hive查询统计,命令如下:
hdfs dfs -mkdir temp
hdfs dfs -put news.csv temp
hive
hive>
create database db_temp;
use db_temp;
create table tb_word(word string);
load data inpath '/user/hadoop/temp/word.txt' into table tb_word;
select word, count(1) as num from tb_word group by word order by num desc limit 50;
以上的运行结果截图如下:
2. 用Hive对爬虫大作业产生的csv文件进行数据分析
我这里选择了爬取校园新闻并生产csv文件来分析,首先编写爬虫,主要代码如下:
import requests
from bs4 import BeautifulSoup
from datetime import datetime
import re
import pandas
news_list = []
def crawlOnePageSchoolNews(page_url):
res0 = requests.get(page_url)
res0.encoding = 'UTF-8'
soup0 = BeautifulSoup(res0.text, 'html.parser')
news = soup0.select('.news-list > li')
for n in news:
# print(n)
print('**' * 5 + '列表页信息' + '**' * 10)
print('新闻链接:' + n.a.attrs['href'])
print('新闻标题:' + n.select('.news-list-title')[0].text)
print('新闻描述:' + n.a.select('.news-list-description')[0].text)
print('新闻时间:' + n.a.select('.news-list-info > span')[0].text)
print('新闻来源:' + n.a.select('.news-list-info > span')[1].text)
news_list.append(getNewDetail(n.a.attrs['href']))
return news_list
def getNewDetail(href):
print('**' * 5 + '详情页信息' + '**' * 10)
print(href)
res1 = requests.get(href)
res1.encoding = 'UTF-8'
soup1 = BeautifulSoup(res1.text, 'html.parser')
news = {}
if soup1.select('#content'):
news_content = soup1.select('#content')[0].text
news['content'] = news_content.replace('\n', ' ').replace('\r', ' ').replace(',', '·')
print(news_content) # 文章内容
else:
news['content'] = ''
if soup1.select('.show-info'): # 防止之前网页没有show_info
news_info = soup1.select('.show-info')[0].text
else:
return news
info_list = ['来源', '发布时间', '点击', '作者', '审核', '摄影'] # 需要解析的字段
news_info_set = set(news_info.split('\xa0')) - {' ', ''} # 网页中的 获取后会解析成\xa0,所以可以使用\xa0作为分隔符
# 循环打印文章信息
for n_i in news_info_set:
for info_flag in info_list:
if n_i.find(info_flag) != -1: # 因为时间的冒号采用了英文符所以要进行判断
if info_flag == '发布时间':
# 将发布时间字符串转为datetime格式,方便日后存储到数据库
release_time = datetime.strptime(n_i[n_i.index(':') + 1:], '%Y-%m-%d %H:%M:%S ')
news[info_flag] = release_time
print(info_flag + ':', release_time)
elif info_flag == '点击': # 点击次数是通过文章id访问php后使用js写入,所以这里单独处理
news[info_flag] = getClickCount(href)
else:
news[info_flag] = n_i[n_i.index(':') + 1:].replace(',', '·')
print(info_flag + ':' + n_i[n_i.index(':') + 1:])
print('————' * 40)
return news
def getClickCount(news_url):
click_num_url = 'http://oa.gzcc.cn/api.php?op=count&id={}&modelid=80'
click_num_url = click_num_url.format(re.search('_(.*)/(.*).html', news_url).group(2))
res2 = requests.get(click_num_url)
res2.encoding = 'UTF-8'
click_num = re.search("\$\('#hits'\).html\('(\d*)'\)", res2.text).group(1)
print('点击:' + click_num)
return click_num
print(crawlOnePageSchoolNews('http://news.gzcc.cn/html/xiaoyuanxinwen/'))
pageURL = 'http://news.gzcc.cn/html/xiaoyuanxinwen/{}.html'
res = requests.get('http://news.gzcc.cn/html/xiaoyuanxinwen/')
res.encoding = 'UTF-8'
soup = BeautifulSoup(res.text, 'html.parser')
newsSum = int(re.search('(\d*)条', soup.select('a.a1')[0].text).group(1))
if newsSum % 10:
pageSum = int(newsSum / 10) + 1
else:
pageSum = int(newsSum / 10)
for i in range(2, pageSum + 1):
crawlOnePageSchoolNews(pageURL.format(i))
# with open('news.txt', 'w') as file:
# file.write()
dit = pandas.DataFrame(news_list)
dit.to_csv('news.csv')
print(dit)
因为csv是用逗号分隔,而文章内容有逗号和换行符容易造成影响,所以在爬取数据时做了相应处理,将换行逗号等使用其他代替。爬取后将文件放入HDFS系统,并将第一行的数据删除,这里使用insert语句覆盖原先导入的表即可,然后通过hive查询做出相应操作分析文章作者在什么时候发表的量比较多。
hdfs dfs -put news.csv temp/
hive
hive>
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 ',';
load data inpath '/user/hadoop/temp/news.csv' overwrite into table tb_news;
insert overwrite table tb_news select * from tb_news where content != 'content';
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综合大作业的更多相关文章
- 大数据应用期末总评——Hadoop综合大作业
作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 Hadoop综合大作业 要求: 1.将爬虫大作业产生的csv文件 ...
- 【大数据应用期末总评】Hadoop综合大作业
作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 一.Hadoop综合大作业 要求: 1.将爬虫大作业产生的csv ...
- 《Hadoop综合大作业》
作业要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 我主要的爬取内容是关于热门微博文章“996”与日剧<我要 ...
- 菜鸟学IT之Hadoop综合大作业
Hadoop综合大作业 作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3363 1.将爬虫大作业产生的csv文件上传到HDF ...
- 大数据应用期末总评Hadoop综合大作业
作业要求来源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 1.将爬虫大作业产生的csv文件上传到HDFS 此次作业选取的 ...
- Hadoop综合大作业1
本次作业来源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3363 一.课程评分标准: 分数组成: 考勤 10 平时作业 30 爬 ...
- 【大数据应用技术】作业十二|Hadoop综合大作业
本次作业的要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 前言 本次作业是在<爬虫大作业>的基础上进行的 ...
- hadoop 综合大作业
作业要求来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 本次作业是在期中大作业的基础上利用hadoop和hive技术进行 ...
- 大数据应用期末总评(hadoop综合大作业)
作业要求源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3363 一.将爬虫大作业产生的csv文件上传到HDFS (1)在/usr ...
随机推荐
- 哪些类继承了Collection接口
Collection集合的基本结构: 1.Collection接口 Collection是最基本集合接口,它定义了一组允许重复的对象.Collection接口派生了两个子接口Set和List, ...
- 为什么设置overflow为hidden可以清除浮动带来的影响
1.问题起源 在平时的业务开发写CSS中,为了满足页面布局,元素的浮动特性我们用的不能再多了.使用浮动的确能够解决一些布局问题,但是也带了一些副作用影响,比如,父元素高度塌陷,我们有好几种可以清除浮动 ...
- JAVA匿名内部类(Anonymous Classes)
1.前言 匿名内部类在我们JAVA程序员的日常工作中经常要用到,但是很多时候也只是照本宣科地用,虽然也在用,但往往忽略了以下几点:为什么能这么用?匿名内部类的语法是怎样的?有哪些限制?因此,最近,我在 ...
- Java之品优购课程讲义_day06(7)
商品录入[SKU 商品信息]5.1 需求分析 基于上一步我们完成的规格选择,根据选择的规格录入商品的 SKU 信息,当用户选择相应的规格,下面的 SKU 列表就会自动生成,如下图:实现思路:实现思路: ...
- Odoo:全球第一免费开源ERP 人力资源模块操作指南(完美珍藏版)
概述 人力资源管理概述 一般企业里,和人力资源相关的工作有:1)员工合同管理,即员工基本档案管理:2)招聘管理,即岗位及岗位人员补充管理:3)员工薪资计算: 4)员工考勤:5)员工休假管理:6)员工绩 ...
- Windows下docker的安装以及遇到的问题
最近因为业务的需要,需要在本地搭建服务环境测试,不想去安装各种软件,于是就想到了用docker来满足我的需要.由于第一次在Windows下安装(以前一直是在linux下使用,但由于内存等硬件的限制 ...
- gin+gorm
在[环境变量]中添加如下[用户变量]/[系统变量]:GO111MODULE,值为on go mod init目录 在项目中新建文件main.go,并添加测试代码 package main import ...
- mpvue小程序开发之 wx.getUserInfo获取用户信息授权
一.背景 在使用美团的mpvue2.0框架搭建起小程序项目后,做获取用户信息时遇到一些问题:微信小程序更新api后,获取用户信息只能通过button上的绑定方法 来获取用户信息,vue上方法绑定不能直 ...
- 聊聊分布式开发 Spring Cloud
概述 本文章只是简单介绍了微服务开发的一些关键词,如果需要知道具体实现和可以评论留言 我会及时的增加连接写出具体实现(感觉没人看 就没写具体实现). 持续更新中...... SpringCloud和D ...
- Scrapy-redis<数据库篇>
scrapy-redis爬虫数据库连接部分——windows准备做salve,Linux准备做master开展工作 首先处理简单的windows熟悉的环境——安装Redis服务和Redis可视化~可视 ...