赞
踩
本次大数据处理基于Python爬虫与VirtualBox下的Ubuntu系统。
从某美食网站的爬虫来获取广州餐饮店铺数据,数据清洗后再上传至hadoop的hdfs中。
大数据的各种软件安装可以参考此处,林子雨老师的非常清晰仔细~
本次作业使用到的代码以及文件已同步上传到csdn资源处。
本次想要收集的数据是广州市内的部分餐饮店信息。
有时候想找餐馆吃饭,却又不知道在眼花缭乱的餐馆中应该选择哪个,可能花半天选择了一家还踩雷了。不仅如此,外地人若来到广州旅游,也会对餐馆的选择有些许迷茫,不知道应该去哪个商圈觅食。
所以针对这个现象,本次打算收集广州市内的“火锅店”以及“粤菜馆”(选择这两个是因为,火锅算是受众面最广的美食类型,粤菜的广东本地特色)信息,信息内容包括“人均消费”、“店铺类型”、“店铺评分”等等,综合这些信息对餐厅数据进行分析。
因为某众网站为了反爬做了字体解密,爬取起来较为困难,所以本次爬取的是某美食外卖网站。
首先先在美食页面搜索“火锅”关键词,利用开发者工具查看“网络”模块后,查看标头,将请求头、用户id等内容写上,一定要记得换上自己的token;
1. for page in range(0, 1537, 32): 2. time.sleep(2) 3. url = '查看标头' 4. data = { 5. 'uuid': '5d2ce8c8d2144f9da23d.1664875709.1.0.0', 6. 'userid': '509103836', 7. 'limit': '32', 8. 'offset': page, 9. 'cateId': '-1', 10. 'q': '火锅', 11. 'token': '放自己的', 12. } 13. headers = { 14. 'Referer': '填写Referer', 15. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36' 16. } 17. response = requests.get(url=url, params=data, headers=headers)
随后搜索任意一家餐饮的名字,依旧在“网络”模块查看响应,就能看到每部分信息的标签,接下来解析json数据:
1. result = response.json()['data']['searchResult']
2. for index in result:
3. shop_id = index['id']
4. index_url = f'https://www.网站名字.com/meishi/{shop_id}/'
5. dit = {
6. '店铺名称': index['title'],
7. '人均消费': index['avgprice'],
8. '店铺评分': index['avgscore'],
9. '评论人数': index['comments'],
10. '所在商圈': index['areaname'],
11. '店铺类型': index['backCateName'],
12. '详情页': index_url,
13. }
将爬取到的数据存入csv文件中:
1. f = open('GZ_Hotpot.csv', mode='a', encoding='utf-8', newline='')
2.
3. csv_writer = csv.DictWriter(f, fieldnames=[
4. '店铺名称',
5. '人均消费',
6. '店铺评分',
7. '评论人数',
8. '所在商圈',
9. '店铺类型',
10. '详情页',
11. ])
12. csv_writer.writeheader()
13. csv_writer.writerow(dit)
从收集的量来看,数据量中等,两份文件的数据量都在1000条左右,而每一条包含七个类型的信息,总数据量在14000左右。
收集的数据是针对广州市的餐饮收集的餐馆信息,种类包括:“店铺名称”、“人均消费”、“店铺评分”、“评论人数”、“店铺类型”、“所在商圈”、“详情页”。其中,可以从“店铺评分”、“评论人数”判断一间餐饮店的受欢迎程度;而“店铺类型”、“所在商圈”的数据可以方便我们后续进行餐馆信息的分析——比如最受欢迎的是什么类型的火锅,哪个商圈的火锅店最多等等。
这其中的信息有定性数据、定量数据以及定类数据——如“店铺名称”属于定性数据;“人均消费”、“店铺评分”、“评论人数”属于定量数据;“店铺类型”属于定类数据。
从数据的类型判断,“店铺名称”、“店铺类型”、“所在商圈”、“详情页”内的信息都是字符类型的数据,“人均消费”、“店铺评分”、“评论人数”内的信息都是整型数据。
针对餐厅的数据,最重要的就是处理“人均消费”、“店铺评分”、“评论人数”中的数据,因为这三个标签才能反应出大众对于这个店铺的好感度、评价等等,我们需要将一些非常不热门的餐厅删去,做数据清洗处理,保证数据的质量。
首先查看评论人数为0的餐厅:
1. import pandas as pd
2.
3. df = pd.read_csv('GZ_Hotpot.csv', index_col=1, encoding='utf-8')
4. df.head() # head函数默认查看前五行数据
5. # print(f"数据集中一共有{df.shape[0]}条数据")
6.
7. pl = df[df['评论人数'].isin([0])]
8. print(pl)
结果如下:
但是这其中有一些店铺,如“怂重庆火锅厂”是一个非常热门的火锅店(因为去过TT),所以如果将评论人数为0的火锅店全删除是不准确的。
接下来继续看人均消费为0的餐厅:
1. xf = df[df['人均消费'].isin([0])]
2. print(xf)
结果如下:
在表格中查看这些火锅店,会发现有一个店铺评论数非常多(陈记顺和牛肉火锅),只是人均消费为0,这时候就要考虑可能只是美团没有录入这家店铺的人均消费。
同时,还考虑会不会把一些不是火锅的店铺也爬进来了?在简单观察过“店铺类型”中的信息后,发现绝大部分店铺类型都是“xxxx火锅”或者是“串串香”,所以考虑将店铺类型没有包括“锅”和“串”的筛选出来看看是否是火锅店:
1. hg = df[~(df['店铺类型'].str.contains('锅') | df['店铺类型'].str.contains('串'))]
2. print(hg)
结果如下:
经过上面的分析后,最后决定将人均消费为0且评论人数小于10的餐厅和真熙家烤肉、软哩食堂从文件中删除,这样的结果会比较准确,随后保存为新的csv文件:
1. df_2 = df[(df['店铺名称'].str.contains("真熙家") | df['店铺名称'].str.contains("软哩食堂") | ((df['评论人数'] <= 10) & (df['人均消费'].isin([0]))))]
2. print(df_2)
3.
4. df.drop((df_2).index, axis=0, inplace=True)
5. #如果想要保存新的csv文件,则为
6. df.to_csv("data_new.csv", index=False, encoding="utf-8")
粤菜馆的处理也基本同理,这里不做过多的赘述~
经过数据预处理后,留下的餐饮店应该都是平时都会有顾客去光临的店铺。
我们可以使用可视化来对数据预处理的结果进行一个较为直观的感受。
1. # 查看火锅数量最多的前十个商圈
2. df1 = df.groupby('所在商圈')['店铺名称'].count()
3. df1 = df1.sort_values(ascending=True)[-10:]
4. df1 = df1.round(2)
5. a = (
6. Bar(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))
7. .add_xaxis(df1.index.to_list())
8. .add_yaxis("",df1.to_list()).reversal_axis() #X轴与y轴调换顺序
9. .set_global_opts(title_opts=opts.TitleOpts(title="商圈火锅店数量top10",subtitle="数据来源:美团",pos_left = 'center'),
10. xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=14)), #更改横坐标字体大小
11. yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=10)), #更改纵坐标字体大小
12. )
13. .set_series_opts(label_opts=opts.LabelOpts(font_size=12,position='right'))
14. )
15. a.render('a.html')
1. # 不同店铺类型数量
2. df2 = df.groupby('店铺类型')['店铺名称'].count()
3. df2 = df2.sort_values(ascending=False)[:10]
4. df2 = df2.round(2)
5. regions = df2.index.to_list()
6. values = df2.to_list()
7. b = (
8. Pie(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))
9. .add("", list(zip(regions,values)),radius=["40%", "62%"])
10. .set_global_opts(title_opts=opts.TitleOpts(title="不同店铺类型店铺数量",pos_top="7%",pos_left = 'center'))
11. .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}",font_size=14))
12. )
13. b.render('b.html')
可以看到潮汕牛肉火锅还是一如既往地受欢迎~广东地区潮汕火锅确实一家独大,这也可以证明数据没有出错。
1. # 不同店铺类型评分 2. df3 = df.groupby('店铺类型')['店铺评分'].mean() 3. df3 = df3.sort_values(ascending=True) 4. df3 = df3.round(2) 5. df3 = df3.tail(10) 6. c = ( 7. Bar(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE)) 8. .add_xaxis(df3.index.to_list()) 9. .add_yaxis("", df3.to_list()).reversal_axis() #X轴与y轴调换顺序 10. .set_global_opts(title_opts=opts.TitleOpts(title="不同店铺类型评分",subtitle="数据来源:美团",pos_left = 'center'), 11. xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=14)), #更改横坐标字体大小 12. yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=10)), #更改纵坐标字体大小 13. ) 14. .set_series_opts(label_opts=opts.LabelOpts(font_size=12,position='right')) 15. ) 16. c.render('c.html')
可以看到韩式火锅和鸡锅等没有那么容易踩雷!
1. # 不同店铺类型评论人数
2. df4 = df.groupby('店铺类型')['评论人数'].sum()
3. df4 = df4.sort_values(ascending=True)
4. df4 = df4.tail(10)
5. d = (
6. Bar(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))
7. .add_xaxis(df4.index.to_list())
8. .add_yaxis("", df4.to_list()).reversal_axis() #X轴与y轴调换顺序
9. .set_global_opts(title_opts=opts.TitleOpts(title="不同店铺类型评论人数",subtitle="数据来源:美团",pos_left = 'center'),
10. xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=14)), #更改横坐标字体大小
11. yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=10)), #更改纵坐标字体大小
12. )
13. .set_series_opts(label_opts=opts.LabelOpts(font_size=12,position='right'))
14. )
15. d.render('d.html')
依旧潮汕牛肉火锅领跑~看起来广州人第二爱吃的是自助火锅,并且重庆火锅比四川火锅更受欢迎!
此处先使用FileZilla软件将本地的数据文件传输到/home/hadoop下。关于FileZilla的具体使用可以查找建成,非常简单且好用。
导入之后打开hadoop:
通过Web界面查看HDFS集群的状态信息:
(网址:http://localhost:9870) 这是hdfs的web管理页面。
通过./bin/hdfs dfs -put命令传输文件到指定目录下:
记住!!!!要在cd /usr/local/hadoop 路径下进行传输命令的操作。
刷新web网站,可以看到传输成功:
用ls命令查询,也可以看到文件确实存在:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。