美文网首页Python之路python数据挖掘
上海大众点评美食数据可视化

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

作者: DT0203 | 来源:发表于2017-04-20 18:15 被阅读299次
    大众点.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

    相关文章

      网友评论

      • 繁著:请问这个数量的爬虫会被大众禁吗
      • ca5030c3d3e6:楼主有试过爬杭州或者济南的数据了吗?
        DT0203:@大宋兵部尚书 我明天看下啊
        ca5030c3d3e6:@DT0203 我在爬济南或者杭州的数据的时候,comment-list有的没有,然后数据流也不是一一对应的,很烦,不知道有木有解决方案?
        DT0203:@大宋兵部尚书 没有

      本文标题:上海大众点评美食数据可视化

      本文链接:https://www.haomeiwen.com/subject/tvilzttx.html