這是一份價值上千的python數據分析實戰

我個人向來很討厭標題黨的,所以事出有因,起這個標題肯定是與內容相符合的,不信你慢慢看。


目錄

分析網站

數據爬取

數據分析

後記


分析網站

昨天由於有人跟我說需要美團上美食欄目的數據,問我能不能給她弄一份,於是有了本文。

本文主要講爬取美團上不同地區的美食數據以及對它進行分析寫成一份攻略,由於疫情原因,鄙人對火鍋已經饞到無火鍋人將癲的地步,所以我們選擇廣州地區的火鍋進行獲取,小提示,url是根據不同地區更改的,比如廣州就是gz.meituan。

我們對美團網站進行分析,選擇美食,選擇火鍋,其餘條件全部,發現數據是動態獲取的,我們嘗試通過BeautifulSoup獲取script標籤內的內容試試。

html = response.content.decode()
soup = BeautifulSoup(html, 'lxml')
soup = soup.find_all('script')
print(soup)

 

通過打印我們發現了店鋪信息 

接下來的事就一氣呵成了,美團也方便,每個頁面的的url是通過數字改變的,我們通過構造url來實現換頁提取,網站上顯示100多頁,但通過實際查看發現只給出了67頁,最後爬下來的數據也就1005個,但是它給出的數據是2200多個,也就是還有1000多個數據沒有辦法獲取到,暫時不知道爲啥。

url='https://gz.meituan.com/meishi/c17/pn'
def url_list(url):  # 構建頁地址列表
    get_url_list = []
    for i in range(1, 68):
        get_url_list.append(url+'%s/'%str(i))
    return get_url_list

數據爬取

經過前面的鋪墊,一切也就準備就緒了,我們通過構造的url一個一個一個進行獲取,將數據保存到數據庫。不過卻發現歷經坎坷,我發現爬的時候會出現驗證碼,網頁403,或者ip被封的情況,我猜想它的後臺可能會對不是廣東地區的ip進行限制訪問的情況,所以我用自己的ip去獲取,加個5秒的延時,也嘗試過多線程多進程,但發現也會大機率出現錯誤,所以不要效率了,直接用時間砸,誰叫咱們閒呢,幾分鐘的事,拉個尿尿就完事!整體代碼如下

import sqlite3
import time
import requests
import json
from lxml import etree
from bs4 import BeautifulSoup

def meituan_opendb():
    conn = sqlite3.connect("meituan_date.db")
    cur = conn.execute("""create table if not exists meishi_info
    (id integer PRIMARY KEY autoincrement,
    poiId varchar(30),infourl varchar(126),
    name varchar(256),avgScore varchar(30),address varchar(256),
    allCommentNum varchar(30),avgPrice varchar(30))""")
    return cur,conn

#  往數據庫中添加內容
def meituan_insertData(poiId,infourl,name,avgScore,address,allCommentNum,avgPrice):
        hel = meituan_opendb()
        hel[1].execute("insert into meishi_info(poiId,infourl,name,avgScore,address,allCommentNum,avgPrice) values ('%s','%s','%s','%s','%s','%s','%s')"%(poiId,infourl,name,avgScore,address,allCommentNum,avgPrice))
        hel[1].commit()
        hel[1].close()

# 查詢用戶全部信息
def meituan_showAll():
    hel = meituan_opendb()
    cur = hel[1].cursor()
    cur.execute("select * from meishi_info")
    res = cur.fetchall()
    cur.close()
    return res

def url_list(url):  # 構建頁地址列表
    get_url_list = []
    for i in range(1, 68):
        get_url_list.append(url+'%s/'%str(i))
    return get_url_list
# url_list(url)
def get_url(url):  # 解析美食頁,獲取美食的名字,平均價格,平均分數, 評論數
    response = requests.get(url)
    html = response.content.decode()
    soup = BeautifulSoup(html, 'lxml')
    soup = soup.find_all('script')
    print(soup)
    text = soup[14].get_text().strip()
#         print(text)
    text = text[19:-1]
    result = json.loads(text)
#         print(result)
    results = result['poiLists']
    count=results['totalCounts']
    print('火鍋店總數爲:%s'%count)
    results = results['poiInfos']
    allinfo=[]
    for i in results:
        allinfo.append([i['poiId'],"https://gz.meituan.com/meishi/"+str(i['poiId']),i['title'], i['avgScore'], i['address'], i['allCommentNum'], i['avgPrice']])
    return allinfo  # 獲取的原數據

def main(urls):
    for url in url_list(urls):
        a = get_url(url)
