大学生都在吃什么——饿了么-松江大学城周边外卖信息的数据分析

国庆回了一趟松江大学城,好吃的真是越来越多了,可惜只有一个胃。回来后突然有了灵感,不如分析看看大学城什么类型的美食最多吧!

为什么选择饿了么这个平台呢,因为当年外卖APP还没有火的时候,我们就是在网页版的饿了么上叫外卖的,也算是一种情怀吧~

数据来源平台:饿了么
地点选择:松江大学城四期
抓取地址https://www.ele.me/place/wtw0tgvd7yr(翻页链接:https://www.ele.me/restapi/shopping/restaurants?geohash=wtw0tgvd7yr&latitude=31.04641&limit=0&longitude=121.19791&offset=24&terminal=web
抓取数据:只抓取了店名(name)和店的口味(flavors)

image.png

分析内容:1、对店名进行分词然后词频统计绘制词云图,因为结巴分词对小吃的分词不是很准确,所以在分词时加入了自己的字典fooddic;
2、对口味进行统计绘制条形图(偷懒没有排序)

爬虫和绘图代码:

# -*- coding: utf-8 -*-
"""
Created on Thu Oct 11 09:05:59 2018

@author: Shirley
"""
import requests
import json
import re
import csv
from collections import defaultdict
import jieba
from wordcloud import WordCloud as wd#词云
from PIL import Image#打开图片,用于词云背景层
import numpy as np#转换图片,用于词云背景层
import matplotlib.pyplot as plt#绘图
from matplotlib.font_manager import FontProperties#中文显示
font = FontProperties(fname=r"D:\anaconda\shirleylearn\cipintongji\simsun.ttf", size=14)#设置中文字体

data = []
restaurants = []
foodtype = []
def Getdata(page):#爬虫

    url = "https://www.ele.me/restapi/shopping/restaurants?geohash=wtw0tgvd7yr&latitude=31.04641&limit=24&longitude=121.19791&offset=%d&terminal=web"%page

    headers = {"accept":"application/json, text/plain, */*",
               "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36",
               "cookie":"登陆后的cookie"}
    html = requests.get(url,headers=headers)

    content = re.findall(r'"flavors":.*?,"next_business_time"',html.text)#用正则获取包含数据的那部分

    for con in content:
        jsonstring = "{" + con.replace(',"next_business_time"',"}")#完善格式,使其成为准确的json格式
        jsonobj = json.loads(jsonstring)
        restaurant_id = jsonobj["id"]
        restaurant_name = jsonobj["name"].encode("gbk","ignore").decode("gbk")
        flavors = jsonobj["flavors"]
        restaurant_type = []
        for f in flavors:#有些flavors中只有一个值,有些有2个,所以要for循环
            restaurant_type.append(f["name"])
        restaurants.append(restaurant_name)#用于后面词云图
        foodtype.append(restaurant_type)#用于后面条形图
        data.append([restaurant_id,restaurant_name,restaurant_type])
    
    with open("elemedata.csv","w",newline="") as f:#保存数据到本地
        writer = csv.writer(f)
        writer.writerow(["restaurant_id","restaurant_name","restaurant_type"])
        for d in data:
            writer.writerow(d)
    
    return restaurants,foodtype#返回值应用到下面2个函数


def Eleme_wordcloud(restaurants):#词云图
    jieba.load_userdict("D:/anaconda/shirleylearn/eleme/fooddic.txt")
    text = ""
    for i in restaurants:
        name = re.sub(r'(.*',"",i)
        name = re.sub(r'\(.*',"",name)
    
        text = text + " " + name

    fenci = jieba.lcut(text)

    wordfrequency = defaultdict(int)
    for word in fenci:
        if word != " ":
            wordfrequency[word] += 1#词频统计
    
    img = Image.open("D:/anaconda/shirleylearn/eleme/bowl.jpg")#打开图片
    myimg = np.array(img)#转换图片

    path = "D:/anaconda/shirleylearn/eleme/simsun.ttf"
    wordcloud = wd(width=1000,height=860,margin=2,font_path=path,background_color="white",max_font_size=100,mask = myimg).fit_words(wordfrequency)#根据词频字典生成词云
    plt.imshow(wordcloud)
    plt.axis('off')#不显示坐标轴 
    plt.savefig('eleme_wordcloud.png', dpi=300)
    plt.clf()# 清除当前 figure 的所有axes,但是不关闭这个 window,所以能继续复用于其他的 plot。否则会影响下面的绘图
    
def Eleme_bar(foodtype):#条形图
    #foodtype的格式:[['盖浇饭', '简餐'],['川湘菜', '简餐'],['日韩料理']]
    wordfrequency2 = defaultdict(int)
    foodtypes = []#放总的类型,有重复项
    types = []#放词频统计后的类型,无重复项
    numbers = []#放词频统计后的词频
    for f in foodtype:
        for t in f:
            foodtypes.append(t)#把每个词汇总到列表中
    for type in foodtypes:
        wordfrequency2[type] += 1#用字典进行词频统计
    for key in wordfrequency2:
        types.append(key)
        numbers.append(wordfrequency2[key])
    
    plt.bar(range(len(types)),numbers)
    plt.xticks(range(len(types)),types,fontproperties = font,fontsize=5,rotation=90)
    plt.savefig('eleme_bar.png', dpi=300)
    plt.show()   
    plt.clf()
    
if __name__ == '__main__':
    for p in range(0,24):
        page = p*24
        restaurants,foodtype = Getdata(page)
    Eleme_wordcloud(restaurants)
    Eleme_bar(foodtype)

运行中遇到的问题:运行界面只显示了条形图,没有显示词云图,不过保存下来的图是正确的。

词云图

eleme_wordcloud.png

看起来在大学城米饭类要比面食类更受欢迎,粥、香锅、麻辣烫也是我读大学的时候经常吃的。
对于鲜花这个词,我查看了原始数据,确实外送的花店比较多,但是距离都较远,实际上大多可以排除在大学城外。

条形图

eleme_bar.png

除简餐外,盖浇饭、地方小吃、米粉面馆是三巨头,甜品、奶茶和炸鸡也是大家的心头好。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容