看了《》后难免心痒,动了要分析合肥餐饮业的念头,因此特地写了爬取了合肥的大众点评数据。分析数据库我并没有采用 MySQL 而是用的 MongoDB,是因为爬取的数据存在字段缺失的情况(schema 不一致)。
不同于 MySQL,MongoDB 是一种 Schema-less 的 NoSQL 数据库;与 ElasticSearch 类似,最小存储单元 Document 为 json object。MySQL 与 MongoDB 的基本概念:
MySQL | MongoDB |
---|---|
DB | DB |
Table | Collection |
Row | Document |
Column | Field |
Joins | Embedded documents, linking |
MongoDB 不支持 collection 之间 join 操作,所以应存储待分析的 join 后的宽表。同时,MongoDB 具有灵活的数据模型及可扩展的 Schema,支持前后 Document 的 schema 不一致。
Node.js 将爬取的 json 数据写入 MongoDB,在写之前对数据做了清洗过滤——将人均价格太离谱的餐馆给剔除掉了:
- var MongoClient = require('mongodb').MongoClient;
- var fs = require('fs');
- // Connection URL
- var url = 'mongodb://<user>:<passwd>@<host1>:<port1>,<host2>:<port2>/<db>';
- var insertDocuments = function(db, docs, callback) {
- // Get the documents collection
- var collection = db.collection('dianping');
- // Insert documents
- collection.insertMany(docs,
- function(err, result) {
- console.log('Inserted', result.result.n, 'documents into the collection');
- callback(result);
- });
- };
- var array = fs.readFileSync('data1.json').toString().split('\n').filter(function(line) { // filter empty line
- return line != '';
- }).map(function(line) {
- return JSON.parse(line);
- }).map(function(doc) {
- doc.taste = parseFloat(doc['taste']);
- doc.surrounding = parseFloat(doc['surrounding']);
- doc.service = parseFloat(doc['service']);
- return doc;
- }).filter(function(doc) { // filter dirty data
- return doc.price == '' || (doc.price >= 3 && doc.price <= 800)
- });
- MongoClient.connect(url,
- function(err, db) {
- var docs = array;
- console.log("Connected successfully to server");
- insertDocuments(db, docs,
- function() {
- db.close();
- });
- });
Diver 用的是的,共计写入 4979 家商户。
价格最贵的 10 家餐厅:
- db.dianping.find({
- $where: "this.price != ''"
- },
- {
- id: 1,
- name: 1,
- branchName: 1,
- price: 1,
- star: 1,
- taste: 1,
- surrounding: 1,
- service: 1,
- region: 1,
- _id: 0
- }).sort({
- price: -1
- }).limit(10)
id | 商家名 | 分店名 | 价格 | 评级 | 商圈 | 口味 | 环境 | 服务 |
---|---|---|---|---|---|---|---|---|
32332470 | 锅德港式肥牛海鲜火锅 | 499 | 4.5 | 三里庵 | 8.8 | 9 | 8.9 | |
56818450 | 万达威斯汀酒店思悦兹 | 436 | 3.5 | 包河区 | 7.4 | 7.7 | 7.4 | |
3180424 | 祥记燕鲍翅餐厅 | 古井店 | 427 | 3.5 | 长江东路 | 7.2 | 7.2 | 7.3 |
57634649 | 吉利亚特海洋餐厅 | 395 | 3.5 | 三里庵 | 7.6 | 8.6 | 8 | |
24757164 | 王品牛排 | 合肥万象城店 | 375 | 5 | 华润万象城 | 9.2 | 9.3 | 9.3 |
5666720 | 王品牛排 | 合肥银泰店 | 373 | 5 | 淮河路步行街 | 9.1 | 9.3 | 9.3 |
26976035 | 白金汉爵大酒店餐厅 | 366 | 4 | 滨湖世纪城 | 8.2 | 9 | 8 | |
13754750 | 恒悦国际外商俱乐部酒店餐厅 | 366 | 3.5 | 天柱路 | 7.3 | 7.3 | 7.2 | |
23497952 | 绿地福朋喜来登酒店 | 聚味中餐厅 | 300 | 4 | 黄望潜 | 8 | 8.8 | 8.1 |
19630875 | 富山怀石料理 | 253 | 4 | 1912 街区 | 8.2 | 8.8 | 8.4 |
从上面可以看出,价格贵不一定代表口味好,贵的大部分是酒店餐厅。
最好吃的 10 家餐馆:
- db.dianping.find({},
- {
- id: 1,
- name: 1,
- branchName: 1,
- price: 1,
- star: 1,
- taste: 1,
- surrounding: 1,
- service: 1,
- region: 1,
- _id: 0
- }).sort({
- taste: -1
- }).limit(10)
id | 商家名 | 分店名 | 价格 | 评级 | 商圈 | 口味 | 环境 | 服务 |
---|---|---|---|---|---|---|---|---|
19338040 | 恳的妙手海鲜火锅 | 139 | 5 | 马鞍山南路 | 9.3 | 9.3 | 9.3 | |
5641240 | 蜀王涮涮锅 | 长江西路店 | 57 | 5 | 长江西路华联 | 9.3 | 9.2 | 9.3 |
6228284 | 海底捞火锅 | 之心城店 | 102 | 5 | 三里庵 | 9.2 | 9.2 | 9.3 |
18067370 | 海底捞火锅 | 银泰中心店 | 103 | 5 | 淮河路步行街 | 9.2 | 9.2 | 9.3 |
48232229 | 蜀王火锅那些年 | 65 | 5 | 三里庵 | 9.2 | 9.3 | 9.3 | |
24757164 | 王品牛排 | 合肥万象城店 | 375 | 5 | 华润万象城 | 9.2 | 9.3 | 9.3 |
14909570 | 海底捞 | 蒙城路店 | 100 | 5 | 白水坝 | 9.2 | 9.2 | 9.2 |
57701010 | 福记蒸汽海鲜 | 100 | 5 | 元一广场 | 9.2 | 9 | 9.2 | |
5458106 | 川锅一号 | 75 | 5 | 三孝口 | 9.2 | 9.2 | 9.3 | |
38306310 | 吞馋 · 夜食速递 | 77 | 5 | 银泰城 | 9.2 | 9.2 | 9.3 |
最好吃排行榜中火锅类的餐馆占了 8 个,合肥人是有多喜欢吃火锅!
"三九" 餐厅,即口味、服务、环境评分都在 9.0(包含 9.0)之上的餐厅:
- db.dianping.find({
- taste: {
- $gt: 9
- },
- surrounding: {
- $gt: 9
- },
- service: {
- $gt: 9
- }
- },
- {
- id: 1,
- name: 1,
- branchName: 1,
- price: 1,
- star: 1,
- taste: 1,
- surrounding: 1,
- service: 1,
- region: 1,
- _id: 0
- }).sort({
- taste: -1
- })
id | 商家名 | 分店名 | 价格 | 评级 | 商圈 | 口味 | 环境 | 服务 |
---|---|---|---|---|---|---|---|---|
19338040 | 恳的妙手海鲜火锅 | 139 | 5 | 马鞍山南路 | 9.3 | 9.3 | 9.3 | |
5641240 | 蜀王涮涮锅 | 长江西路店 | 57 | 5 | 长江西路华联 | 9.3 | 9.2 | 9.3 |
6228284 | 海底捞火锅 | 之心城店 | 102 | 5 | 三里庵 | 9.2 | 9.2 | 9.3 |
18067370 | 海底捞火锅 | 银泰中心店 | 103 | 5 | 淮河路步行街 | 9.2 | 9.2 | 9.3 |
48232229 | 蜀王火锅那些年 | 65 | 5 | 三里庵 | 9.2 | 9.3 | 9.3 | |
24757164 | 王品牛排 | 合肥万象城店 | 375 | 5 | 华润万象城 | 9.2 | 9.3 | 9.3 |
14909570 | 海底捞 | 蒙城路店 | 100 | 5 | 白水坝 | 9.2 | 9.2 | 9.2 |
5458106 | 川锅一号 | 75 | 5 | 三孝口 | 9.2 | 9.2 | 9.3 | |
38306310 | 吞馋 · 夜食速递 | 77 | 5 | 银泰城 | 9.2 | 9.2 | 9.3 | |
8690811 | 新辣道鱼火锅 | 蒙城路华联店 | 72 | 5 | 双岗 | 9.2 | 9.2 | 9.2 |
19659077 | 煲王粤菜餐厅 | 83 | 5 | 黄望潜 | 9.1 | 9.1 | 9.1 | |
58826504 | 海底捞火锅 | 潜山路银泰城店 | 100 | 5 | 蜀山区 | 9.1 | 9.2 | 9.1 |
66109066 | 海银海记潮汕牛肉火锅 | 104 | 5 | 1912 街区 | 9.1 | 9.2 | 9.2 | |
64050497 | 花庭里成都火锅 | 112 | 5 | 市府广场 | 9.1 | 9.3 | 9.1 | |
27375462 | 晋家门 | 华润万象城店 | 63 | 5 | 华润万象城 | 9.1 | 9.1 | 9.2 |
5666720 | 王品牛排 | 合肥银泰店 | 373 | 5 | 淮河路步行街 | 9.1 | 9.3 | 9.3 |
45300772 | 大卫壹番屋 | 宿州路店 | 37 | 5 | 淮河路步行街 | 9.1 | 9.3 | 9.3 |
24912528 | 新石器烤肉 | 合肥万象城店 | 66 | 5 | 华润万象城 | 9.1 | 9.1 | 9.1 |
65696913 | 百辣归川重庆火锅 | 79 | 5 | 蜀山区 | 9.1 | 9.2 | 9.1 | |
17923508 | 花涧堂云南石锅鱼 | 90 | 5 | 银泰城 | 9.1 | 9.2 | 9.2 | |
22029637 | 大鮨寿司 | 合家福店 | 55 | 5 | 马鞍山南路 | 9.1 | 9.2 | 9.1 |
8931258 | 豆蔻餐厅. 电影主题店 | 四牌楼店 | 55 | 5 | 淮河路步行街 | 9.1 | 9.1 | 9.1 |
56903863 | 一品焖锅 | 万达店 | 76 | 5 | 包河区 | 9.1 | 9.2 | 9.2 |
559223 | 蜀王火锅 | 金寨路店 | 62 | 5 | 中科大 | 9.1 | 9.1 | 9.1 |
32302396 | 棒约翰比萨 | 合肥港汇店 | 76 | 5 | 黄望潜 | 9.1 | 9.2 | 9.1 |
3707974 | 港鼎汇香港时尚火锅料理 | 阜南路店 | 107 | 5 | 城隍庙 | 9.1 | 9.2 | 9.1 |
572662 | 蜀王火锅 | 长江东路店 | 71 | 5 | 长江东路 | 9.1 | 9.2 | 9.2 |
20897019 | 锅吧回转小火锅 | 18 | 5 | 三里庵 | 9.1 | 9.1 | 9.1 |
"三九" 餐厅排行榜的人均价格在¥100 上下,可以看出合肥餐饮业的价格保持在相对良心的水平。
分店最多的前 15 家餐厅:
- db.dianping.aggregate([{
- $group: {
- _id: {
- name: "$name",
- category: "$category"
- },
- totalBranches: {
- $sum: 1
- }
- }
- },
- {
- $sort: {
- "totalBranches": -1
- }
- },
- {
- $limit: 15
- }])
商家名 | 分类 | 分店数 |
---|---|---|
老乡鸡 | 快餐简餐 | 106 |
仟吉西饼 | 面包西点 | 40 |
采蝶轩 | 面包西点 | 37 |
肯德基 | 快餐简餐 | 36 |
龙门花甲 | 小吃 | 31 |
肥叔锅贴 | 生煎 / 锅贴 | 25 |
艾比客 | 快餐简餐 | 25 |
大脸鸡排 | 小吃 | 24 |
岸香咖啡 | 咖啡厅 | 22 |
必胜客 | 比萨 | 17 |
傣妹火锅 | 更多火锅 | 16 |
豪大大鸡排 | 小吃 | 16 |
星巴克 | 咖啡厅 | 15 |
好利来 | 面包西点 | 14 |
良记卷饼王 | 小吃 | 14 |
在上面连锁店中,快餐简餐、面包西点类占了多数;其中,老乡鸡与采蝶轩是本土品牌。在合肥餐饮业的市场竞争,本土品牌还是占优势的。
最多吃货 Top 15 商圈(商家数量与分类数量):
- db.dianping.aggregate([{
- $match: {
- "region": {
- $not: /.*[区县].*/
- }
- }
- },
- {
- $group: {
- _id: "$region",
- categorys: {
- $addToSet: "$category"
- },
- totalShops: {
- $sum: 1
- }
- }
- },
- {
- $unwind: "$categorys"
- },
- {
- $group: {
- _id: {
- region: "$_id",
- totalShops: "$totalShops"
- },
- categorys: {
- $sum: 1
- }
- }
- },
- {
- $sort: {
- "_id.totalShops": -1
- }
- },
- {
- $limit: 15
- }])
商圈 | 商家数 | 商家分类数 |
---|---|---|
三里庵 | 245 | 44 |
黄望潜 | 176 | 42 |
淮河路步行街 | 162 | 34 |
天鹅湖万达 | 131 | 41 |
包河万达 | 114 | 33 |
滨湖世纪城 | 92 | 30 |
白水坝 | 84 | 33 |
马鞍山南路 | 82 | 32 |
三孝口 | 76 | 28 |
青阳路 | 75 | 30 |
大学城 | 60 | 22 |
明珠广场 | 53 | 20 |
银泰城 | 52 | 26 |
南七里站 | 49 | 22 |
华润万象城 | 48 | 22 |
三里庵拿下了商家数、分类数的双料冠军;但是,在下面的最好吃排行榜上却看不到其踪影了,说明三里庵商圈的餐馆量大却质不高。
最好吃的 Top 15 商圈(平均口味评分):
- db.dianping.aggregate([{
- $match: {
- "region": {
- $not: /.*[区县].*/
- }
- }
- },
- {
- $group: {
- _id: "$region",
- avgTaste: {
- $avg: "$taste"
- },
- avgSurr: {
- $avg: "$surrounding"
- },
- AvgSer: {
- $avg: "$service"
- }
- }
- },
- {
- $sort: {
- "avgTaste": -1
- }
- },
- {
- $limit: 15
- }])
商圈 | 平均口味 | 平均环境 | 平均服务 |
---|---|---|---|
卧牛山街道 | 8.6 | 8.7 | 8.7 |
电子 16 所 | 8.5 | 8.6 | 8.4 |
三河镇 | 8.4 | 8.1 | 8.8 |
华润万象城 | 8.1 | 8.5 | 8.2 |
淮河路步行街 | 8.09 | 8.0 | 8.0 |
天鹅湖万达 | 8.0 | 8.0 | 8.0 |
东风路 | 8 | 7.85 | 7.8 |
元一哈街 | 8 | 7.85 | 7.9 |
人民路 | 7.9 | 8.0 | 7.9 |
阜南路 | 7.9625 | 8.125 | 7.8 |
银泰城 | 7.9 | 8.0 | 7.9 |
一中 | 7.9 | 7.9 | 7.9 |
包河万达 | 7.9 | 8.0 | 7.9 |
颍上路 | 7.9 | 7.93 | 7.8 |
市府广场 | 7.89 | 7.7 | 7.7 |
卧牛山街道拿了头冠,说实在的,我还没去吃过。
来源: http://www.cnblogs.com/en-heng/p/5901394.html