#         print(a)
        for i in a:
            meituan_insertData(str(i[0]),str(i[1]),str(i[2]),str(i[3]),str(i[4]),str(i[5]),str(i[6]))
        print(url+'-----該頁完成!')
        time.sleep(5)
        
urls='https://gz.meituan.com/meishi/c17/pn'
main(urls)

數據分析

涼拌菜上完了,該上熱菜了 。獲取的數據如下。

#數據庫格式
(poiId ,infourlname ,avgScore ,address , allCommentNum ,avgPrice)
(1, '164631746', 'https://gz.meitua', '十七門重慶老火鍋', '5', '番禺區鍾村', '1874', '81')
#序號,商鋪Id,商鋪詳情地址,店名,評分,地址,評論數,平均消費

 來了,暴力分析,先看看總共多少數據。

allinfo=meituan_showAll()
print("廣州地區美團上火鍋店總共有:%s家"%len(allinfo))

廣州地區美團上火鍋店總共有:1005家

按條件分析,首先找到評分大於或等於4,評論數大於或等於2000的店家 

for i in allinfo:
   socre_4_comm_2000={}
   if float(i[4])>=4 and float(i[6])>=2000:
        socre_4_comm_2000['商家名字']=i[3]
        socre_4_comm_2000['商家地址']=i[5]
        socre_4_comm_2000['商家評分']=i[4]
        socre_4_comm_2000['商家評論數']=i[6]
        socre_4_comm_2000['平均個人消費']=i[7]
        first.append(socre_4_comm_2000)

評分大於或等於4,評論數大於或等於2000的店家共有:68家
[{'商家名字': '蒙肥羊自助餐廳(崗頂店)', '商家地址': '天河區天河路崗頂百腦匯6樓', '商家評分': '5', '商家評論數': '55190', '平均個人消費': '57'}...................]

我們去看看網站實際評論情況,看看這條件符不符合

嘿嘿,好像不錯的樣子,學生黨,我們再加個條件,消費不要那麼高,我們設置平均消費不超過50

for i in allinfo:
   socre_4_comm_2000={}
   if float(i[4])>=4 and float(i[6])>=2000 and float(i[7])<=50:
        socre_4_comm_2000['商家名字']=i[3]
        socre_4_comm_2000['商家地址']=i[5]
        socre_4_comm_2000['商家評分']=i[4]
        socre_4_comm_2000['商家評論數']=i[6]
        socre_4_comm_2000['平均個人消費']=i[7]
        first.append(socre_4_comm_2000) 

最後我們再分地區,兩個條件都試試

a=['越秀', '天河', '番禺', '海珠', '白雲', '荔灣', '黃埔', '增城', '花都', '從化', '南沙']
first=[]
j=0
while j<10:
    for i in allinfo:
        socre_4_comm_2000={}
        if float(i[4])>=4 and float(i[6])>=2000 and float(i[7])<=50 and a[j] in i[5][0:3]:
            socre_4_comm_2000['商家名字']=i[3]
            socre_4_comm_2000['商家地址']=i[5]
            socre_4_comm_2000['商家評分']=i[4]
            socre_4_comm_2000['商家評論數']=i[6]
            socre_4_comm_2000['平均個人消費']=i[7]
            first.append(socre_4_comm_2000)
    print("評分大於或等於4,評論數大於或等於2000,平均消費小於或等於50的店家在%s共有:%s家"%(a[j],len(first)))
#     print(first)
    j+=1
    first=[]

廣州地區美團上火鍋店總共有:1005家
評分大於或等於4,評論數大於或等於2000的店家越秀共有:6家
評分大於或等於4,評論數大於或等於2000的店家天河共有:23家
評分大於或等於4,評論數大於或等於2000的店家番禺共有:11家
評分大於或等於4,評論數大於或等於2000的店家海珠共有:4家
評分大於或等於4,評論數大於或等於2000的店家白雲共有:13家
評分大於或等於4,評論數大於或等於2000的店家荔灣共有:1家
評分大於或等於4,評論數大於或等於2000的店家黃埔共有:3家
評分大於或等於4,評論數大於或等於2000的店家增城共有:3家
評分大於或等於4,評論數大於或等於2000的店家花都共有:3家
評分大於或等於4,評論數大於或等於2000的店家從化共有:0家
評分大於或等於4,評論數大於或等於2000的店家南沙共有:1家


