上海大眾點評美食數(shù)據(jù)可視化

大眾點.jpg

本文首先使用python爬取了上海市大眾點評735條數(shù)據(jù),各商戶信息來源于這里。

第一步:數(shù)據(jù)爬取

python網(wǎng)絡(luò)爬蟲功能非常的強大、便捷,這也是我一直選擇python進行爬蟲的主要原因,對于上海市大眾點評美食數(shù)據(jù),共有50頁,主要通過其鏈接后面的p1來返回不同頁的信息,如http://www.dianping.com/search/category/1/10/p1 返回第一頁的數(shù)據(jù),http://www.dianping.com/search/category/1/10/p2 返回第二頁的數(shù)據(jù),依據(jù)該原理進行數(shù)據(jù)的爬取。結(jié)果如下形式:

爬蟲數(shù)據(jù).jpg
###################################完  整  代   碼###############################
import requests
from bs4 import BeautifulSoup
import re
import pandas as pd

shop_name = []       # 店名
score_taste = []     # 口味得分
score_envir = []     # 環(huán)境得分
score_service = []   # 服務(wù)得分
shop_address = []    # 地址
shop_type = []       # 菜系
shop_area = []       # 商圈

for n in range(1,51):
    if n != 11:   # 由于第11頁崇明縣美食編碼問題,無法跳過,只能不爬取第11也內(nèi)容
        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并創(chuàng)建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'爬取大眾點評數(shù)據(jù).xlsx', sheet_name='Sheet1')

第二步:調(diào)用百度地圖API,根據(jù)各商家地址獲取經(jīng)緯度信息

使用python調(diào)用百度地圖API可以根據(jù)地址信息獲取其經(jīng)緯度信息,也可以根據(jù)其經(jīng)緯度信息獲取相應(yīng)的地址信息等等,網(wǎng)上關(guān)于怎么使用百度地圖API的教程很多,本步驟代碼在參考他人的代碼進行了修改,想要查看百度地圖API更多功能和使用方法可以點擊這里。

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

# 定義根據(jù)地址返回經(jīng)緯度信息的函數(shù)
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']   # 經(jīng)度
    lat = my_location['result']['location']['lat']   # 維度
    lng_lat = [lng,lat]
    return lng_lat

# 讀取爬蟲數(shù)據(jù)
os.chdir(r'C:\Users\jk\Desktop\Python學習\每日一學習')
mydata = pd.read_excel(r'爬取大眾點評數(shù)據(jù).xlsx',index_col=[0], header=[0])
# print(mydata)
my_lng = []
my_lat = []
# 由于大眾點評的地址信息沒有上海市,為了獲取經(jīng)緯度信息更加準確,在前面加上上海市
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

# 將經(jīng)緯度數(shù)據(jù)輸出
mydata.to_excel(r'爬取大眾點評數(shù)據(jù)(含經(jīng)緯度).xlsx', sheet_name='Sheet1')

第三步:數(shù)據(jù)的可視化

個人認為R語言的可視化方面做的相比python更加強大,一般情況下數(shù)據(jù)的可視化也會首選R語言,本步驟主要使用R語言的REmap包進行可視化處理,該包是調(diào)用百度Echrats的圖進行繪制,更多的使用方法可以點擊這里。

rm(list=ls())
library(readxl)
library(REmap)
setwd("C:/Users/jk/Desktop/Python學習/每日一學習")      # 設(shè)置工作目錄
options(digits = 15)
df = read_excel('爬取大眾點評數(shù)據(jù)(含經(jīng)緯度).xlsx')     # 讀取數(shù)據(jù)
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)

需要注意的是,數(shù)據(jù)的格式存在部分的錯誤,如果不進行修改,可能首先出的結(jié)果是一片空白,如下圖所示:

無顯示.jpg

此時,可通過F12鍵查查找錯誤信息,我們發(fā)現(xiàn),是由于部分餐廳的名稱中含有 ' 符號導致,因此,我們需要對于原始數(shù)據(jù)中所有餐廳名稱中包含'符號的商家進行修改,可以去掉'符號。

找出錯誤信息.jpg
修改符號.jpg

可視化結(jié)果

當然,我們可以定義地圖顯示式樣,也可以根據(jù)餐廳的類型不同劃分不同的顏色等等美化,敬請關(guān)注下面的文章,將會對于該結(jié)構(gòu)進一步的美化,謝謝!


可視化結(jié)果.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容