上海大众点评美食数据可视化

大众点.jpg

本文首先使用python爬取了上海市大众点评735条数据,各商户信息来源于这里

第一步:数据爬取

python网络爬虫功能非常的强大、便捷,这也是我一直选择python进行爬虫的主要原因,对于上海市大众点评美食数据,共有50页,主要通过其链接后面的p1来返回不同页的信息,如http://www.dianping.com/search/category/1/10/p1 返回第一页的数据,http://www.dianping.com/search/category/1/10/p2 返回第二页的数据,依据该原理进行数据的爬取。结果如下形式:

爬虫数据.jpg
###################################完  整  代   码###############################
import requests
from bs4 import BeautifulSoup
import re
import pandas as pd

shop_name = []       # 店名
score_taste = []     # 口味得分
score_envir = []     # 环境得分
score_service = []   # 服务得分
shop_address = []    # 地址
shop_type = []       # 菜系
shop_area = []       # 商圈

for n in range(1,51):
    if n != 11:   # 由于第11页崇明县美食编码问题,无法跳过,只能不爬取第11也内容
        url = r'http://www.dianping.com/search/category/1/10/p' + str(n)
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 \
                (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36'}
        response = requests.get(url, headers=headers)  # 添加headers进行请求
        soup = BeautifulSoup(response.text, 'lxml')  # 解析response并创建BeautifulSoup对象

        # 获取店名
        name = soup.find_all('div',class_='tit')
        for k in range(len(name)):
            shop_name.append(name[k].find('h4').text)

        # 获取评分
        score = []  # 得分
        get_score = soup.find_all('span',class_='comment-list')
        for i in range(len(get_score)):
            score.append(get_score[i].find_all('b'))

        for j in range(len(score)):
            score_taste.append(re.search(r'<b>([0-9]+.[0-9]+)</b>',str(score[j][0])).group(1))
            score_envir.append(re.search(r'<b>([0-9]+.[0-9]+)</b>', str(score[j][1])).group(1))
            score_service.append(re.search(r'<b>([0-9]+.[0-9]+)</b>', str(score[j][2])).group(1))

        # 获取商圈信息
        area = soup.find_all("a", href=re.compile("/search/category/1/0"))
        for i in range(len(area)):
            shop_area.append(area[i].text)

        # 获取地址
        address = soup.find_all('span',class_='addr')
        for i in range(len(address)):
            shop_address.append(address[i].text)

        # 获取菜系
        tag = soup.find_all('div', class_='tag-addr')
        for l in range(len(tag)):
            shop_type.append(tag[l].find('span',class_='tag').text)

df = pd.DataFrame({'shop_name':shop_name,'shop_type':shop_type,\
                   'shop_area':shop_area,'shop_address':shop_address,\
                   'score_taste':score_taste,'score_envir':score_envir,\
                   'score_service':score_service})
df.to_excel(r'爬取大众点评数据.xlsx', sheet_name='Sheet1')

第二步:调用百度地图API,根据各商家地址获取经纬度信息

使用python调用百度地图API可以根据地址信息获取其经纬度信息,也可以根据其经纬度信息获取相应的地址信息等等,网上关于怎么使用百度地图API的教程很多,本步骤代码在参考他人的代码进行了修改,想要查看百度地图API更多功能和使用方法可以点击这里

import json
import requests
from bs4 import BeautifulSoup
import os
import pandas as pd

# 定义根据地址返回经纬度信息的函数
def getlcation(address):
    url = 'http://api.map.baidu.com/geocoder/v2/'
    output = 'json'
    ak = 'LP7AbMWSzHQaOT0fyR8TRp3DBGnzzPjR'
    uri = url + '?' + 'address=' + address + '&output=' + output + '&ak=' + ak
    temp = requests.get(uri)
    soup = BeautifulSoup(temp.text, 'lxml')
    my_location = json.loads(soup.find('p').text)
    lng = my_location['result']['location']['lng']   # 经度
    lat = my_location['result']['location']['lat']   # 维度
    lng_lat = [lng,lat]
    return lng_lat

# 读取爬虫数据
os.chdir(r'C:\Users\jk\Desktop\Python学习\每日一学习')
mydata = pd.read_excel(r'爬取大众点评数据.xlsx',index_col=[0], header=[0])
# print(mydata)
my_lng = []
my_lat = []
# 由于大众点评的地址信息没有上海市,为了获取经纬度信息更加准确,在前面加上上海市
for i in mydata['shop_address']:
    my_lng.append(getlcation('上海市' + i)[0])
    my_lat.append(getlcation('上海市' + i)[1])

mydata['lng'] = my_lng
mydata['lat'] = my_lat

# 将经纬度数据输出
mydata.to_excel(r'爬取大众点评数据(含经纬度).xlsx', sheet_name='Sheet1')

第三步:数据的可视化

个人认为R语言的可视化方面做的相比python更加强大,一般情况下数据的可视化也会首选R语言,本步骤主要使用R语言的REmap包进行可视化处理,该包是调用百度Echrats的图进行绘制,更多的使用方法可以点击这里

rm(list=ls())
library(readxl)
library(REmap)
setwd("C:/Users/jk/Desktop/Python学习/每日一学习")      # 设置工作目录
options(digits = 15)
df = read_excel('爬取大众点评数据(含经纬度).xlsx')     # 读取数据
geoData = df[,c('lng','lat','shop_name')]
colnames(geoData) = c('lon','lat','name')
pointData = data.frame(geoData$name)
remapB(get_city_coord("上海"),
       zoom = 13,
       color = "grayscale",
       title = "上海美食",
       markPointData = pointData,
       markPointTheme = markPointControl(symbol = 'circle',symbolSize = 5,effect = F),
       geoData = geoData)

需要注意的是,数据的格式存在部分的错误,如果不进行修改,可能首先出的结果是一片空白,如下图所示:

无显示.jpg

此时,可通过F12键查查找错误信息,我们发现,是由于部分餐厅的名称中含有 ' 符号导致,因此,我们需要对于原始数据中所有餐厅名称中包含'符号的商家进行修改,可以去掉'符号。

找出错误信息.jpg
修改符号.jpg

可视化结果

当然,我们可以定义地图显示式样,也可以根据餐厅的类型不同划分不同的颜色等等美化,敬请关注下面的文章,将会对于该结构进一步的美化,谢谢!


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

推荐阅读更多精彩内容