廣州地區美團上火鍋店總共有:1005家
評分大於或等於4,評論數大於或等於2000,平均消費小於或等於50的店家在越秀共有:1家
評分大於或等於4,評論數大於或等於2000,平均消費小於或等於50的店家在天河共有:9家
評分大於或等於4,評論數大於或等於2000,平均消費小於或等於50的店家在番禺共有:3家
評分大於或等於4,評論數大於或等於2000,平均消費小於或等於50的店家在海珠共有:1家
評分大於或等於4,評論數大於或等於2000,平均消費小於或等於50的店家在白雲共有:3家
評分大於或等於4,評論數大於或等於2000,平均消費小於或等於50的店家在荔灣共有:0家
評分大於或等於4,評論數大於或等於2000,平均消費小於或等於50的店家在黃埔共有:2家
評分大於或等於4,評論數大於或等於2000,平均消費小於或等於50的店家在增城共有:0家
評分大於或等於4,評論數大於或等於2000,平均消費小於或等於50的店家在花都共有:0家
評分大於或等於4,評論數大於或等於2000,平均消費小於或等於50的店家在從化共有:0家

我們打印出詳情:

廣州地區美團上火鍋店總共有:1005家
評分大於或等於4,評論數大於或等於2000,平均消費小於或等於50的店家在越秀共有:1家
[{'商家名字': '傣妹火鍋(光明廣場店)', '商家地址': '越秀區西湖路63號光明廣場L7層(地鐵6號線北京路站)', '商家評分': '4.1', '商家評論數': '3854', '平均個人消費': '45'}]

廣州地區美團上火鍋店總共有:1005家
評分大於或等於4,評論數大於或等於2000,平均消費小於或等於50的店家在天河共有:9家
[{'商家名字': '十里香牛雜煲(優創匯店)', '商家地址': '天河區迎龍路5號302室', '商家評分': '4.1', '商家評論數': '4995', '平均個人消費': '46'}...............]

最後我們統計一下適合我們的店鋪

a=['越秀', '天河', '番禺', '海珠', '白雲', '荔灣', '黃埔', '增城', '花都', '從化', '南沙']
cxk={}
first=[]
j=0
while j<10:
    for i in allinfo:
        socre_4_comm_2000={}
        if float(i[4])>=4 and float(i[6])>=2000 and float(i[7])<=50 and a[j] in i[5][0:3]:
            socre_4_comm_2000['商家名字']=i[3]
            socre_4_comm_2000['商家地址']=i[5]
            socre_4_comm_2000['商家評分']=i[4]
            socre_4_comm_2000['商家評論數']=i[6]
            socre_4_comm_2000['平均個人消費']=i[7]
            first.append(socre_4_comm_2000)
#     print("評分大於或等於4,評論數大於或等於2000,平均消費小於或等於50的店家在%s共有:%s家"%(a[j],len(first)))
#     print(first)
    cxk[a[j]]=first
    j+=1
    first=[]
print(cxk)

廣州地區美團上火鍋店總共有:1005家,條件符合的有以下幾家
{'越秀': [{'商家名字': '傣妹火鍋(光明廣場店)', '商家地址': '越秀區西湖路63號光明廣場L7層(地鐵6號線北京路站)', '商家評分': '4.1', '商家評論數': '3854', '平均個人消費': '45'}], '天河': [{'商家名字': '十里香牛雜煲(優創匯店)', '商家地址': '天河區迎龍路5號302室', '商家評分': '4.1', '商家評論數': '4995', '平均個人消費': '46'}, {'商家名字': '二郎田雞(黃村店)', '商家地址': '天河區王園路18號(近黃村路)', '商家評分': '4.3', '商家評論數': '2732', '平均個人消費': '49'}, {'商家名字': '滿漢三汁燜鍋(天娛廣場店)', '商家地址': '天河區天河路621-625號天娛廣場B1樓', '商家評分': '4.2', '商家評論數': '7958', '平均個人消費': '27'}, {'商家名字': '聚福豬肚雞(車陂店)', '商家地址': '天河區中山大道車陂路雅景大廣場6號101A房', '商家評分': '4.9', '商家評論數': '4094', '平均個人消費': '48'}, {'商家名字': '黑山牛肉湯火鍋(花城匯店)', '商家地址': '天河區花城大道89號花城匯南區B1層C06b(漢堡王旁)', '商家評分': '4.4', '商家評論數': '2938', '平均個人消費': '35'}, {'商家名字': '一香一甜韓國年糕火鍋(小長今韓國料理)', '商家地址': '天河區天河路299號時尚天河商業廣場東區東三街B1層039-041號鋪', '商家評分': '5', '商家評論數': '2511', '平均個人消費': '44'}, {'商家名字': '上上籤串串香(時尚天河商業廣場店)', '商家地址': '天河區天河路299號時尚天河商業購物廣場中區中C001', '商家評分': '4.1', '商家評論數': '2719', '平均個人消費': '13'}, {'商家名字': '重慶雞公煲(車陂老店)', '商家地址': '天河區中山大道中6號A6(加悅大廈旁)', '商家評分': '4.1', '商家評論數': '4818', '平均個人消費': '42'}, {'商家名字': '淼福豬肚雞(長興直營店)', '商家地址': '天河區西街六巷長興高德匯後面(停車場東門,萬州烤魚隔壁)', '商家評分': '4.1', '商家評論數': '2497', '平均個人消費': '44'}], '番禺': [{'商家名字': '淼福豬肚雞(華僑城店)', '商家地址': '番禺區西麗南路237號(近華僑城公交站)', '商家評分': '4.5', '商家評論數': '9927', '平均個人消費': '48'}, {'商家名字': '南北和·自助火鍋(番禺大石店)', '商家地址': '番禺區105國道大石段249-252號二樓(大石橋南公交車站旁)', '商家評分': '4.5', '商家評論數': '15080', '平均個人消費': '48'}, {'商家名字': '煲煲哥·招牌奇味雞煲(洛溪店)', '商家地址': '番禺區吉祥南街30號百佳超市旁', '商家評分': '4.6', '商家評論數': '2203', '平均個人消費': '35'}], '海珠': [{'商家名字': '湯響自助迴轉火鍋百匯(樂峯廣場店)', '商家地址': '海珠區工業大道北106-108號樂峯廣場2層', '商家評分': '4.5', '商家評論數': '2892', '平均個人消費': '41'}], '白雲': [{'商家名字': '名揚煮藝肥牛自助火鍋(花園路店)', '商家地址': '白雲區新市花園路卡爾文大酒店旁(即阿曼尼酒吧對面)', '商家評分': '4.5', '商家評論數': '4648', '平均個人消費': '47'}, {'商家名字': '名揚煮藝肥牛自助火鍋(連元橋店)', '商家地址': '白雲區白雲東街電商大廈一樓(連元大廈金博KTV後面)', '商家評分': '4.5', '商家評論數': '5293', '平均個人消費': '47'}, {'商家名字': '淼鑫豬肚雞(江夏店)', '商家地址': '白雲區江夏東路3號尚龍大廈一樓(江夏地鐵B出口旁,7天酒店旁)', '商家評分': '4.1', '商家評論數': '2997', '平均個人消費': '50'}], '荔灣': [], '黃埔': [{'商家名字': '牛香薈祕製牛雜', '商家地址': '黃埔區港灣路大沙地港灣西港灣大院(地鐵站五號線大沙地站C出口正對面,中國建設銀行側面,遇見麼麼茶隔壁)', '商家評分': '4', '商家評論數': '3390', '平均個人消費': '46'}, {'商家名字': '楊國福麻辣燙(東區店)', '商家地址': '黃埔區東區時代城南門對面(華萊士隔壁)', '商家評分': '4', '商家評論數': '3142', '平均個人消費': '15'}], '增城': [], '花都': [], '從化': []}

總共19家,一家50,總共950,嘿嘿,喫完近千元,還是最低預算,想想就算了,肉疼,但是這些店裏去過一家,確實不錯。 

for i in cxk.values():
    try:
        for j in i:
            print(j['商家名字'])
    except:
        continue

傣妹火鍋(光明廣場店)
十里香牛雜煲(優創匯店)
二郎田雞(黃村店)
滿漢三汁燜鍋(天娛廣場店)
聚福豬肚雞(車陂店)
黑山牛肉湯火鍋(花城匯店)
一香一甜韓國年糕火鍋(小長今韓國料理)
上上籤串串香(時尚天河商業廣場店)
重慶雞公煲(車陂老店)
淼福豬肚雞(長興直營店)
淼福豬肚雞(華僑城店)
南北和·自助火鍋(番禺大石店)
煲煲哥·招牌奇味雞煲(洛溪店)
湯響自助迴轉火鍋百匯(樂峯廣場店)
名揚煮藝肥牛自助火鍋(花園路店)
名揚煮藝肥牛自助火鍋(連元橋店)
淼鑫豬肚雞(江夏店)
牛香薈祕製牛雜
楊國福麻辣燙(東區店)

後記

有心無力的操作,邊分析邊哭,是什麼抑制了我的想象,是錢啊!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章